@open-mercato/core 0.4.2-canary-d0a025141f → 0.4.2-canary-3efa759f5c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/generated/entities.ids.generated.js +0 -1
  2. package/dist/generated/entities.ids.generated.js.map +2 -2
  3. package/dist/generated/entity-fields-registry.js +0 -2
  4. package/dist/generated/entity-fields-registry.js.map +2 -2
  5. package/dist/modules/business_rules/data/validators.js +0 -34
  6. package/dist/modules/business_rules/data/validators.js.map +2 -2
  7. package/dist/modules/business_rules/index.js +1 -21
  8. package/dist/modules/business_rules/index.js.map +2 -2
  9. package/dist/modules/business_rules/lib/rule-engine.js +1 -182
  10. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  11. package/dist/modules/sales/acl.js +0 -1
  12. package/dist/modules/sales/acl.js.map +2 -2
  13. package/dist/modules/sales/backend/sales/documents/[id]/page.js +0 -12
  14. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  15. package/dist/modules/sales/commands/documents.js +0 -62
  16. package/dist/modules/sales/commands/documents.js.map +2 -2
  17. package/dist/modules/sales/lib/dictionaries.js +0 -3
  18. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  19. package/dist/modules/workflows/acl.js +0 -2
  20. package/dist/modules/workflows/acl.js.map +2 -2
  21. package/dist/modules/workflows/api/instances/route.js +6 -18
  22. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  23. package/dist/modules/workflows/api/tasks/route.js +1 -6
  24. package/dist/modules/workflows/api/tasks/route.js.map +2 -2
  25. package/dist/modules/workflows/backend/definitions/[id]/page.js +1 -9
  26. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  27. package/dist/modules/workflows/backend/definitions/[id]/page.meta.js +1 -1
  28. package/dist/modules/workflows/backend/definitions/[id]/page.meta.js.map +2 -2
  29. package/dist/modules/workflows/backend/definitions/create/page.js +15 -24
  30. package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
  31. package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
  32. package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
  33. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +132 -150
  34. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  35. package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js +1 -1
  36. package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js.map +2 -2
  37. package/dist/modules/workflows/backend/events/[id]/page.js +1 -1
  38. package/dist/modules/workflows/backend/events/[id]/page.js.map +2 -2
  39. package/dist/modules/workflows/backend/events/[id]/page.meta.js +2 -2
  40. package/dist/modules/workflows/backend/events/[id]/page.meta.js.map +2 -2
  41. package/dist/modules/workflows/backend/instances/[id]/page.meta.js +2 -2
  42. package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +2 -2
  43. package/dist/modules/workflows/backend/tasks/[id]/page.js +1 -1
  44. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  45. package/dist/modules/workflows/backend/tasks/[id]/page.meta.js +2 -2
  46. package/dist/modules/workflows/backend/tasks/[id]/page.meta.js.map +2 -2
  47. package/dist/modules/workflows/backend/tasks/page.js +6 -5
  48. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  49. package/dist/modules/workflows/cli.js +3 -81
  50. package/dist/modules/workflows/cli.js.map +3 -3
  51. package/dist/modules/workflows/data/entities.js +1 -64
  52. package/dist/modules/workflows/data/entities.js.map +2 -2
  53. package/dist/modules/workflows/data/validators.js +0 -115
  54. package/dist/modules/workflows/data/validators.js.map +2 -2
  55. package/dist/modules/workflows/examples/checkout-demo-definition.json +5 -1
  56. package/dist/modules/workflows/lib/activity-executor.js +13 -75
  57. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  58. package/dist/modules/workflows/lib/graph-utils.js +2 -71
  59. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  60. package/dist/modules/workflows/lib/seeds.js +5 -22
  61. package/dist/modules/workflows/lib/seeds.js.map +2 -2
  62. package/dist/modules/workflows/lib/start-validator.js +23 -33
  63. package/dist/modules/workflows/lib/start-validator.js.map +2 -2
  64. package/dist/modules/workflows/lib/transition-handler.js +45 -157
  65. package/dist/modules/workflows/lib/transition-handler.js.map +3 -3
  66. package/generated/entities.ids.generated.ts +0 -1
  67. package/generated/entity-fields-registry.ts +0 -2
  68. package/package.json +2 -2
  69. package/src/modules/business_rules/data/validators.ts +0 -40
  70. package/src/modules/business_rules/index.ts +0 -25
  71. package/src/modules/business_rules/lib/rule-engine.ts +1 -281
  72. package/src/modules/sales/acl.ts +0 -1
  73. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +0 -16
  74. package/src/modules/sales/commands/documents.ts +1 -74
  75. package/src/modules/sales/lib/dictionaries.ts +0 -3
  76. package/src/modules/workflows/acl.ts +0 -2
  77. package/src/modules/workflows/api/__tests__/instances.route.test.ts +2 -5
  78. package/src/modules/workflows/api/instances/route.ts +7 -21
  79. package/src/modules/workflows/api/tasks/route.ts +1 -7
  80. package/src/modules/workflows/backend/definitions/[id]/page.meta.ts +1 -1
  81. package/src/modules/workflows/backend/definitions/[id]/page.tsx +0 -9
  82. package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
  83. package/src/modules/workflows/backend/definitions/create/page.tsx +0 -9
  84. package/src/modules/workflows/backend/definitions/visual-editor/page.meta.ts +1 -1
  85. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3 -21
  86. package/src/modules/workflows/backend/events/[id]/page.meta.ts +2 -2
  87. package/src/modules/workflows/backend/events/[id]/page.tsx +1 -1
  88. package/src/modules/workflows/backend/instances/[id]/page.meta.ts +2 -2
  89. package/src/modules/workflows/backend/tasks/[id]/page.meta.ts +2 -2
  90. package/src/modules/workflows/backend/tasks/[id]/page.tsx +1 -1
  91. package/src/modules/workflows/backend/tasks/page.tsx +6 -5
  92. package/src/modules/workflows/cli.ts +0 -111
  93. package/src/modules/workflows/data/entities.ts +0 -124
  94. package/src/modules/workflows/data/validators.ts +0 -138
  95. package/src/modules/workflows/examples/checkout-demo-definition.json +5 -1
  96. package/src/modules/workflows/i18n/en.json +0 -71
  97. package/src/modules/workflows/lib/__tests__/activity-executor.test.ts +36 -43
  98. package/src/modules/workflows/lib/__tests__/transition-handler.test.ts +90 -170
  99. package/src/modules/workflows/lib/activity-executor.ts +16 -129
  100. package/src/modules/workflows/lib/graph-utils.ts +2 -117
  101. package/src/modules/workflows/lib/seeds.ts +8 -34
  102. package/src/modules/workflows/lib/start-validator.ts +28 -38
  103. package/src/modules/workflows/lib/transition-handler.ts +55 -208
  104. package/dist/generated/entities/workflow_event_trigger/index.js +0 -33
  105. package/dist/generated/entities/workflow_event_trigger/index.js.map +0 -7
  106. package/dist/modules/auth/events.js +0 -30
  107. package/dist/modules/auth/events.js.map +0 -7
  108. package/dist/modules/business_rules/api/execute/[ruleId]/route.js +0 -145
  109. package/dist/modules/business_rules/api/execute/[ruleId]/route.js.map +0 -7
  110. package/dist/modules/catalog/events.js +0 -34
  111. package/dist/modules/catalog/events.js.map +0 -7
  112. package/dist/modules/customers/events.js +0 -49
  113. package/dist/modules/customers/events.js.map +0 -7
  114. package/dist/modules/directory/events.js +0 -23
  115. package/dist/modules/directory/events.js.map +0 -7
  116. package/dist/modules/sales/events.js +0 -63
  117. package/dist/modules/sales/events.js.map +0 -7
  118. package/dist/modules/sales/lib/frontend/documentDataEvents.js +0 -25
  119. package/dist/modules/sales/lib/frontend/documentDataEvents.js.map +0 -7
  120. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +0 -481
  121. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +0 -7
  122. package/dist/modules/workflows/components/EventTriggersEditor.js +0 -553
  123. package/dist/modules/workflows/components/EventTriggersEditor.js.map +0 -7
  124. package/dist/modules/workflows/events.js +0 -38
  125. package/dist/modules/workflows/events.js.map +0 -7
  126. package/dist/modules/workflows/examples/order-approval-definition.json +0 -257
  127. package/dist/modules/workflows/examples/order-approval-guard-rules.json +0 -32
  128. package/dist/modules/workflows/lib/event-trigger-service.js +0 -308
  129. package/dist/modules/workflows/lib/event-trigger-service.js.map +0 -7
  130. package/dist/modules/workflows/migrations/Migration20260123143500.js +0 -36
  131. package/dist/modules/workflows/migrations/Migration20260123143500.js.map +0 -7
  132. package/dist/modules/workflows/subscribers/event-trigger.js +0 -78
  133. package/dist/modules/workflows/subscribers/event-trigger.js.map +0 -7
  134. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +0 -323
  135. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +0 -7
  136. package/dist/modules/workflows/widgets/injection/order-approval/widget.js +0 -17
  137. package/dist/modules/workflows/widgets/injection/order-approval/widget.js.map +0 -7
  138. package/dist/modules/workflows/widgets/injection-table.js +0 -19
  139. package/dist/modules/workflows/widgets/injection-table.js.map +0 -7
  140. package/generated/entities/workflow_event_trigger/index.ts +0 -15
  141. package/src/modules/auth/events.ts +0 -39
  142. package/src/modules/business_rules/api/execute/[ruleId]/route.ts +0 -163
  143. package/src/modules/catalog/events.ts +0 -45
  144. package/src/modules/customers/events.ts +0 -63
  145. package/src/modules/directory/events.ts +0 -31
  146. package/src/modules/sales/events.ts +0 -82
  147. package/src/modules/sales/lib/frontend/documentDataEvents.ts +0 -28
  148. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +0 -581
  149. package/src/modules/workflows/components/EventTriggersEditor.tsx +0 -664
  150. package/src/modules/workflows/events.ts +0 -49
  151. package/src/modules/workflows/examples/order-approval-definition.json +0 -257
  152. package/src/modules/workflows/examples/order-approval-guard-rules.json +0 -32
  153. package/src/modules/workflows/lib/event-trigger-service.ts +0 -557
  154. package/src/modules/workflows/migrations/Migration20260123143500.ts +0 -38
  155. package/src/modules/workflows/subscribers/event-trigger.ts +0 -109
  156. package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +0 -446
  157. package/src/modules/workflows/widgets/injection/order-approval/widget.ts +0 -16
  158. package/src/modules/workflows/widgets/injection-table.ts +0 -21
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/sales/backend/sales/documents/%5Bid%5D/page.tsx"],
4
- "sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams, useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport {\n CustomDataSection,\n DetailFieldsSection,\n ErrorMessage,\n InlineTextEditor,\n LoadingMessage,\n TabEmptyState,\n TagsSection,\n type TagOption,\n} from '@open-mercato/ui/backend/detail'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Building2, CreditCard, Mail, Pencil, Plus, Store, Trash2, Truck, UserRound, Wand2, X } from 'lucide-react'\nimport Link from 'next/link'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { DocumentCustomerCard } from '@open-mercato/core/modules/sales/components/DocumentCustomerCard'\nimport { SalesDocumentAddressesSection } from '@open-mercato/core/modules/sales/components/documents/AddressesSection'\nimport { SalesDocumentItemsSection } from '@open-mercato/core/modules/sales/components/documents/ItemsSection'\nimport { SalesDocumentPaymentsSection } from '@open-mercato/core/modules/sales/components/documents/PaymentsSection'\nimport { SalesDocumentAdjustmentsSection } from '@open-mercato/core/modules/sales/components/documents/AdjustmentsSection'\nimport type { AdjustmentRowData } from '@open-mercato/core/modules/sales/components/documents/AdjustmentDialog'\nimport { SalesShipmentsSection } from '@open-mercato/core/modules/sales/components/documents/ShipmentsSection'\nimport { DocumentTotals } from '@open-mercato/core/modules/sales/components/documents/DocumentTotals'\nimport { E } from '#generated/entities.ids.generated'\nimport type { DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport type { SalesAdjustmentKind } from '@open-mercato/core/modules/sales/data/entities'\nimport { DictionaryValue, createDictionaryMap, renderDictionaryColor, renderDictionaryIcon, type DictionaryMap } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { DictionaryEntrySelect } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { NotesSection, mapCommentSummary, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport {\n subscribeSalesDocumentDataRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentDataEvents'\nimport type { CommentSummary, SectionAction } from '@open-mercato/ui/backend/detail'\nimport { ICON_SUGGESTIONS } from '@open-mercato/core/modules/customers/lib/dictionaries'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '@open-mercato/core/modules/customers/lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\n\nfunction CurrencyInlineEditor({\n label,\n value,\n options,\n labels,\n emptyLabel,\n onSave,\n error,\n onClearError,\n locked,\n onLocked,\n}: {\n label: string\n value: string | null | undefined\n options: { value: string; label: string; color?: string | null; icon?: string | null }[]\n labels: DictionarySelectLabels\n emptyLabel: string\n onSave: (next: string | null) => Promise<void>\n error: string | null\n onClearError: () => void\n locked?: boolean\n onLocked?: () => void\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const normalizedValue = React.useMemo(() => (typeof value === 'string' ? value.toUpperCase() : undefined), [value])\n const [draft, setDraft] = React.useState<string | undefined>(normalizedValue)\n const [saving, setSaving] = React.useState(false)\n const appearanceMap = React.useMemo(\n () =>\n createDictionaryMap(\n options.map((option) => ({\n value: option.value.toUpperCase(),\n label: option.label,\n color: option.color ?? undefined,\n icon: option.icon ?? undefined,\n }))\n ),\n [options]\n )\n\n React.useEffect(() => {\n if (!editing) setDraft(normalizedValue)\n }, [editing, normalizedValue])\n\n React.useEffect(() => {\n if (locked && editing) {\n setEditing(false)\n }\n }, [editing, locked])\n\n const fetchOptions = React.useCallback(async () => options, [options])\n\n const handleLocked = React.useCallback(() => {\n if (onLocked) onLocked()\n }, [onLocked])\n\n const handleActivate = React.useCallback(() => {\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (!editing) {\n setEditing(true)\n }\n }, [editing, handleLocked, locked, onClearError])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n try {\n onClearError()\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n console.error('sales.documents.currency.save', err)\n } finally {\n setSaving(false)\n }\n }, [draft, onClearError, onSave])\n\n return (\n <div\n className={cn(\n 'group rounded-lg border bg-card p-4',\n !editing ? 'cursor-pointer' : null,\n locked ? 'cursor-not-allowed opacity-80' : null\n )}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n onClearError()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) {\n void handleSave()\n }\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ? next.toUpperCase() : undefined)}\n fetchOptions={fetchOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={labels}\n />\n <DictionaryValue\n value={draft ?? normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n onClearError()\n setEditing(false)\n setDraft(value ?? undefined)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <DictionaryValue\n value={normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"mt-1 inline-flex items-center gap-2 text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (editing) {\n onClearError()\n setDraft(value ?? undefined)\n }\n setEditing((prev) => !prev)\n }}\n aria-disabled={locked ? true : undefined}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype SnapshotDraft = {\n displayName: string\n kind: 'company' | 'person'\n primaryEmail: string\n primaryPhone: string\n firstName: string\n lastName: string\n legalName: string\n}\n\nfunction createSnapshotDraft(\n snapshot: CustomerSnapshot | null,\n fallbackName: string | null,\n fallbackEmail: string | null,\n): SnapshotDraft {\n const customer = snapshot?.customer ?? null\n const personProfile = customer?.personProfile ?? snapshot?.contact ?? null\n const companyProfile = customer?.companyProfile ?? null\n const resolvedKind: 'company' | 'person' =\n customer?.kind === 'person' || snapshot?.contact ? 'person' : 'company'\n return {\n displayName:\n (customer?.displayName && customer.displayName.trim()) ||\n (fallbackName && fallbackName.trim()) ||\n '',\n kind: resolvedKind,\n primaryEmail:\n (customer?.primaryEmail && customer.primaryEmail.trim()) ||\n (fallbackEmail && fallbackEmail.trim()) ||\n '',\n primaryPhone: (customer?.primaryPhone && customer.primaryPhone.trim()) || '',\n firstName: (personProfile?.firstName && personProfile.firstName.trim()) || '',\n lastName: (personProfile?.lastName && personProfile.lastName.trim()) || '',\n legalName: (companyProfile?.legalName && companyProfile.legalName.trim()) || '',\n }\n}\n\nfunction CustomerInlineEditor({\n label,\n customerId,\n customerName,\n customerEmail,\n customerSnapshot,\n customers,\n customerLoading,\n onLoadCustomers,\n fetchCustomerEmail,\n onSave,\n onSaveSnapshot,\n saving,\n error,\n guardMessage,\n onClearError,\n}: {\n label: string\n customerId: string | null\n customerName: string | null\n customerEmail: string | null | undefined\n customerSnapshot: CustomerSnapshot | null\n customers: CustomerOption[]\n customerLoading: boolean\n onLoadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n onSave: (id: string | null, email: string | null) => Promise<void>\n onSaveSnapshot: (snapshot: CustomerSnapshot) => Promise<void>\n saving: boolean\n error: string | null\n guardMessage?: string | null\n onClearError: () => void\n}) {\n const t = useT()\n const [mode, setMode] = React.useState<'select' | 'snapshot' | null>(null)\n const [draftId, setDraftId] = React.useState<string | null>(customerId)\n const [draftEmail, setDraftEmail] = React.useState<string | null>(customerEmail ?? null)\n const [snapshotDraft, setSnapshotDraft] = React.useState<SnapshotDraft>(() =>\n createSnapshotDraft(customerSnapshot, customerName, customerEmail ?? null),\n )\n const selectedRef = React.useRef<string | null>(customerId)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n\n const currentLabel = React.useMemo(() => {\n if (customerName && customerName.trim().length) return customerName\n const match = customers.find((entry) => entry.id === customerId)\n return match?.label ?? null\n }, [customerId, customerName, customers])\n\n React.useEffect(() => {\n selectedRef.current = draftId\n }, [draftId])\n\n React.useEffect(() => {\n if (mode !== 'select') {\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n onClearError()\n }\n }, [customerEmail, customerId, mode, onClearError])\n\n React.useEffect(() => {\n if (mode !== 'snapshot') {\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }\n }, [customerEmail, customerSnapshot, currentLabel, mode])\n\n React.useEffect(() => {\n if (mode !== 'select') return\n const labelValue = currentLabel\n if (labelValue && customerQuerySetter.current) {\n customerQuerySetter.current(labelValue)\n }\n void onLoadCustomers(labelValue ?? undefined)\n }, [currentLabel, mode, onLoadCustomers])\n\n const handleSelectActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('select')\n void onLoadCustomers()\n }, [guardMessage, onClearError, onLoadCustomers])\n\n const handleSnapshotActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('snapshot')\n }, [guardMessage, onClearError])\n\n const handleCancel = React.useCallback(() => {\n onClearError()\n setMode(null)\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }, [customerEmail, customerId, customerSnapshot, currentLabel, onClearError])\n\n const buildSnapshotPayload = React.useCallback((): CustomerSnapshot => {\n const kind = snapshotDraft.kind\n const displayNameRaw = snapshotDraft.displayName.trim()\n const primaryEmailRaw = snapshotDraft.primaryEmail.trim()\n const primaryPhoneRaw = snapshotDraft.primaryPhone.trim()\n const firstNameRaw = snapshotDraft.firstName.trim()\n const lastNameRaw = snapshotDraft.lastName.trim()\n const legalNameRaw = snapshotDraft.legalName.trim()\n const nameFromParts =\n kind === 'person'\n ? [firstNameRaw, lastNameRaw].filter((value) => value.length).join(' ').trim()\n : legalNameRaw\n const resolvedDisplayName = displayNameRaw || nameFromParts || null\n const baseCustomer = customerSnapshot?.customer ?? {}\n const nextPersonProfile =\n kind === 'person'\n ? {\n ...(baseCustomer.personProfile ?? customerSnapshot?.contact ?? {}),\n firstName: firstNameRaw || null,\n lastName: lastNameRaw || null,\n }\n : null\n const nextCompanyProfile =\n kind === 'company'\n ? { ...(baseCustomer.companyProfile ?? {}), legalName: legalNameRaw || null }\n : null\n return {\n ...(customerSnapshot ?? {}),\n customer: {\n ...baseCustomer,\n kind,\n displayName: resolvedDisplayName,\n primaryEmail: primaryEmailRaw || null,\n primaryPhone: primaryPhoneRaw || null,\n personProfile: nextPersonProfile,\n companyProfile: nextCompanyProfile,\n },\n contact: customerSnapshot?.contact ?? null,\n }\n }, [customerSnapshot, snapshotDraft])\n\n const handleSaveSelection = React.useCallback(async () => {\n try {\n onClearError()\n await onSave(draftId, draftEmail)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.save', err)\n }\n }, [draftEmail, draftId, onClearError, onSave])\n\n const handleSaveSnapshot = React.useCallback(async () => {\n try {\n onClearError()\n const payload = buildSnapshotPayload()\n await onSaveSnapshot(payload)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.snapshot.save', err)\n }\n }, [buildSnapshotPayload, onClearError, onSaveSnapshot])\n\n if (mode === 'select') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSelection()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0 space-y-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <LookupSelect\n value={draftId}\n onChange={(next) => {\n setDraftId(next)\n setDraftEmail(null)\n selectedRef.current = next\n if (!next) return\n const match = customers.find((entry) => entry.id === next)\n if (match?.primaryEmail) {\n setDraftEmail(match.primaryEmail)\n } else {\n const selectedId = next\n fetchCustomerEmail(selectedId, match?.kind)\n .then((resolved) => {\n if (resolved && selectedRef.current === selectedId) setDraftEmail(resolved)\n })\n .catch(() => {})\n }\n }}\n fetchItems={async (query) => {\n const options = await onLoadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) =>\n t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })\n }\n />\n {customerLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n </p>\n ) : null}\n {draftEmail ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"truncate\">{draftEmail}</span>\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSelection()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n }\n\n if (mode === 'snapshot') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSnapshot()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.detail.customerSnapshot.hint', 'Edit the snapshot stored on this document.')}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"mt-3 space-y-3\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.displayName.label', 'Display name')}\n </label>\n <Input\n value={snapshotDraft.displayName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, displayName: event.target.value }))}\n placeholder={t('customers.people.form.displayName.placeholder', 'Enter display name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('sales.documents.detail.customerSnapshot.kind', 'Customer type')}\n </label>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'company' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'company' }))}\n >\n {t('customers.widgets.newCustomers.kind.company', 'Company')}\n </Button>\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'person' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'person' }))}\n >\n {t('customers.widgets.newCustomers.kind.person', 'Person')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryEmail', 'Primary email')}\n </label>\n <Input\n type=\"email\"\n value={snapshotDraft.primaryEmail}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryEmail: event.target.value }))}\n placeholder={t('customers.people.form.primaryEmailPlaceholder', 'name@example.com')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryPhone', 'Primary phone')}\n </label>\n <Input\n type=\"tel\"\n value={snapshotDraft.primaryPhone}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryPhone: event.target.value }))}\n placeholder={t('customers.people.form.primaryPhonePlaceholder', '+00 000 000 000')}\n />\n </div>\n </div>\n\n {snapshotDraft.kind === 'person' ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.firstName', 'First name')}\n </label>\n <Input\n value={snapshotDraft.firstName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, firstName: event.target.value }))}\n placeholder={t('customers.people.form.firstName', 'First name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.lastName', 'Last name')}\n </label>\n <Input\n value={snapshotDraft.lastName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, lastName: event.target.value }))}\n placeholder={t('customers.people.form.lastName', 'Last name')}\n />\n </div>\n </div>\n ) : (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.companies.detail.fields.legalName', 'Legal name')}\n </label>\n <Input\n value={snapshotDraft.legalName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, legalName: event.target.value }))}\n placeholder={t('customers.companies.detail.fields.legalNamePlaceholder', 'Add legal name')}\n />\n </div>\n )}\n\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSnapshot()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <DocumentCustomerCard\n label={label}\n name={customerName ?? null}\n email={customerEmail ?? undefined}\n kind={customerSnapshot?.customer?.kind === 'person' ? 'person' : 'company'}\n className=\"h-full\"\n onEditSnapshot={handleSnapshotActivate}\n onSelectCustomer={handleSelectActivate}\n />\n )\n}\n\ntype CustomerSnapshot = {\n customer?: {\n id?: string | null\n kind?: 'person' | 'company' | null\n displayName?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n personProfile?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n companyProfile?: {\n id?: string | null\n legalName?: string | null\n brandName?: string | null\n domain?: string | null\n websiteUrl?: string | null\n } | null\n } | null\n contact?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype AddressSnapshot = {\n name?: string | null\n companyName?: string | null\n addressLine1?: string | null\n addressLine2?: string | null\n city?: string | null\n region?: string | null\n postalCode?: string | null\n country?: string | null\n}\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = {\n id: string\n label: string\n}\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n carrierCode?: string | null\n serviceLevel?: string | null\n estimatedTransitDays?: number | null\n currencyCode?: string | null\n baseRateNet?: string | null\n baseRateGross?: string | null\n providerKey?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n providerKey?: string | null\n terms?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\ntype DocumentRecord = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n statusEntryId?: string | null\n currencyCode?: string | null\n customerEntityId?: string | null\n billingAddressId?: string | null\n shippingAddressId?: string | null\n customerReference?: string | null\n externalReference?: string | null\n channelId?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n customerSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n channelCode?: string | null\n comment?: string | null\n subtotalNetAmount?: number | null\n subtotalGrossAmount?: number | null\n discountTotalAmount?: number | null\n taxTotalAmount?: number | null\n shippingNetAmount?: number | null\n shippingGrossAmount?: number | null\n surchargeTotalAmount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n createdAt?: string\n updatedAt?: string\n metadata?: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n tags?: TagOption[] | null\n}\n\ntype DocumentUpdateResult = {\n externalReference?: string | null\n customerReference?: string | null\n comment?: string | null\n currencyCode?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n statusEntryId?: string | null\n status?: string | null\n channelId?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.filter((entry) => entry !== undefined)\n }\n if (value === undefined) return null\n return value\n}\n\nconst prefixCustomFieldValues = (input: Record<string, unknown> | null | undefined): Record<string, unknown> => {\n if (!input || typeof input !== 'object') return {}\n return Object.entries(input).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const normalized = key.startsWith('cf_') ? key : `cf_${key}`\n acc[normalized] = value\n return acc\n }, {})\n}\n\nconst resolveLineItemCount = (record: unknown): number | null => {\n if (!record || typeof record !== 'object') return null\n const current = (record as any).lineItemCount ?? (record as any).line_item_count\n if (typeof current !== 'number') return null\n return Number.isFinite(current) ? current : null\n}\n\nasync function fetchDocument(id: string, kind: 'order' | 'quote', errorMessage: string): Promise<DocumentRecord | null> {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const payload = await readApiResultOrThrow<{ items?: DocumentRecord[] }>(\n `/api/sales/${kind === 'order' ? 'orders' : 'quotes'}?${params.toString()}`,\n undefined,\n { errorMessage }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.length ? (items[0] as DocumentRecord) : null\n}\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const displayName =\n typeof snapshot.customer?.displayName === 'string' && snapshot.customer.displayName.trim().length\n ? snapshot.customer.displayName.trim()\n : null\n if (displayName) return displayName\n const contact = snapshot.contact ?? null\n const personProfile = snapshot.customer?.personProfile ?? null\n const preferred =\n (contact?.preferredName && contact.preferredName.trim()) ||\n (personProfile?.preferredName && personProfile.preferredName.trim()) ||\n null\n const firstName =\n (contact?.firstName && contact.firstName.trim()) ||\n (personProfile?.firstName && personProfile.firstName.trim()) ||\n null\n const lastName =\n (contact?.lastName && contact.lastName.trim()) ||\n (personProfile?.lastName && personProfile.lastName.trim()) ||\n null\n const parts = [preferred ?? firstName, lastName].filter((part) => part && part.length)\n if (parts.length) return parts.join(' ')\n const legalName =\n (snapshot.customer?.companyProfile?.legalName &&\n snapshot.customer.companyProfile.legalName.trim()) ||\n null\n if (legalName) return legalName\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n const primary =\n (snapshot.customer?.primaryEmail && snapshot.customer.primaryEmail.trim()) ||\n null\n if (primary) return primary\n return null\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction SectionCard({\n title,\n action,\n children,\n muted,\n}: {\n title: string\n action?: React.ReactNode\n children: React.ReactNode\n muted?: boolean\n}) {\n return (\n <div className={cn('rounded border p-4', muted ? 'bg-muted/30' : 'bg-card')}>\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{title}</p>\n {action}\n </div>\n {children}\n </div>\n )\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction ContactEmailInlineEditor({\n label,\n value,\n placeholder,\n emptyLabel,\n onSave,\n renderDisplay,\n recordId,\n}: {\n label: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel: string\n renderDisplay: (params: { value: string | null | undefined; emptyLabel: string }) => React.ReactNode\n onSave: (next: string | null) => Promise<void>\n recordId?: string | null\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState(value ?? '')\n const [error, setError] = React.useState<string | null>(null)\n const [saving, setSaving] = React.useState(false)\n const trimmedDraft = React.useMemo(() => draft.trim(), [draft])\n const isValidEmail = React.useMemo(() => {\n if (!trimmedDraft.length) return true\n return EMAIL_REGEX.test(trimmedDraft)\n }, [trimmedDraft])\n const { duplicate, checking } = useEmailDuplicateCheck(draft, {\n recordId: typeof recordId === 'string' ? recordId : null,\n disabled: !editing || !!error || saving || !trimmedDraft.length || !isValidEmail,\n matchMode: 'prefix',\n })\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? '')\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const normalized = trimmedDraft.length ? trimmedDraft : ''\n if (normalized.length && !EMAIL_REGEX.test(normalized)) {\n setError(t('customers.people.detail.inline.emailInvalid', 'Enter a valid email address.'))\n return\n }\n setError(null)\n setSaving(true)\n try {\n await onSave(normalized.length ? normalized : null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.people.detail.inline.error', 'Failed to save value.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [onSave, t, trimmedDraft])\n\n const interactiveProps =\n !editing && !saving\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: () => setEditing(true),\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n }\n },\n }\n : {}\n\n return (\n <div className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" {...interactiveProps}>\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <form\n className=\"mt-2 space-y-2\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!saving) void handleSave()\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n className=\"w-full rounded-md border pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n value={draft}\n onChange={(event) => {\n if (error) setError(null)\n setDraft(event.target.value)\n }}\n placeholder={placeholder}\n type=\"email\"\n autoFocus\n spellCheck={false}\n />\n </div>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n {!error && duplicate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.people.detail.inline.emailDuplicate', undefined, { name: duplicate.displayName })}{' '}\n <Link\n className=\"font-medium text-primary underline underline-offset-2\"\n href={`/backend/customers/people/${duplicate.id}`}\n >\n {t('customers.people.detail.inline.emailDuplicateLink')}\n </Link>\n </p>\n ) : null}\n {!error && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.detail.inline.emailChecking')}</p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? '')\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"mt-1\">{renderDisplay({ value, emptyLabel })}</div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? '')\n setError(null)\n }\n setEditing((prev) => !prev)\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n disabled={saving}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction ChannelInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: ChannelOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<ChannelOption[]>\n onSave: (next: string | null) => Promise<void>\n saveLabel: string\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const current = React.useMemo(\n () => (draft ?? value ? options.find((opt) => opt.id === (draft ?? value)) ?? null : null),\n [draft, options, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n const query = current?.label ?? value ?? ''\n setSearchQueryRef.current(query)\n }, [current?.label, editing, value])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleActivate = React.useCallback(() => {\n if (!editing) {\n setEditing(true)\n prefillSearch()\n void onLoadOptions()\n }\n }, [editing, onLoadOptions, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm text-foreground\">\n {current ? (\n <span className=\"text-sm\">{current.label}</span>\n ) : value ? (\n <span className=\"text-sm\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype MethodOption = ShippingMethodOption | PaymentMethodOption\n\nfunction MethodInlineEditor({\n label,\n value,\n snapshot,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n placeholder,\n loadingLabel,\n emptyResultsLabel,\n selectedHint,\n icon,\n allowClear = true,\n}: {\n label: string\n value: string | null | undefined\n snapshot: Record<string, unknown> | null\n emptyLabel: string\n options: MethodOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<MethodOption[]>\n onSave: (nextId: string | null) => Promise<void>\n saveLabel: string\n placeholder: string\n loadingLabel: string\n emptyResultsLabel: string\n selectedHint: (id: string) => string\n icon: React.ReactNode\n allowClear?: boolean\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const resolveDisplay = React.useCallback(\n (id: string | null | undefined): { label: string | null; description: string | null } => {\n if (!id) return { label: null, description: null }\n const option = options.find((entry) => entry.id === id)\n if (option) {\n return {\n label: option.name ?? option.code,\n description: option.description ?? null,\n }\n }\n const snapName =\n snapshot && typeof (snapshot as any)?.name === 'string' ? (snapshot as any).name : null\n const snapCode =\n snapshot && typeof (snapshot as any)?.code === 'string' ? (snapshot as any).code : null\n const snapDescription =\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null\n return {\n label: snapName ?? snapCode ?? id,\n description: snapDescription,\n }\n },\n [options, snapshot]\n )\n\n const currentDisplay = React.useMemo(\n () => resolveDisplay(draft ?? value ?? null),\n [draft, resolveDisplay, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n setSearchQueryRef.current('')\n }, [editing])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={containerClasses}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (editing) return\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.name ?? item.code,\n subtitle: item.code,\n icon: icon,\n }))\n }}\n minQuery={0}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={placeholder}\n loadingLabel={loadingLabel}\n emptyLabel={emptyResultsLabel}\n selectedHintLabel={(id) => selectedHint(id)}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n {allowClear ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDraft(null)}\n disabled={saving}\n >\n {t('ui.actions.clear', 'Clear')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n {currentDisplay.label ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm\">{currentDisplay.label}</span>\n {currentDisplay.description ? (\n <p className=\"text-xs text-muted-foreground\">{currentDisplay.description}</p>\n ) : null}\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={triggerClasses}\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions('')\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction StatusInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n onSave,\n onLoadOptions,\n labels,\n manageHref,\n loading,\n saveLabel,\n dictionaryMap,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: StatusOption[]\n onSave: (entryId: string | null, value: string | null) => Promise<void>\n onLoadOptions: () => Promise<StatusOption[]>\n labels: DictionarySelectLabels\n manageHref?: string\n loading: boolean\n saveLabel: string\n dictionaryMap: DictionaryMap\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | undefined>(value ?? undefined)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const fetchStatusOptions = React.useCallback(\n async () =>\n (await onLoadOptions()).map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n [onLoadOptions]\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? undefined)\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const selected = draft ? options.find((opt) => opt.value === draft) ?? null : null\n if (draft && !selected) {\n setError(t('sales.documents.detail.statusInvalid', 'Selected status could not be found.'))\n return\n }\n setSaving(true)\n setError(null)\n try {\n await onSave(selected?.id ?? null, draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, options, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (!editing) {\n setEditing(true)\n void onLoadOptions()\n }\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n void onLoadOptions()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ?? undefined)}\n fetchOptions={fetchStatusOptions}\n allowInlineCreate={false}\n allowAppearance\n manageHref={manageHref}\n labels={labels}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {labels.loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n <DictionaryValue\n value={value}\n map={dictionaryMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm\"\n iconWrapperClassName=\"inline-flex h-6 w-6 items-center justify-center rounded border border-border bg-card\"\n iconClassName=\"h-4 w-4\"\n colorClassName=\"h-3 w-3 rounded-full\"\n />\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(normalizedValue)\n setError(null)\n }\n setEditing((prev) => !prev)\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nexport default function SalesDocumentDetailPage({\n params,\n initialKind,\n}: {\n params: { id: string }\n initialKind?: 'order' | 'quote'\n}) {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [loading, setLoading] = React.useState(true)\n const [record, setRecord] = React.useState<DocumentRecord | null>(null)\n const [tags, setTags] = React.useState<TagOption[]>([])\n const [kind, setKind] = React.useState<'order' | 'quote'>('quote')\n const [error, setError] = React.useState<string | null>(null)\n const [reloadKey, setReloadKey] = React.useState(0)\n const [activeTab, setActiveTab] = React.useState<string>('comments')\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const detailSectionRef = React.useRef<HTMLDivElement | null>(null)\n const [generating, setGenerating] = React.useState(false)\n const [converting, setConverting] = React.useState(false)\n const [deleting, setDeleting] = React.useState(false)\n const [sending, setSending] = React.useState(false)\n const [sendOpen, setSendOpen] = React.useState(false)\n const [validForDays, setValidForDays] = React.useState(14)\n const [numberEditing, setNumberEditing] = React.useState(false)\n const [currencyError, setCurrencyError] = React.useState<string | null>(null)\n const [hasItems, setHasItems] = React.useState(false)\n const [hasPayments, setHasPayments] = React.useState(false)\n const [customerOptions, setCustomerOptions] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [customerSaving, setCustomerSaving] = React.useState(false)\n const [customerError, setCustomerError] = React.useState<string | null>(null)\n const [editingGuards, setEditingGuards] = React.useState<{\n customer: string[] | null\n addresses: string[] | null\n } | null>(null)\n const [channelOptions, setChannelOptions] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const channelOptionsRef = React.useRef<Map<string, ChannelOption>>(new Map())\n const [shippingMethodOptions, setShippingMethodOptions] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const shippingMethodOptionsRef = React.useRef<Map<string, ShippingMethodOption>>(new Map())\n const [paymentMethodOptions, setPaymentMethodOptions] = React.useState<PaymentMethodOption[]>([])\n const [paymentMethodLoading, setPaymentMethodLoading] = React.useState(false)\n const paymentMethodOptionsRef = React.useRef<Map<string, PaymentMethodOption>>(new Map())\n const [statusOptions, setStatusOptions] = React.useState<StatusOption[]>([])\n const [statusLoading, setStatusLoading] = React.useState(false)\n const statusOptionsRef = React.useRef<Map<string, StatusOption>>(new Map())\n const [adjustmentRows, setAdjustmentRows] = React.useState<AdjustmentRowData[]>([])\n const clearCustomerError = React.useCallback(() => setCustomerError(null), [])\n const { data: currencyDictionary } = useCurrencyDictionary()\n const scopeVersion = useOrganizationScopeVersion()\n const parseNumber = React.useCallback((value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return NaN\n }, [])\n\n const loadErrorMessage = React.useMemo(\n () => t('sales.documents.detail.error', 'Document not found or inaccessible.'),\n [t]\n )\n const saveShortcutLabel = React.useMemo(\n () => t('sales.documents.detail.inline.save', 'Save \u2318\u23CE / Ctrl+Enter'),\n [t]\n )\n const customDataLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.customDataLoading', 'Loading custom data\u2026'),\n emptyValue: t('sales.documents.detail.empty', 'Not set'),\n noFields: t('entities.customFields.empty'),\n defineFields: t('sales.documents.detail.customDataDefine', 'Define custom fields first.'),\n saveShortcut: saveShortcutLabel,\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [saveShortcutLabel, t],\n )\n const tagLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.tags.loading', 'Loading tags\u2026'),\n placeholder: t('sales.documents.detail.tags.placeholder', 'Type to add tags'),\n empty: t('sales.documents.detail.tags.placeholder', 'No tags yet. Add labels to keep documents organized.'),\n loadError: t('sales.documents.detail.tags.loadError', 'Failed to load tags.'),\n createError: t('sales.documents.detail.tags.createError', 'Failed to create tag.'),\n updateError: t('sales.documents.detail.tags.updateError', 'Failed to update tags.'),\n labelRequired: t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'),\n saveShortcut: t('sales.documents.detail.tags.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter'),\n cancelShortcut: t('sales.documents.detail.tags.cancelShortcut', 'Cancel (Esc)'),\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [t],\n )\n\n const upsertChannelOptions = React.useCallback((options: ChannelOption[]) => {\n setChannelOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n channelOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertShippingMethodOptions = React.useCallback((options: ShippingMethodOption[]) => {\n setShippingMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n shippingMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertPaymentMethodOptions = React.useCallback((options: PaymentMethodOption[]) => {\n setPaymentMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n paymentMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertStatusOptions = React.useCallback((options: StatusOption[]) => {\n setStatusOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.value, opt]))\n options.forEach((opt) => map.set(opt.value, opt))\n statusOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const loadCustomers = React.useCallback(\n async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomerOptions((prev) => {\n const combined = [...prev]\n merged.forEach((entry) => {\n if (!combined.some((item) => item.id === entry.id)) {\n combined.push(entry)\n }\n })\n return combined\n })\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n },\n [t]\n )\n\n const loadChannels = React.useCallback(\n async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) upsertChannelOptions(options)\n return options\n }\n if (!query) upsertChannelOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n if (!query) {\n flash(t('sales.channels.offers.filters.channelsLoadError', 'Failed to load channels'), 'error')\n }\n return []\n } finally {\n setChannelLoading(false)\n }\n },\n [t, upsertChannelOptions]\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string) => {\n setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n carrierCode: typeof (item as any)?.carrierCode === 'string' ? (item as any).carrierCode : null,\n serviceLevel: typeof (item as any)?.serviceLevel === 'string' ? (item as any).serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : null,\n currencyCode: typeof item?.currencyCode === 'string' ? item.currencyCode : null,\n baseRateNet:\n typeof (item as any)?.baseRateNet === 'string'\n ? (item as any).baseRateNet\n : typeof (item as any)?.baseRateNet === 'number'\n ? (item as any).baseRateNet.toString()\n : null,\n baseRateGross:\n typeof (item as any)?.baseRateGross === 'string'\n ? (item as any).baseRateGross\n : typeof (item as any)?.baseRateGross === 'number'\n ? (item as any).baseRateGross.toString()\n : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) upsertShippingMethodOptions(options)\n return options\n }\n if (!query) upsertShippingMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadShippingMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.shippingMethodLoadError', 'Failed to load shipping methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setShippingMethodLoading(false)\n }\n },\n [t, upsertShippingMethodOptions]\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string) => {\n setPaymentMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n terms: typeof (item as any)?.terms === 'string' ? (item as any).terms : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) upsertPaymentMethodOptions(options)\n return options\n }\n if (!query) upsertPaymentMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadPaymentMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.paymentMethodLoadError', 'Failed to load payment methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setPaymentMethodLoading(false)\n }\n },\n [t, upsertPaymentMethodOptions]\n )\n\n const refreshPaymentPresence = React.useCallback(async () => {\n if (!record?.id || kind !== 'order') {\n setHasPayments(false)\n return\n }\n const params = new URLSearchParams({ page: '1', pageSize: '1', orderId: record.id })\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payments?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n setHasPayments(items.some((item) => item && typeof (item as any).id === 'string'))\n } catch (err) {\n console.error('sales.documents.currency.paymentsGuard', err)\n }\n }, [kind, record?.id])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customerOptions.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomerOptions((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customerOptions],\n )\n\n const ensureChannelOption = React.useCallback(\n async (id: string | null | undefined) => {\n if (!id) return null\n const existing = channelOptionsRef.current.get(id)\n if (existing) return existing\n try {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const item = call.result.items[0]\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n const option: ChannelOption = { id, label: code ? `${label} (${code})` : label }\n upsertChannelOptions([option])\n return option\n }\n } catch (err) {\n console.error('sales.documents.channel.ensure', err)\n }\n return null\n },\n [upsertChannelOptions]\n )\n\n const ensureShippingMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = shippingMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: ShippingMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n carrierCode:\n snapshot && typeof (snapshot as any)?.carrierCode === 'string'\n ? (snapshot as any).carrierCode\n : null,\n serviceLevel:\n snapshot && typeof (snapshot as any)?.serviceLevel === 'string'\n ? (snapshot as any).serviceLevel\n : null,\n estimatedTransitDays:\n snapshot && typeof (snapshot as any)?.estimatedTransitDays === 'number'\n ? (snapshot as any).estimatedTransitDays\n : null,\n currencyCode:\n snapshot && typeof (snapshot as any)?.currencyCode === 'string'\n ? (snapshot as any).currencyCode\n : null,\n }\n upsertShippingMethodOptions([option])\n return option\n },\n [upsertShippingMethodOptions]\n )\n\n const ensurePaymentMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = paymentMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: PaymentMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n providerKey:\n snapshot && typeof (snapshot as any)?.providerKey === 'string'\n ? (snapshot as any).providerKey\n : null,\n terms:\n snapshot && typeof (snapshot as any)?.terms === 'string' ? (snapshot as any).terms : null,\n }\n upsertPaymentMethodOptions([option])\n return option\n },\n [upsertPaymentMethodOptions]\n )\n\n const loadStatuses = React.useCallback(async () => {\n setStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<{ items?: Array<{ id?: string; value?: string; label?: string | null; color?: string | null; icon?: string | null }> }>(\n `/api/sales/order-statuses?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const value = typeof item?.value === 'string' ? item.value : null\n if (!id || !value) return null\n const label = typeof item?.label === 'string' && item.label.trim().length ? item.label : value\n const color = typeof item?.color === 'string' && item.color.trim().length ? item.color : null\n const icon = typeof item?.icon === 'string' && item.icon.trim().length ? item.icon : null\n return { id, value, label, color, icon }\n })\n .filter((opt): opt is StatusOption => !!opt)\n upsertStatusOptions(options)\n return options\n }\n upsertStatusOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadStatuses', err)\n flash(t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'), 'error')\n return []\n } finally {\n setStatusLoading(false)\n }\n }, [t, upsertStatusOptions])\n\n const ensureStatusOption = React.useCallback(\n (value: string | null | undefined, entryId: string | null | undefined) => {\n if (!value) return\n if (statusOptionsRef.current.has(value)) return\n upsertStatusOptions([\n {\n id: entryId ?? value,\n value,\n label: value,\n color: null,\n icon: null,\n },\n ])\n },\n [upsertStatusOptions]\n )\n\n const fetchDocumentByKind = React.useCallback(\n async (documentId: string, candidateKind: 'order' | 'quote') => {\n return fetchDocument(documentId, candidateKind, loadErrorMessage)\n },\n [loadErrorMessage]\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setLoading(true)\n setError(null)\n const requestedKind = searchParams.get('kind')\n const preferredKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : initialKind ?? null\n const kindsToTry: Array<'order' | 'quote'> = preferredKind\n ? [preferredKind, preferredKind === 'order' ? 'quote' : 'order']\n : ['quote', 'order']\n let lastError: string | null = null\n for (const candidate of kindsToTry) {\n try {\n const entry = await fetchDocumentByKind(params.id, candidate)\n if (entry && !cancelled) {\n setRecord(entry)\n setKind(candidate)\n setLoading(false)\n return\n }\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n lastError = message\n }\n }\n if (!cancelled) {\n setLoading(false)\n setError(lastError ?? loadErrorMessage)\n }\n }\n load().catch((err) => {\n if (cancelled) return\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n setError(message)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [fetchDocumentByKind, initialKind, loadErrorMessage, params.id, reloadKey, searchParams])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n }, [loadCustomers])\n\n React.useEffect(() => {\n setTags(Array.isArray(record?.tags) ? record.tags : [])\n }, [record?.tags])\n\n React.useEffect(() => {\n if (!record) {\n setHasItems(false)\n return\n }\n const lineItemCount = resolveLineItemCount(record)\n if (lineItemCount !== null) {\n setHasItems(lineItemCount > 0)\n }\n }, [record])\n\n React.useEffect(() => {\n loadChannels().catch(() => {})\n loadStatuses().catch(() => {})\n loadShippingMethods().catch(() => {})\n loadPaymentMethods().catch(() => {})\n }, [loadChannels, loadPaymentMethods, loadShippingMethods, loadStatuses, scopeVersion])\n\n React.useEffect(() => {\n void refreshPaymentPresence()\n }, [refreshPaymentPresence])\n\n const normalizeGuardList = React.useCallback((value: unknown): string[] | null => {\n if (value === null) return null\n if (!Array.isArray(value)) return []\n const set = new Set<string>()\n value.forEach((entry) => {\n if (typeof entry === 'string' && entry.trim().length) set.add(entry.trim())\n })\n return Array.from(set)\n }, [])\n\n React.useEffect(() => {\n if (kind !== 'order') {\n setEditingGuards(null)\n return\n }\n let cancelled = false\n async function loadGuards() {\n try {\n const call = await apiCall<{\n orderCustomerEditableStatuses?: unknown\n orderAddressEditableStatuses?: unknown\n }>('/api/sales/settings/order-editing')\n if (!call.ok || cancelled) return\n setEditingGuards({\n customer: normalizeGuardList(call.result?.orderCustomerEditableStatuses ?? null),\n addresses: normalizeGuardList(call.result?.orderAddressEditableStatuses ?? null),\n })\n } catch (err) {\n console.error('sales.documents.loadGuards', err)\n }\n }\n void loadGuards()\n return () => {\n cancelled = true\n }\n }, [kind, normalizeGuardList, scopeVersion])\n\n React.useEffect(() => {\n if (!record?.channelId) return\n void ensureChannelOption(record.channelId)\n }, [ensureChannelOption, record?.channelId])\n\n React.useEffect(() => {\n if (kind !== 'order') return\n ensureShippingMethodOption(record?.shippingMethodId ?? null, record?.shippingMethodSnapshot ?? null)\n ensurePaymentMethodOption(record?.paymentMethodId ?? null, record?.paymentMethodSnapshot ?? null)\n }, [\n ensurePaymentMethodOption,\n ensureShippingMethodOption,\n kind,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n ])\n\n React.useEffect(() => {\n ensureStatusOption(record?.status ?? null, record?.statusEntryId ?? null)\n }, [ensureStatusOption, record?.status, record?.statusEntryId])\n\n const handleRetry = React.useCallback(() => {\n setReloadKey((prev) => prev + 1)\n }, [])\n\n const loadAdjustmentsForTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', [kind === 'order' ? 'orderId' : 'quoteId']: record.id })\n const resourcePath = kind === 'order' ? '/api/sales/order-adjustments' : '/api/sales/quote-adjustments'\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `${resourcePath}?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped: AdjustmentRowData[] = items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const amountNet = parseNumber(\n (item as any).amount_net ?? (item as any).amountNet ?? (item as any).amount_net_amount\n )\n const amountGross = parseNumber(\n (item as any).amount_gross ?? (item as any).amountGross ?? (item as any).amount_gross_amount\n )\n const rateRaw = parseNumber((item as any).rate)\n const kindValue =\n typeof item.kind === 'string' && item.kind.trim().length\n ? (item.kind.trim() as SalesAdjustmentKind)\n : 'custom'\n const currency =\n typeof (item as any).currency_code === 'string'\n ? (item as any).currency_code\n : typeof (item as any).currencyCode === 'string'\n ? (item as any).currencyCode\n : record?.currencyCode ?? null\n return {\n id,\n label: typeof item.label === 'string' ? item.label : null,\n code: typeof item.code === 'string' ? item.code : null,\n kind: kindValue,\n calculatorKey:\n typeof (item as any).calculator_key === 'string'\n ? (item as any).calculator_key\n : typeof (item as any).calculatorKey === 'string'\n ? (item as any).calculatorKey\n : null,\n rate: Number.isFinite(rateRaw) ? rateRaw : null,\n amountNet: Number.isFinite(amountNet) ? amountNet : null,\n amountGross: Number.isFinite(amountGross) ? amountGross : null,\n currencyCode: currency,\n position:\n typeof item.position === 'number'\n ? item.position\n : typeof (item as any).position === 'string'\n ? Number((item as any).position)\n : 0,\n customFields: null,\n customFieldSetId:\n typeof (item as any).custom_field_set_id === 'string'\n ? (item as any).custom_field_set_id\n : typeof (item as any).customFieldSetId === 'string'\n ? (item as any).customFieldSetId\n : null,\n }\n })\n .filter((entry): entry is AdjustmentRowData => Boolean(entry))\n const ordered = [...mapped].sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n setAdjustmentRows(ordered)\n } catch (err) {\n console.error('sales.documents.adjustments.totals.load', err)\n }\n }, [kind, parseNumber, record?.currencyCode, record?.id])\n\n React.useEffect(() => {\n void loadAdjustmentsForTotals()\n }, [loadAdjustmentsForTotals])\n\n const refreshDocumentTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const updated = await fetchDocumentByKind(record.id, kind)\n if (updated) {\n setRecord(updated)\n }\n await loadAdjustmentsForTotals()\n } catch (err) {\n console.error('sales.documents.totals.refresh', err)\n }\n }, [fetchDocumentByKind, kind, loadAdjustmentsForTotals, record?.id])\n\n React.useEffect(\n () =>\n subscribeSalesDocumentTotalsRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n void refreshDocumentTotals()\n }),\n [kind, record?.id, refreshDocumentTotals],\n )\n\n // Subscribe to document data refresh events (e.g., from workflow status updates)\n React.useEffect(\n () =>\n subscribeSalesDocumentDataRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n // Increment reloadKey to trigger a full document reload\n setReloadKey((prev) => prev + 1)\n }),\n [kind, record?.id],\n )\n\n const statusDictionaryMap = React.useMemo(\n () =>\n createDictionaryMap(\n statusOptions.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n }))\n ),\n [statusOptions]\n )\n const statusOptionsForEditor = React.useMemo(() => {\n if (kind === 'order') {\n return statusOptions.filter((option) => option.value !== 'sent')\n }\n return statusOptions\n }, [kind, statusOptions])\n const number = record?.orderNumber ?? record?.quoteNumber ?? record?.id\n const customerSnapshot = (record?.customerSnapshot ?? null) as CustomerSnapshot | null\n const billingSnapshot = (record?.billingAddressSnapshot ?? null) as AddressSnapshot | null\n const shippingSnapshot = (record?.shippingAddressSnapshot ?? null) as AddressSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, record?.customerName ?? record?.customerEntityId ?? null)\n const metadataEmail =\n record?.metadata && typeof (record.metadata as Record<string, unknown>).customerEmail === 'string'\n ? (record.metadata as Record<string, unknown>).customerEmail\n : null\n const contactEmail = resolveCustomerEmail(customerSnapshot) ?? metadataEmail ?? record?.contactEmail ?? null\n const statusDisplay = record?.status ? statusDictionaryMap[record.status] ?? null : null\n const contactRecordId = customerSnapshot?.contact?.id ?? customerSnapshot?.customer?.id ?? record?.customerEntityId ?? null\n const resolveAdjustmentLabel = React.useCallback(\n (row: AdjustmentRowData) => {\n const base = (row.label ?? '').trim()\n const fallback = t(`sales.documents.adjustments.kindLabels.${row.kind}`, row.kind)\n const label = base.length ? base : fallback\n const hasRate = Number.isFinite(row.rate) && row.rate !== null\n const suffix = hasRate ? ` (${row.rate}%)` : ''\n return `${label}${suffix}`\n },\n [t]\n )\n const totalsItems = React.useMemo(() => {\n if (!record) return []\n const items: { key: string; label: string; amount: number | null | undefined; emphasize?: boolean }[] = [\n {\n key: 'subtotalNetAmount',\n label: t('sales.documents.detail.totals.subtotalNet', 'Subtotal (net)'),\n amount: record.subtotalNetAmount ?? null,\n },\n {\n key: 'subtotalGrossAmount',\n label: t('sales.documents.detail.totals.subtotalGross', 'Subtotal (gross)'),\n amount: record.subtotalGrossAmount ?? null,\n },\n {\n key: 'discountTotalAmount',\n label: t('sales.documents.detail.totals.discountTotal', 'Discounts'),\n amount: record.discountTotalAmount ?? null,\n },\n {\n key: 'taxTotalAmount',\n label: t('sales.documents.detail.totals.taxTotal', 'Tax total'),\n amount: record.taxTotalAmount ?? null,\n },\n ]\n if (kind === 'order') {\n items.push(\n {\n key: 'shippingNetAmount',\n label: t('sales.documents.detail.totals.shippingNet', 'Shipping (net)'),\n amount: record.shippingNetAmount ?? null,\n },\n {\n key: 'shippingGrossAmount',\n label: t('sales.documents.detail.totals.shippingGross', 'Shipping (gross)'),\n amount: record.shippingGrossAmount ?? null,\n },\n {\n key: 'surchargeTotalAmount',\n label: t('sales.documents.detail.totals.surchargeTotal', 'Surcharges'),\n amount: record.surchargeTotalAmount ?? null,\n }\n )\n }\n if (adjustmentRows.length) {\n adjustmentRows.forEach((adj) => {\n items.push({\n key: `adjustment-${adj.id}`,\n label: resolveAdjustmentLabel(adj),\n amount: adj.amountGross ?? adj.amountNet ?? null,\n })\n })\n }\n items.push(\n {\n key: 'grandTotalNetAmount',\n label: t('sales.documents.detail.totals.grandTotalNet', 'Grand total (net)'),\n amount: record.grandTotalNetAmount ?? null,\n emphasize: true,\n },\n {\n key: 'grandTotalGrossAmount',\n label: t('sales.documents.detail.totals.grandTotalGross', 'Grand total (gross)'),\n amount: record.grandTotalGrossAmount ?? null,\n emphasize: true,\n }\n )\n if (kind === 'order') {\n items.push(\n {\n key: 'paidTotalAmount',\n label: t('sales.documents.detail.totals.paidTotal', 'Paid'),\n amount: record.paidTotalAmount ?? null,\n },\n {\n key: 'refundedTotalAmount',\n label: t('sales.documents.detail.totals.refundedTotal', 'Refunded'),\n amount: record.refundedTotalAmount ?? null,\n },\n {\n key: 'outstandingAmount',\n label: t('sales.documents.detail.totals.outstandingTotal', 'Outstanding'),\n amount: record.outstandingAmount ?? null,\n emphasize: true,\n }\n )\n }\n return items\n }, [\n kind,\n record,\n record?.discountTotalAmount,\n record?.grandTotalGrossAmount,\n record?.grandTotalNetAmount,\n record?.outstandingAmount,\n record?.paidTotalAmount,\n record?.refundedTotalAmount,\n record?.shippingGrossAmount,\n record?.shippingNetAmount,\n record?.surchargeTotalAmount,\n record?.subtotalGrossAmount,\n record?.subtotalNetAmount,\n record?.taxTotalAmount,\n adjustmentRows,\n resolveAdjustmentLabel,\n t,\n ])\n const guardAllows = (list: string[] | null | undefined, status: string | null | undefined) => {\n if (list === null || list === undefined) return true\n if (list.length === 0) return false\n if (!status) return false\n return list.includes(status)\n }\n const customerGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.customer ?? null, record?.status ?? null)\n const addressGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.addresses ?? null, record?.status ?? null)\n const customerGuardMessage = customerGuardBlocked\n ? t('sales.documents.detail.customerBlocked', 'Customer cannot be changed for the current status.')\n : null\n const addressGuardMessage = addressGuardBlocked\n ? t('sales.documents.detail.addresses.blocked', 'Addresses cannot be changed for the current status.')\n : null\n React.useEffect(() => {\n const id = record?.customerEntityId ?? null\n if (!id) return\n const label = customerName ?? id\n setCustomerOptions((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: contactEmail ?? null,\n kind: 'company',\n primaryEmail: contactEmail ?? null,\n }\n return [next, ...prev]\n })\n }, [contactEmail, customerName, record?.customerEntityId])\n const currencyEntries = React.useMemo(() => {\n const entries = Array.isArray(currencyDictionary?.entries) ? currencyDictionary.entries : []\n return entries.map((entry) => ({\n value: entry.value.toUpperCase(),\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }, [currencyDictionary?.entries])\n const currencyOptions = React.useMemo(() => {\n const set = new Map<string, { value: string; label: string; color: string | null; icon: string | null }>()\n currencyEntries.forEach((entry) => {\n set.set(entry.value, { value: entry.value, label: entry.label, color: entry.color ?? null, icon: entry.icon ?? null })\n })\n const currentCode = typeof record?.currencyCode === 'string' ? record.currencyCode.toUpperCase() : null\n if (currentCode && !set.has(currentCode)) {\n set.set(currentCode, { value: currentCode, label: currentCode, color: null, icon: null })\n }\n return Array.from(set.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n }, [currencyEntries, record?.currencyCode])\n const currencyLabels = React.useMemo(\n () => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }),\n [t]\n )\n const currencyLocked = React.useMemo(\n () => hasItems || (kind === 'order' && hasPayments),\n [hasItems, hasPayments, kind]\n )\n const currencyLockMessage = React.useMemo(\n () =>\n currencyLocked\n ? t(\n 'sales.documents.detail.currencyLocked',\n 'Currency cannot be changed after adding items or payments.'\n )\n : null,\n [currencyLocked, t]\n )\n const statusLabels = React.useMemo<DictionarySelectLabels>(\n () => ({\n placeholder: t('sales.documents.detail.status.placeholder', 'Select status'),\n addLabel: t('sales.config.statuses.actions.add', 'Add status'),\n dialogTitle: t('sales.documents.detail.status.dialogTitle', 'Add status'),\n valueLabel: t('sales.documents.detail.status.valueLabel', 'Value'),\n valuePlaceholder: t('sales.documents.detail.status.valuePlaceholder', 'e.g. confirmed'),\n labelLabel: t('sales.documents.detail.status.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.detail.status.labelPlaceholder', 'Display label'),\n emptyError: t('sales.documents.detail.status.emptyError', 'Status value is required.'),\n cancelLabel: t('sales.documents.detail.status.cancel', 'Cancel'),\n saveLabel: t('sales.documents.detail.status.save', 'Save'),\n saveShortcutHint: 'Ctrl/Cmd + Enter',\n successCreateLabel: t('sales.documents.detail.status.created', 'Status saved.'),\n errorLoad: t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'),\n errorSave: t('sales.documents.detail.status.errorSave', 'Failed to save status.'),\n loadingLabel: t('sales.documents.detail.status.loading', 'Loading statuses\u2026'),\n manageTitle: t('sales.documents.detail.status.manage', 'Manage statuses'),\n }),\n [t]\n )\n\n const updateDocument = React.useCallback(\n async (patch: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n return apiCallOrThrow<DocumentUpdateResult>(\n endpoint,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id, ...patch }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n [kind, record, t]\n )\n\n const handleUpdateCurrency = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (currencyLocked) {\n const message =\n currencyLockMessage ??\n t('sales.documents.detail.currencyLocked', 'Currency cannot be changed after adding items or payments.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim().toUpperCase() : ''\n if (!/^[A-Z]{3}$/.test(normalized)) {\n const message = t('sales.documents.detail.currencyInvalid', 'Currency code must be 3 letters.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const call = await updateDocument({ currencyCode: normalized })\n const savedCode = call.result?.currencyCode ?? normalized\n setRecord((prev) => (prev ? { ...prev, currencyCode: savedCode } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n return savedCode\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [currencyLockMessage, currencyLocked, record, t, updateDocument]\n )\n\n const handleUpdatePlacedAt = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { placedAt: string | null } = { placedAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.placedAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedPlacedAt =\n typeof call.result?.placedAt === 'string' ? call.result.placedAt : payload.placedAt\n setRecord((prev) => (prev ? { ...prev, placedAt: savedPlacedAt } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExpectedDeliveryAt = React.useCallback(\n async (next: string | null) => {\n if (!record || kind !== 'order') return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { expectedDeliveryAt: string | null } = { expectedDeliveryAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.expectedDeliveryAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedExpectedDelivery =\n typeof call.result?.expectedDeliveryAt === 'string'\n ? call.result.expectedDeliveryAt\n : payload.expectedDeliveryAt\n setRecord((prev) => (prev ? { ...prev, expectedDeliveryAt: savedExpectedDelivery } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [kind, record, t, updateDocument]\n )\n\n const handleUpdateComment = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ comment: normalized.length ? normalized : null })\n const savedComment =\n typeof call.result?.comment === 'string'\n ? call.result.comment\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, comment: savedComment } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExternalReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ externalReference: normalized.length ? normalized : null })\n const savedExternalReference =\n typeof call.result?.externalReference === 'string'\n ? call.result.externalReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, externalReference: savedExternalReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateCustomerReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ customerReference: normalized.length ? normalized : null })\n const savedCustomerReference =\n typeof call.result?.customerReference === 'string'\n ? call.result.customerReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, customerReference: savedCustomerReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateContactEmail = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (customerGuardMessage) {\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n const baseMetadata = (record.metadata ?? {}) as Record<string, unknown>\n const trimmed = typeof next === 'string' ? next.trim() : ''\n const nextValue = trimmed.length ? trimmed : null\n const updatedMetadata =\n nextValue === null\n ? Object.fromEntries(Object.entries(baseMetadata).filter(([key]) => key !== 'customerEmail'))\n : { ...baseMetadata, customerEmail: nextValue }\n const metadataPayload = Object.keys(updatedMetadata).length ? updatedMetadata : null\n const snapshotBase = (record.customerSnapshot ?? null) as CustomerSnapshot | null\n const nextSnapshot =\n snapshotBase || nextValue !== null\n ? {\n ...(snapshotBase ?? {}),\n customer: {\n ...(snapshotBase?.customer ?? {}),\n primaryEmail: nextValue,\n },\n }\n : null\n try {\n const call = await updateDocument({ metadata: metadataPayload, customerSnapshot: nextSnapshot })\n const savedMetadata =\n (call.result?.metadata as Record<string, unknown> | null | undefined) ?? metadataPayload ?? null\n const snapshotFromResult = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot = hasSnapshotInResponse ? snapshotFromResult : nextSnapshot\n const savedEmail =\n resolveCustomerEmail(savedSnapshot ?? null) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : undefined) ??\n (typeof savedMetadata?.customerEmail === 'string' ? (savedMetadata.customerEmail as string) : undefined) ??\n nextValue\n setRecord((prev) => {\n if (!prev) return prev\n const resolvedEmail = savedEmail === undefined ? prev.contactEmail ?? null : savedEmail ?? null\n return {\n ...prev,\n metadata: savedMetadata ?? null,\n customerSnapshot: savedSnapshot ?? prev.customerSnapshot ?? null,\n contactEmail: resolvedEmail,\n }\n })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw new Error(message)\n }\n },\n [customerGuardMessage, record, t, updateDocument]\n )\n\n const handleUpdateChannel = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ channelId: nextId })\n const savedChannelId =\n typeof call.result?.channelId === 'string' ? call.result.channelId : nextId ?? null\n setRecord((prev) => (prev ? { ...prev, channelId: savedChannelId } : prev))\n if (savedChannelId) {\n void ensureChannelOption(savedChannelId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureChannelOption, record, t, updateDocument]\n )\n\n const handleUpdateShippingMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? shippingMethodOptionsRef.current.get(nextId) ??\n shippingMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n shippingMethodId: nextId,\n shippingMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.shippingMethodId === 'string' ? call.result.shippingMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.shippingMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.shippingMethodCode === 'string'\n ? call.result.shippingMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n shippingMethodId: savedId,\n shippingMethodCode: savedCode,\n shippingMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensureShippingMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensureShippingMethodOption,\n record,\n kind,\n shippingMethodOptions,\n shippingMethodOptionsRef,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdatePaymentMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? paymentMethodOptionsRef.current.get(nextId) ??\n paymentMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n paymentMethodId: nextId,\n paymentMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.paymentMethodId === 'string' ? call.result.paymentMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.paymentMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.paymentMethodCode === 'string'\n ? call.result.paymentMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paymentMethodId: savedId,\n paymentMethodCode: savedCode,\n paymentMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensurePaymentMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensurePaymentMethodOption,\n kind,\n paymentMethodOptions,\n paymentMethodOptionsRef,\n record,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdateStatus = React.useCallback(\n async (entryId: string | null, value: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ statusEntryId: entryId })\n const savedStatusEntryId =\n typeof call.result?.statusEntryId === 'string' ? call.result.statusEntryId : entryId ?? null\n const savedStatus =\n typeof call.result?.status === 'string'\n ? call.result.status\n : value\n setRecord((prev) => (prev ? { ...prev, statusEntryId: savedStatusEntryId, status: savedStatus ?? null } : prev))\n if (savedStatus) {\n ensureStatusOption(savedStatus, savedStatusEntryId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureStatusOption, record, t, updateDocument]\n )\n\n const handleUpdateCustomer = React.useCallback(\n async (nextId: string | null, email: string | null) => {\n if (!record) return\n const changedCustomer = nextId !== record.customerEntityId\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n if (changedCustomer) {\n const hasAddresses =\n !!record.shippingAddressId ||\n !!record.billingAddressId ||\n !!record.shippingAddressSnapshot ||\n !!record.billingAddressSnapshot\n if (hasAddresses) {\n const confirmed = window.confirm(\n t(\n 'sales.documents.detail.customerChangeConfirm',\n 'Change the customer? Existing shipping and billing addresses will be unassigned.'\n )\n )\n if (!confirmed) return\n }\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const payload: Record<string, unknown> = { customerEntityId: nextId }\n if (email && email.trim().length) {\n payload.metadata = { customerEmail: email.trim() }\n }\n const call = await updateDocument(payload)\n const snapshot = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const selected = customerOptions.find((entry) => entry.id === nextId) ?? null\n const resolvedName =\n (call.result?.customerName as string | undefined) ??\n resolveCustomerName(snapshot, selected?.label ?? record.customerName ?? record.customerEntityId ?? null)\n const resolvedEmail =\n resolveCustomerEmail(snapshot) ??\n (call.result?.contactEmail as string | undefined | null) ??\n email ??\n selected?.primaryEmail ??\n null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerEntityId: nextId ?? null,\n customerName: nextId ? resolvedName ?? prev.customerName : resolvedName ?? null,\n contactEmail: resolvedEmail ?? (nextId ? prev.contactEmail ?? null : null),\n customerSnapshot:\n hasSnapshotInResponse || changedCustomer\n ? snapshot\n : prev.customerSnapshot ?? null,\n shippingAddressId: changedCustomer ? null : prev.shippingAddressId ?? null,\n billingAddressId: changedCustomer ? null : prev.billingAddressId ?? null,\n shippingAddressSnapshot: changedCustomer ? null : prev.shippingAddressSnapshot ?? null,\n billingAddressSnapshot: changedCustomer ? null : prev.billingAddressSnapshot ?? null,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerOptions, record, t, updateDocument]\n )\n\n const handleUpdateCustomerSnapshot = React.useCallback(\n async (snapshot: CustomerSnapshot) => {\n if (!record) return\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const call = await updateDocument({ customerSnapshot: snapshot })\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot =\n (hasSnapshotInResponse ? (call.result?.customerSnapshot ?? null) : snapshot) as CustomerSnapshot | null\n const resolvedName = resolveCustomerName(\n savedSnapshot,\n record.customerName ?? record.customerEntityId ?? null,\n )\n const resolvedEmail =\n resolveCustomerEmail(savedSnapshot) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : record.contactEmail ?? null)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerSnapshot: savedSnapshot ?? null,\n customerName: resolvedName,\n contactEmail: resolvedEmail ?? null,\n }\n : prev,\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerGuardMessage, record, t, updateDocument],\n )\n\n const handleGenerateNumber = React.useCallback(async () => {\n setGenerating(true)\n const call = await apiCall<{ number?: string }>(`/api/sales/document-numbers`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n if (call.ok && call.result?.number) {\n setRecord((prev) => (prev ? { ...prev, orderNumber: kind === 'order' ? call.result?.number : prev.orderNumber, quoteNumber: kind === 'quote' ? call.result?.number : prev.quoteNumber } : prev))\n flash(t('sales.documents.detail.numberGenerated', 'New number generated.'), 'success')\n } else {\n flash(t('sales.documents.detail.numberGenerateError', 'Could not generate number.'), 'error')\n }\n setGenerating(false)\n }, [kind, t])\n\n const handleConvert = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setConverting(true)\n try {\n const call = await apiCallOrThrow<{ orderId?: string }>(\n '/api/sales/quotes/convert',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id }),\n },\n { errorMessage: t('sales.documents.detail.convertError', 'Failed to convert quote.') },\n )\n const orderId = call.result?.orderId ?? record.id\n flash(t('sales.documents.detail.convertSuccess', 'Quote converted to order.'), 'success')\n router.replace(`/backend/sales/orders/${orderId}`)\n } catch (err) {\n console.error('sales.documents.convert', err)\n flash(t('sales.documents.detail.convertError', 'Failed to convert quote.'), 'error')\n } finally {\n setConverting(false)\n }\n }, [kind, record, router, t])\n\n const handleSendQuote = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setSending(true)\n try {\n await apiCallOrThrow('/api/sales/quotes/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id, validForDays }),\n })\n flash(t('sales.quotes.send.success', 'Quote sent.'), 'success')\n setSendOpen(false)\n // Reload the document to reflect status changes.\n const updated = await fetchDocumentByKind(record.id, 'quote')\n if (updated) setRecord(updated)\n } catch (err) {\n console.error('sales.quotes.send', err)\n flash(t('sales.quotes.send.failed', 'Failed to send quote.'), 'error')\n } finally {\n setSending(false)\n }\n }, [fetchDocumentByKind, flash, kind, record, t, validForDays])\n\n const handleDelete = React.useCallback(async () => {\n if (!record) return\n const confirmed = window.confirm(\n t('sales.documents.detail.deleteConfirm', 'Delete this document? This cannot be undone.')\n )\n if (!confirmed) return\n setDeleting(true)\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const call = await apiCall(endpoint, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id }),\n })\n if (call.ok) {\n flash(t('sales.documents.detail.deleted', 'Document deleted.'), 'success')\n const listPath = kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n router.push(listPath)\n } else {\n flash(t('sales.documents.detail.deleteFailed', 'Could not delete document.'), 'error')\n }\n setDeleting(false)\n }, [kind, record, router, t])\n\n const detailFields = React.useMemo(() => {\n const fields: DetailFieldConfig[] = [\n {\n key: 'shippingMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.shippingMethod.label', 'Shipping method')}\n value={record?.shippingMethodId ?? null}\n snapshot={(record?.shippingMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={shippingMethodOptions}\n loading={shippingMethodLoading}\n onLoadOptions={loadShippingMethods}\n onSave={handleUpdateShippingMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.shippingMethod.placeholder', 'Select shipping method')}\n loadingLabel={t('sales.documents.detail.shippingMethod.loading', 'Loading shipping methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.shippingMethod.empty', 'No shipping methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.shippingMethod.selected', 'Selected shipping method: {{id}}', { id })\n }\n icon={<Truck className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n {\n key: 'paymentMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.paymentMethod.label', 'Payment method')}\n value={record?.paymentMethodId ?? null}\n snapshot={(record?.paymentMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={paymentMethodOptions}\n loading={paymentMethodLoading}\n onLoadOptions={loadPaymentMethods}\n onSave={handleUpdatePaymentMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.paymentMethod.placeholder', 'Select payment method')}\n loadingLabel={t('sales.documents.detail.paymentMethod.loading', 'Loading payment methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.paymentMethod.empty', 'No payment methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.paymentMethod.selected', 'Selected payment method: {{id}}', { id })\n }\n icon={<CreditCard className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n ]\n if (kind === 'order') {\n fields.push({\n key: 'expectedDeliveryAt',\n kind: 'text',\n label: t('sales.documents.detail.expectedDeliveryAt.label', 'Expected delivery'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.expectedDeliveryAt.placeholder', 'Add expected delivery date'),\n value: record?.expectedDeliveryAt\n ? new Date(record.expectedDeliveryAt).toISOString().slice(0, 10)\n : null,\n onSave: handleUpdateExpectedDeliveryAt,\n inputType: 'date',\n renderDisplay: (params) => {\n const { value, emptyLabel } = params\n if (value && value.length) {\n return <span className=\"text-sm text-muted-foreground\">{new Date(value).toLocaleDateString()}</span>\n }\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n },\n })\n }\n fields.push(\n {\n key: 'externalRef',\n kind: 'text',\n label: t('sales.documents.detail.externalRef', 'External reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.externalRef.placeholder', 'Add external reference'),\n value: record?.externalReference ?? null,\n onSave: handleUpdateExternalReference,\n },\n {\n key: 'customerRef',\n kind: 'text',\n label: t('sales.documents.detail.customerRef', 'Customer reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.customerRef.placeholder', 'Customer PO or note'),\n value: record?.customerReference ?? null,\n onSave: handleUpdateCustomerReference,\n },\n {\n key: 'comment',\n kind: 'multiline',\n label: t('sales.documents.detail.comment', 'Comment'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.comment.placeholder', 'Add comment'),\n value: record?.comment ?? null,\n onSave: handleUpdateComment,\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n },\n {\n key: 'timestamps',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <SectionCard title={t('sales.documents.detail.timestamps', 'Timestamps')} muted>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.created', 'Created')}: {record?.createdAt ?? '\u2014'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.updated', 'Updated')}: {record?.updatedAt ?? '\u2014'}\n </p>\n </SectionCard>\n ),\n }\n )\n return fields\n }, [\n handleUpdateComment,\n handleUpdateCustomerReference,\n handleUpdateExpectedDeliveryAt,\n handleUpdateExternalReference,\n handleUpdatePaymentMethod,\n handleUpdateShippingMethod,\n loadPaymentMethods,\n loadShippingMethods,\n paymentMethodLoading,\n paymentMethodOptions,\n record?.comment,\n record?.createdAt,\n record?.customerReference,\n record?.expectedDeliveryAt,\n record?.externalReference,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n record?.updatedAt,\n shippingMethodLoading,\n shippingMethodOptions,\n t,\n kind,\n saveShortcutLabel,\n ])\n\n const summaryCards: Array<{\n key: 'email' | 'channel' | 'status' | 'currency'\n title: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel?: string\n type?: 'email'\n containerClassName?: string\n }> = [\n {\n key: 'email',\n title: t('sales.documents.detail.email', 'Primary email'),\n value: contactEmail,\n placeholder: t('sales.documents.detail.email.placeholder', 'Add email'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n type: 'email' as const,\n },\n {\n key: 'channel',\n title: t('sales.documents.detail.channel', 'Channel'),\n value: record?.channelId ?? null,\n },\n {\n key: 'status',\n title: t('sales.documents.detail.status', 'Status'),\n value: record?.status ?? null,\n },\n {\n key: 'currency',\n title: t('sales.documents.detail.currency', 'Currency'),\n value: record?.currencyCode ?? null,\n containerClassName: 'md:col-start-4 md:row-start-1',\n },\n ]\n\n const renderEmailDisplay = React.useCallback(\n ({ value, emptyLabel }: { value: string | null | undefined; emptyLabel: string }) => {\n const emailValue = typeof value === 'string' ? value.trim() : ''\n if (!emailValue.length) {\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n }\n return (\n <a\n className=\"inline-flex items-center gap-2 text-sm text-primary hover:text-primary/80 hover:underline\"\n href={`mailto:${emailValue}`}\n >\n <Mail className=\"h-4 w-4\" aria-hidden />\n <span className=\"truncate\">{emailValue}</span>\n </a>\n )\n },\n []\n )\n\n const injectionContext = React.useMemo(() => ({ kind, record }), [kind, record])\n const tabInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:tabs`, [kind])\n const detailsInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:details`, [kind])\n const { widgets: injectedTabWidgets } = useInjectionWidgets(tabInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel ?? widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={injectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [injectedTabWidgets, injectionContext, record, setRecord],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabButtons = React.useMemo<Array<{ id: string; label: string }>>(\n () => {\n const tabs: Array<{ id: string; label: string }> = [\n { id: 'comments', label: t('sales.documents.detail.tabs.comments', 'Comments') },\n { id: 'addresses', label: t('sales.documents.detail.tabs.addresses', 'Addresses') },\n { id: 'items', label: t('sales.documents.detail.tabs.items', 'Items') },\n ]\n if (kind === 'order') {\n tabs.push(\n { id: 'shipments', label: t('sales.documents.detail.tabs.shipments', 'Shipments') },\n { id: 'payments', label: t('sales.documents.detail.tabs.payments', 'Payments') },\n )\n }\n tabs.push({ id: 'adjustments', label: t('sales.documents.detail.tabs.adjustments', 'Adjustments') })\n injectedTabs.forEach((tab) => {\n tabs.push({ id: tab.id, label: tab.label })\n })\n return tabs\n },\n [injectedTabs, kind, t],\n )\n\n React.useEffect(() => {\n if (tabButtons.some((tab) => tab.id === activeTab)) return\n const fallbackTab = tabButtons[0]?.id ?? 'comments'\n if (activeTab !== fallbackTab) {\n setActiveTab(fallbackTab)\n }\n }, [activeTab, tabButtons])\n\n const notesViewerLabel = React.useMemo(() => t('customers.people.detail.notes.you', 'You'), [t])\n\n const salesNotesAdapter = React.useMemo<NotesDataAdapter>(\n () => ({\n list: async ({ entityId }) => {\n if (!record || !entityId || record.id !== entityId) return []\n const params = new URLSearchParams({ contextType: kind, contextId: entityId })\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/notes?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.map(mapCommentSummary)\n },\n create: async ({ entityId, body, appearanceIcon, appearanceColor }) => {\n if (!record || record.id !== entityId) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/notes',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n contextType: kind,\n contextId: entityId,\n body,\n appearanceIcon: appearanceIcon ?? undefined,\n appearanceColor: appearanceColor ?? undefined,\n }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n return response.result ?? {}\n },\n update: async ({ id, patch }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n const payload: Record<string, unknown> = { id }\n if (patch.body !== undefined) payload.body = patch.body\n if (patch.appearanceIcon !== undefined) payload.appearanceIcon = patch.appearanceIcon\n if (patch.appearanceColor !== undefined) payload.appearanceColor = patch.appearanceColor\n await apiCallOrThrow(\n '/api/sales/notes',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n delete: async ({ id }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n await apiCallOrThrow(\n `/api/sales/notes?id=${encodeURIComponent(id)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n }),\n [kind, record, t],\n )\n\n const appendShipmentComment = React.useCallback(\n async (body: string) => {\n if (!record) return\n try {\n await salesNotesAdapter.create?.({\n entityId: record.id,\n body,\n appearanceIcon: 'lucide:truck',\n appearanceColor: '#0ea5e9',\n })\n } catch (err) {\n console.error('sales.shipments.comment', err)\n }\n },\n [record, salesNotesAdapter],\n )\n\n const commentEmptyState = React.useMemo(\n () => ({\n title: t('sales.documents.detail.empty.comments.title', 'No comments yet.'),\n description: t('sales.documents.detail.empty.comments.description', 'Notes from teammates will appear here.'),\n actionLabel: t('sales.documents.detail.comments.add', 'Add comment'),\n }),\n [t]\n )\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n const tabEmptyStates = React.useMemo<Record<string, { title: string; description?: string }>>(\n () => ({\n items: {\n title: t('sales.documents.detail.empty.items.title', 'No items yet.'),\n description: t('sales.documents.detail.empty.items.description', 'Line items editor is coming in the next iteration.'),\n },\n shipments: {\n title: t('sales.documents.detail.empty.shipments.title', 'No shipments yet.'),\n description: t(\n 'sales.documents.shipments.empty.description',\n 'Add shipments for this document to let the user track the order.'\n ),\n },\n payments: {\n title: t('sales.documents.detail.empty.payments.title', 'No payments yet.'),\n description: t('sales.documents.detail.empty.payments.description', 'Payments are work in progress.'),\n },\n adjustments: {\n title: t('sales.documents.detail.empty.adjustments.title', 'No adjustments yet.'),\n description: t(\n 'sales.documents.detail.empty.adjustments.description',\n 'Add discounts, surcharges, taxes, or shipping to refine totals.'\n ),\n },\n }),\n [t]\n )\n\n const renderTabContent = () => {\n const injectedRenderer = injectedTabMap.get(activeTab)\n if (injectedRenderer) {\n return injectedRenderer()\n }\n if (activeTab === 'comments') {\n return (\n <NotesSection\n entityId={record.id}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n viewerUserId={null}\n viewerName={notesViewerLabel}\n addActionLabel={commentEmptyState.actionLabel}\n emptyState={{\n title: commentEmptyState.title,\n description: commentEmptyState.description,\n actionLabel: commentEmptyState.actionLabel,\n }}\n translator={t}\n dataAdapter={salesNotesAdapter}\n onActionChange={handleSectionActionChange}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <SalesDocumentAddressesSection\n documentId={record.id}\n kind={kind}\n customerId={record.customerEntityId ?? null}\n shippingAddressId={record.shippingAddressId ?? null}\n billingAddressId={record.billingAddressId ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n billingAddressSnapshot={billingSnapshot ?? null}\n lockedReason={addressGuardMessage}\n onUpdated={(patch) => setRecord((prev) => (prev ? { ...prev, ...patch } : prev))}\n />\n )\n }\n if (activeTab === 'items') {\n return (\n <SalesDocumentItemsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onItemsChange={(items) => setHasItems(items.length > 0)}\n />\n )\n }\n if (activeTab === 'shipments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.shipments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesShipmentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n onActionChange={handleSectionActionChange}\n onAddComment={appendShipmentComment}\n />\n )\n }\n if (activeTab === 'adjustments') {\n return (\n <SalesDocumentAdjustmentsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onRowsChange={setAdjustmentRows}\n />\n )\n }\n if (activeTab === 'payments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.payments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesDocumentPaymentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onPaymentsChange={(payments) => setHasPayments(payments.length > 0)}\n onTotalsChange={(totals) =>\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paidTotalAmount:\n totals?.paidTotalAmount ?? prev.paidTotalAmount ?? null,\n refundedTotalAmount:\n totals?.refundedTotalAmount ?? prev.refundedTotalAmount ?? null,\n outstandingAmount:\n totals?.outstandingAmount ?? prev.outstandingAmount ?? null,\n }\n : prev\n )\n }\n />\n )\n }\n const placeholder =\n tabEmptyStates[activeTab] ??\n {\n title: t('sales.documents.detail.empty.generic', 'Nothing to show here yet.'),\n description: undefined,\n }\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n\n const customFieldValues = React.useMemo(() => {\n const merged: Record<string, unknown> = {}\n if (record?.customValues && typeof record.customValues === 'object' && !Array.isArray(record.customValues)) {\n Object.assign(merged, record.customValues as Record<string, unknown>)\n }\n const rawFields = record?.customFields\n if (Array.isArray(rawFields)) {\n rawFields.forEach((entry) => {\n const key = entry && typeof entry === 'object' && 'key' in entry ? (entry as any).key : null\n const value = entry && typeof entry === 'object' && 'value' in entry ? (entry as any).value : undefined\n if (typeof key === 'string' && key.trim()) merged[key] = value\n })\n } else if (rawFields && typeof rawFields === 'object') {\n Object.assign(merged, rawFields as Record<string, unknown>)\n }\n return prefixCustomFieldValues(merged)\n }, [record?.customFields, record?.customValues])\n\n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.inlineError', 'Unable to update document.'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n accept: (fieldId) => !fieldId.startsWith('cf_'),\n })\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n return\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, customFields: customPayload }),\n },\n { errorMessage: t('sales.documents.detail.inlineError', 'Unable to update document.') },\n )\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('sales.documents.detail.inlineError', 'Unable to update document.')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customFields: customPayload,\n customValues: customPayload,\n }\n : prev,\n )\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n },\n [kind, record, t],\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string): Promise<TagOption[]> => {\n const params = new URLSearchParams({ pageSize: '100' })\n if (query) params.set('search', query)\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/tags?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.tags.loadError', 'Failed to load tags.') },\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items\n .map((item: unknown): TagOption | null => {\n if (!item || typeof item !== 'object') return null\n const raw = item as { id?: unknown; tagId?: unknown; label?: unknown; slug?: unknown; color?: unknown }\n const rawId =\n typeof raw.id === 'string'\n ? raw.id\n : typeof raw.tagId === 'string'\n ? raw.tagId\n : null\n if (!rawId) return null\n const labelValue =\n (typeof raw.label === 'string' && raw.label.trim().length && raw.label.trim()) ||\n (typeof raw.slug === 'string' && raw.slug.trim().length && raw.slug.trim()) ||\n rawId\n const color = typeof raw.color === 'string' && raw.color.trim().length ? raw.color.trim() : null\n return { id: rawId, label: labelValue, color }\n })\n .filter((entry): entry is TagOption => entry !== null)\n },\n [t],\n )\n\n const createTag = React.useCallback(\n async (label: string): Promise<TagOption> => {\n const trimmed = label.trim()\n if (!trimmed.length) {\n throw new Error(t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/tags',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ label: trimmed }),\n },\n { errorMessage: t('sales.documents.detail.tags.createError', 'Failed to create tag.') },\n )\n const payload = response.result ?? {}\n const id =\n typeof payload?.id === 'string'\n ? payload.id\n : typeof (payload as any)?.tagId === 'string'\n ? (payload as any).tagId\n : ''\n if (!id) throw new Error(t('sales.documents.detail.tags.createError', 'Failed to create tag.'))\n const color = typeof (payload as any)?.color === 'string' && (payload as any).color.trim().length\n ? (payload as any).color.trim()\n : null\n return { id, label: trimmed, color }\n },\n [t],\n )\n\n const handleTagsSave = React.useCallback(\n async ({ next }: { next: TagOption[] }) => {\n if (!record) return\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const tagIds = Array.from(new Set(next.map((tag) => tag.id)))\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, tags: tagIds }),\n },\n { errorMessage: t('sales.documents.detail.tags.updateError', 'Failed to update tags.') },\n )\n setRecord((prev) => (prev ? { ...prev, tags: next } : prev))\n setTags(next)\n flash(t('sales.documents.detail.tags.success', 'Tags updated.'), 'success')\n },\n [kind, record, t],\n )\n\n if (loading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] items-center justify-center\">\n <LoadingMessage\n label={t('sales.documents.detail.loading', 'Loading document\u2026')}\n className=\"min-w-[280px] justify-center border-0 bg-transparent text-base shadow-none\"\n />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error}\n action={\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" onClick={() => handleRetry()}>\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => router.push('/backend/sales/documents/create')}\n >\n {t('sales.documents.detail.backToCreate', 'Create a new document')}\n </Button>\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n }\n\n if (!record) return null\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href={kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'}\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('sales.documents.detail.back', 'Back to documents')}</span>\n </Link>\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.detail.order', 'Sales order')\n : t('sales.documents.detail.quote', 'Sales quote')}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <InlineTextEditor\n label={t('sales.documents.detail.number', 'Document number')}\n value={number}\n emptyLabel={t('sales.documents.detail.numberEmpty', 'No number yet')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving number will land soon.'), 'info')}\n variant=\"plain\"\n activateOnClick\n hideLabel\n triggerClassName=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 mt-1\"\n containerClassName=\"max-w-full w-full flex-1 sm:min-w-[28rem] lg:min-w-[36rem] xl:min-w-[44rem]\"\n renderDisplay={({ value: displayValue, emptyLabel }) =>\n displayValue && displayValue.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{displayValue}</span>\n ) : (\n <span className=\"text-muted-foreground\">{emptyLabel}</span>\n )\n }\n onEditingChange={setNumberEditing}\n renderActions={\n numberEditing ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => void handleGenerateNumber()}\n disabled={generating}\n className=\"h-9 w-9\"\n >\n {generating ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Wand2 className=\"h-4 w-4\" />}\n <span className=\"sr-only\">{t('sales.documents.detail.generateNumber', 'Generate number')}</span>\n </Button>\n ) : null\n }\n />\n </div>\n {record.status ? (\n <Badge variant=\"secondary\" className=\"inline-flex items-center gap-2\">\n {statusDisplay?.icon ? renderDictionaryIcon(statusDisplay.icon, 'h-4 w-4') : null}\n <span className=\"inline-flex items-center gap-1\">\n {statusDisplay?.color\n ? renderDictionaryColor(statusDisplay.color, 'h-2.5 w-2.5 rounded-full border border-border/60')\n : <span className=\"h-2.5 w-2.5 rounded-full bg-primary\" />}\n </span>\n <span>{statusDisplay?.label ?? record.status}</span>\n </Badge>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {kind === 'quote' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void handleConvert()}\n disabled={converting}\n >\n {converting ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.documents.detail.convertToOrder', 'Convert to order')}\n </Button>\n ) : null}\n {kind === 'quote' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setSendOpen(true)}\n disabled={!contactEmail || sending}\n >\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.action', 'Send to customer')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleDelete()}\n disabled={deleting}\n className=\"rounded-none border-destructive/40 text-destructive hover:bg-destructive/5 hover:text-destructive\"\n >\n {deleting ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Trash2 className=\"h-4 w-4\" aria-hidden />}\n {t('sales.documents.detail.delete', 'Delete')}\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"md:col-span-3\">\n <CustomerInlineEditor\n label={t('sales.documents.detail.customer', 'Customer')}\n customerId={record.customerEntityId ?? null}\n customerName={customerName}\n customerEmail={contactEmail ?? null}\n customerSnapshot={customerSnapshot}\n customers={customerOptions}\n customerLoading={customerLoading}\n onLoadCustomers={loadCustomers}\n fetchCustomerEmail={fetchCustomerEmail}\n onSave={handleUpdateCustomer}\n onSaveSnapshot={handleUpdateCustomerSnapshot}\n saving={customerSaving}\n error={customerError}\n guardMessage={customerGuardMessage}\n onClearError={clearCustomerError}\n />\n </div>\n <InlineTextEditor\n key=\"date\"\n label={t('sales.documents.detail.date', 'Date')}\n value={\n record?.placedAt\n ? new Date(record.placedAt).toISOString().slice(0, 10)\n : record?.createdAt\n ? new Date(record.createdAt).toISOString().slice(0, 10)\n : null\n }\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdatePlacedAt}\n inputType=\"date\"\n activateOnClick\n containerClassName=\"h-full\"\n saveLabel={t('customers.people.detail.inline.saveShortcut')}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-muted-foreground\">\n {new Date(value).toLocaleDateString()}\n </span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {summaryCards.map((card) => {\n if (card.key === 'email') {\n return (\n <ContactEmailInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n placeholder={card.placeholder}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdateContactEmail}\n renderDisplay={renderEmailDisplay}\n recordId={contactRecordId}\n />\n )\n }\n if (card.key === 'channel') {\n return (\n <ChannelInlineEditor\n key={card.key}\n label={card.title}\n value={record?.channelId ?? null}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={channelOptions}\n loading={channelLoading}\n onLoadOptions={loadChannels}\n onSave={handleUpdateChannel}\n saveLabel={saveShortcutLabel}\n />\n )\n }\n if (card.key === 'status') {\n return (\n <StatusInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={statusOptionsForEditor}\n onSave={handleUpdateStatus}\n onLoadOptions={loadStatuses}\n labels={statusLabels}\n manageHref=\"/backend/config/sales\"\n loading={statusLoading}\n saveLabel={saveShortcutLabel}\n dictionaryMap={statusDictionaryMap}\n />\n )\n }\n if (card.key === 'date') {\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType=\"date\"\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-foreground\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n )\n }\n if (card.key === 'currency') {\n return (\n <CurrencyInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={currencyOptions}\n labels={currencyLabels}\n error={currencyError}\n onClearError={() => setCurrencyError(null)}\n locked={currencyLocked}\n onLocked={() => {\n if (currencyLockMessage) {\n flash(currencyLockMessage, 'error')\n }\n }}\n onSave={async (next) => {\n setCurrencyError(null)\n try {\n await handleUpdateCurrency(next)\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCurrencyError(message)\n throw err\n }\n }}\n />\n )\n }\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n placeholder={card.placeholder}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType={card.type === 'email' ? 'email' : 'text'}\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={(params) =>\n card.key === 'email'\n ? renderEmailDisplay(params)\n : params.value && params.value.length\n ? <span className=\"text-base font-medium\">{params.value}</span>\n : <span className=\"text-sm text-muted-foreground\">{params.emptyLabel}</span>\n }\n />\n )\n })}\n </div>\n\n <div>\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-2 pb-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {tabButtons.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={cn(\n 'px-3 py-2 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-b-2 border-primary text-primary'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => setActiveTab(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {sectionAction ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSectionAction}\n disabled={sectionAction.disabled}\n >\n {sectionAction.icon ?? <Plus className=\"mr-2 h-4 w-4\" />}\n {sectionAction.label}\n </Button>\n ) : null}\n </div>\n {renderTabContent()}\n </div>\n\n <DocumentTotals\n title={t('sales.documents.detail.totals.title', 'Totals')}\n currency={record.currencyCode ?? null}\n items={totalsItems}\n />\n\n <div className=\"space-y-4\" ref={detailSectionRef}>\n <p className=\"text-sm font-semibold\">{t('sales.documents.detail.details', 'Details')}</p>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId={detailsInjectionSpotId}\n context={injectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n </div>\n\n <div className=\"space-y-4\">\n <CustomDataSection\n title={t('sales.documents.detail.customData', 'Custom data')}\n entityIds={[kind === 'order' ? E.sales.sales_order : E.sales.sales_quote]}\n values={customFieldValues}\n onSubmit={handleCustomFieldsSubmit}\n labels={customDataLabels}\n />\n <TagsSection\n title={t('sales.documents.detail.tags', 'Tags')}\n tags={tags}\n onChange={setTags}\n isSubmitting={false}\n canEdit\n loadOptions={loadTagOptions}\n createTag={createTag}\n onSave={({ next }) => handleTagsSave({ next })}\n labels={tagLabels}\n />\n </div>\n </PageBody>\n\n <Dialog open={sendOpen} onOpenChange={setSendOpen}>\n <DialogContent\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSendOpen(false)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!sending) void handleSendQuote()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{t('sales.quotes.send.title', 'Send quote to customer')}</DialogTitle>\n <DialogDescription>\n {t('sales.quotes.send.description', 'Email will be sent to:')} {contactEmail ?? t('sales.quotes.send.noEmail', 'No email')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('sales.quotes.send.validForDays', 'Valid for (days)')}</label>\n <Input\n type=\"number\"\n min={1}\n max={365}\n value={validForDays}\n onChange={(e) => setValidForDays(Number(e.target.value || 14))}\n disabled={sending}\n />\n </div>\n <DialogFooter>\n <Button variant=\"secondary\" onClick={() => setSendOpen(false)} disabled={sending}>\n {t('sales.quotes.send.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void handleSendQuote()} disabled={sending || !contactEmail}>\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.submit', 'Send quote')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams, useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport {\n CustomDataSection,\n DetailFieldsSection,\n ErrorMessage,\n InlineTextEditor,\n LoadingMessage,\n TabEmptyState,\n TagsSection,\n type TagOption,\n} from '@open-mercato/ui/backend/detail'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Building2, CreditCard, Mail, Pencil, Plus, Store, Trash2, Truck, UserRound, Wand2, X } from 'lucide-react'\nimport Link from 'next/link'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { DocumentCustomerCard } from '@open-mercato/core/modules/sales/components/DocumentCustomerCard'\nimport { SalesDocumentAddressesSection } from '@open-mercato/core/modules/sales/components/documents/AddressesSection'\nimport { SalesDocumentItemsSection } from '@open-mercato/core/modules/sales/components/documents/ItemsSection'\nimport { SalesDocumentPaymentsSection } from '@open-mercato/core/modules/sales/components/documents/PaymentsSection'\nimport { SalesDocumentAdjustmentsSection } from '@open-mercato/core/modules/sales/components/documents/AdjustmentsSection'\nimport type { AdjustmentRowData } from '@open-mercato/core/modules/sales/components/documents/AdjustmentDialog'\nimport { SalesShipmentsSection } from '@open-mercato/core/modules/sales/components/documents/ShipmentsSection'\nimport { DocumentTotals } from '@open-mercato/core/modules/sales/components/documents/DocumentTotals'\nimport { E } from '#generated/entities.ids.generated'\nimport type { DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport type { SalesAdjustmentKind } from '@open-mercato/core/modules/sales/data/entities'\nimport { DictionaryValue, createDictionaryMap, renderDictionaryColor, renderDictionaryIcon, type DictionaryMap } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { DictionaryEntrySelect } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { NotesSection, mapCommentSummary, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'\nimport {\n emitSalesDocumentTotalsRefresh,\n subscribeSalesDocumentTotalsRefresh,\n} from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport type { CommentSummary, SectionAction } from '@open-mercato/ui/backend/detail'\nimport { ICON_SUGGESTIONS } from '@open-mercato/core/modules/customers/lib/dictionaries'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '@open-mercato/core/modules/customers/lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\n\nfunction CurrencyInlineEditor({\n label,\n value,\n options,\n labels,\n emptyLabel,\n onSave,\n error,\n onClearError,\n locked,\n onLocked,\n}: {\n label: string\n value: string | null | undefined\n options: { value: string; label: string; color?: string | null; icon?: string | null }[]\n labels: DictionarySelectLabels\n emptyLabel: string\n onSave: (next: string | null) => Promise<void>\n error: string | null\n onClearError: () => void\n locked?: boolean\n onLocked?: () => void\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const normalizedValue = React.useMemo(() => (typeof value === 'string' ? value.toUpperCase() : undefined), [value])\n const [draft, setDraft] = React.useState<string | undefined>(normalizedValue)\n const [saving, setSaving] = React.useState(false)\n const appearanceMap = React.useMemo(\n () =>\n createDictionaryMap(\n options.map((option) => ({\n value: option.value.toUpperCase(),\n label: option.label,\n color: option.color ?? undefined,\n icon: option.icon ?? undefined,\n }))\n ),\n [options]\n )\n\n React.useEffect(() => {\n if (!editing) setDraft(normalizedValue)\n }, [editing, normalizedValue])\n\n React.useEffect(() => {\n if (locked && editing) {\n setEditing(false)\n }\n }, [editing, locked])\n\n const fetchOptions = React.useCallback(async () => options, [options])\n\n const handleLocked = React.useCallback(() => {\n if (onLocked) onLocked()\n }, [onLocked])\n\n const handleActivate = React.useCallback(() => {\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (!editing) {\n setEditing(true)\n }\n }, [editing, handleLocked, locked, onClearError])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n try {\n onClearError()\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n console.error('sales.documents.currency.save', err)\n } finally {\n setSaving(false)\n }\n }, [draft, onClearError, onSave])\n\n return (\n <div\n className={cn(\n 'group rounded-lg border bg-card p-4',\n !editing ? 'cursor-pointer' : null,\n locked ? 'cursor-not-allowed opacity-80' : null\n )}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n onClearError()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) {\n void handleSave()\n }\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ? next.toUpperCase() : undefined)}\n fetchOptions={fetchOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={labels}\n />\n <DictionaryValue\n value={draft ?? normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n onClearError()\n setEditing(false)\n setDraft(value ?? undefined)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <DictionaryValue\n value={normalizedValue ?? null}\n map={appearanceMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"mt-1 inline-flex items-center gap-2 text-sm text-foreground\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded border border-border bg-background\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-2.5 w-2.5 rounded-full border border-border/60\"\n />\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (locked) {\n onClearError()\n handleLocked()\n return\n }\n if (editing) {\n onClearError()\n setDraft(value ?? undefined)\n }\n setEditing((prev) => !prev)\n }}\n aria-disabled={locked ? true : undefined}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype SnapshotDraft = {\n displayName: string\n kind: 'company' | 'person'\n primaryEmail: string\n primaryPhone: string\n firstName: string\n lastName: string\n legalName: string\n}\n\nfunction createSnapshotDraft(\n snapshot: CustomerSnapshot | null,\n fallbackName: string | null,\n fallbackEmail: string | null,\n): SnapshotDraft {\n const customer = snapshot?.customer ?? null\n const personProfile = customer?.personProfile ?? snapshot?.contact ?? null\n const companyProfile = customer?.companyProfile ?? null\n const resolvedKind: 'company' | 'person' =\n customer?.kind === 'person' || snapshot?.contact ? 'person' : 'company'\n return {\n displayName:\n (customer?.displayName && customer.displayName.trim()) ||\n (fallbackName && fallbackName.trim()) ||\n '',\n kind: resolvedKind,\n primaryEmail:\n (customer?.primaryEmail && customer.primaryEmail.trim()) ||\n (fallbackEmail && fallbackEmail.trim()) ||\n '',\n primaryPhone: (customer?.primaryPhone && customer.primaryPhone.trim()) || '',\n firstName: (personProfile?.firstName && personProfile.firstName.trim()) || '',\n lastName: (personProfile?.lastName && personProfile.lastName.trim()) || '',\n legalName: (companyProfile?.legalName && companyProfile.legalName.trim()) || '',\n }\n}\n\nfunction CustomerInlineEditor({\n label,\n customerId,\n customerName,\n customerEmail,\n customerSnapshot,\n customers,\n customerLoading,\n onLoadCustomers,\n fetchCustomerEmail,\n onSave,\n onSaveSnapshot,\n saving,\n error,\n guardMessage,\n onClearError,\n}: {\n label: string\n customerId: string | null\n customerName: string | null\n customerEmail: string | null | undefined\n customerSnapshot: CustomerSnapshot | null\n customers: CustomerOption[]\n customerLoading: boolean\n onLoadCustomers: (query?: string) => Promise<CustomerOption[]>\n fetchCustomerEmail: (id: string, kindHint?: 'person' | 'company') => Promise<string | null>\n onSave: (id: string | null, email: string | null) => Promise<void>\n onSaveSnapshot: (snapshot: CustomerSnapshot) => Promise<void>\n saving: boolean\n error: string | null\n guardMessage?: string | null\n onClearError: () => void\n}) {\n const t = useT()\n const [mode, setMode] = React.useState<'select' | 'snapshot' | null>(null)\n const [draftId, setDraftId] = React.useState<string | null>(customerId)\n const [draftEmail, setDraftEmail] = React.useState<string | null>(customerEmail ?? null)\n const [snapshotDraft, setSnapshotDraft] = React.useState<SnapshotDraft>(() =>\n createSnapshotDraft(customerSnapshot, customerName, customerEmail ?? null),\n )\n const selectedRef = React.useRef<string | null>(customerId)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n\n const currentLabel = React.useMemo(() => {\n if (customerName && customerName.trim().length) return customerName\n const match = customers.find((entry) => entry.id === customerId)\n return match?.label ?? null\n }, [customerId, customerName, customers])\n\n React.useEffect(() => {\n selectedRef.current = draftId\n }, [draftId])\n\n React.useEffect(() => {\n if (mode !== 'select') {\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n onClearError()\n }\n }, [customerEmail, customerId, mode, onClearError])\n\n React.useEffect(() => {\n if (mode !== 'snapshot') {\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }\n }, [customerEmail, customerSnapshot, currentLabel, mode])\n\n React.useEffect(() => {\n if (mode !== 'select') return\n const labelValue = currentLabel\n if (labelValue && customerQuerySetter.current) {\n customerQuerySetter.current(labelValue)\n }\n void onLoadCustomers(labelValue ?? undefined)\n }, [currentLabel, mode, onLoadCustomers])\n\n const handleSelectActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('select')\n void onLoadCustomers()\n }, [guardMessage, onClearError, onLoadCustomers])\n\n const handleSnapshotActivate = React.useCallback(() => {\n if (guardMessage) {\n onClearError()\n flash(guardMessage, 'error')\n return\n }\n setMode('snapshot')\n }, [guardMessage, onClearError])\n\n const handleCancel = React.useCallback(() => {\n onClearError()\n setMode(null)\n setDraftId(customerId)\n setDraftEmail(customerEmail ?? null)\n setSnapshotDraft(createSnapshotDraft(customerSnapshot, currentLabel, customerEmail ?? null))\n }, [customerEmail, customerId, customerSnapshot, currentLabel, onClearError])\n\n const buildSnapshotPayload = React.useCallback((): CustomerSnapshot => {\n const kind = snapshotDraft.kind\n const displayNameRaw = snapshotDraft.displayName.trim()\n const primaryEmailRaw = snapshotDraft.primaryEmail.trim()\n const primaryPhoneRaw = snapshotDraft.primaryPhone.trim()\n const firstNameRaw = snapshotDraft.firstName.trim()\n const lastNameRaw = snapshotDraft.lastName.trim()\n const legalNameRaw = snapshotDraft.legalName.trim()\n const nameFromParts =\n kind === 'person'\n ? [firstNameRaw, lastNameRaw].filter((value) => value.length).join(' ').trim()\n : legalNameRaw\n const resolvedDisplayName = displayNameRaw || nameFromParts || null\n const baseCustomer = customerSnapshot?.customer ?? {}\n const nextPersonProfile =\n kind === 'person'\n ? {\n ...(baseCustomer.personProfile ?? customerSnapshot?.contact ?? {}),\n firstName: firstNameRaw || null,\n lastName: lastNameRaw || null,\n }\n : null\n const nextCompanyProfile =\n kind === 'company'\n ? { ...(baseCustomer.companyProfile ?? {}), legalName: legalNameRaw || null }\n : null\n return {\n ...(customerSnapshot ?? {}),\n customer: {\n ...baseCustomer,\n kind,\n displayName: resolvedDisplayName,\n primaryEmail: primaryEmailRaw || null,\n primaryPhone: primaryPhoneRaw || null,\n personProfile: nextPersonProfile,\n companyProfile: nextCompanyProfile,\n },\n contact: customerSnapshot?.contact ?? null,\n }\n }, [customerSnapshot, snapshotDraft])\n\n const handleSaveSelection = React.useCallback(async () => {\n try {\n onClearError()\n await onSave(draftId, draftEmail)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.save', err)\n }\n }, [draftEmail, draftId, onClearError, onSave])\n\n const handleSaveSnapshot = React.useCallback(async () => {\n try {\n onClearError()\n const payload = buildSnapshotPayload()\n await onSaveSnapshot(payload)\n setMode(null)\n } catch (err) {\n console.error('sales.documents.customer.snapshot.save', err)\n }\n }, [buildSnapshotPayload, onClearError, onSaveSnapshot])\n\n if (mode === 'select') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSelection()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0 space-y-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <LookupSelect\n value={draftId}\n onChange={(next) => {\n setDraftId(next)\n setDraftEmail(null)\n selectedRef.current = next\n if (!next) return\n const match = customers.find((entry) => entry.id === next)\n if (match?.primaryEmail) {\n setDraftEmail(match.primaryEmail)\n } else {\n const selectedId = next\n fetchCustomerEmail(selectedId, match?.kind)\n .then((resolved) => {\n if (resolved && selectedRef.current === selectedId) setDraftEmail(resolved)\n })\n .catch(() => {})\n }\n }}\n fetchItems={async (query) => {\n const options = await onLoadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) =>\n t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })\n }\n />\n {customerLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n </p>\n ) : null}\n {draftEmail ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"truncate\">{draftEmail}</span>\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSelection()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n }\n\n if (mode === 'snapshot') {\n return (\n <div\n className=\"group h-full rounded-lg border bg-card p-4\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n handleCancel()\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSaveSnapshot()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.detail.customerSnapshot.hint', 'Edit the snapshot stored on this document.')}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={handleCancel}\n aria-label={t('ui.detail.inline.cancel', 'Cancel')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"mt-3 space-y-3\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.displayName.label', 'Display name')}\n </label>\n <Input\n value={snapshotDraft.displayName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, displayName: event.target.value }))}\n placeholder={t('customers.people.form.displayName.placeholder', 'Enter display name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('sales.documents.detail.customerSnapshot.kind', 'Customer type')}\n </label>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'company' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'company' }))}\n >\n {t('customers.widgets.newCustomers.kind.company', 'Company')}\n </Button>\n <Button\n type=\"button\"\n variant={snapshotDraft.kind === 'person' ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => setSnapshotDraft((prev) => ({ ...prev, kind: 'person' }))}\n >\n {t('customers.widgets.newCustomers.kind.person', 'Person')}\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryEmail', 'Primary email')}\n </label>\n <Input\n type=\"email\"\n value={snapshotDraft.primaryEmail}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryEmail: event.target.value }))}\n placeholder={t('customers.people.form.primaryEmailPlaceholder', 'name@example.com')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.detail.highlights.primaryPhone', 'Primary phone')}\n </label>\n <Input\n type=\"tel\"\n value={snapshotDraft.primaryPhone}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, primaryPhone: event.target.value }))}\n placeholder={t('customers.people.form.primaryPhonePlaceholder', '+00 000 000 000')}\n />\n </div>\n </div>\n\n {snapshotDraft.kind === 'person' ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.firstName', 'First name')}\n </label>\n <Input\n value={snapshotDraft.firstName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, firstName: event.target.value }))}\n placeholder={t('customers.people.form.firstName', 'First name')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.people.form.lastName', 'Last name')}\n </label>\n <Input\n value={snapshotDraft.lastName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, lastName: event.target.value }))}\n placeholder={t('customers.people.form.lastName', 'Last name')}\n />\n </div>\n </div>\n ) : (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium text-foreground\">\n {t('customers.companies.detail.fields.legalName', 'Legal name')}\n </label>\n <Input\n value={snapshotDraft.legalName}\n onChange={(event) => setSnapshotDraft((prev) => ({ ...prev, legalName: event.target.value }))}\n placeholder={t('customers.companies.detail.fields.legalNamePlaceholder', 'Add legal name')}\n />\n </div>\n )}\n\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSaveSnapshot()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut')}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleCancel} disabled={saving}>\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <DocumentCustomerCard\n label={label}\n name={customerName ?? null}\n email={customerEmail ?? undefined}\n kind={customerSnapshot?.customer?.kind === 'person' ? 'person' : 'company'}\n className=\"h-full\"\n onEditSnapshot={handleSnapshotActivate}\n onSelectCustomer={handleSelectActivate}\n />\n )\n}\n\ntype CustomerSnapshot = {\n customer?: {\n id?: string | null\n kind?: 'person' | 'company' | null\n displayName?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n personProfile?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n companyProfile?: {\n id?: string | null\n legalName?: string | null\n brandName?: string | null\n domain?: string | null\n websiteUrl?: string | null\n } | null\n } | null\n contact?: {\n id?: string | null\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype AddressSnapshot = {\n name?: string | null\n companyName?: string | null\n addressLine1?: string | null\n addressLine2?: string | null\n city?: string | null\n region?: string | null\n postalCode?: string | null\n country?: string | null\n}\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = {\n id: string\n label: string\n}\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n carrierCode?: string | null\n serviceLevel?: string | null\n estimatedTransitDays?: number | null\n currencyCode?: string | null\n baseRateNet?: string | null\n baseRateGross?: string | null\n providerKey?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n description?: string | null\n providerKey?: string | null\n terms?: string | null\n providerSettings?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\ntype DocumentRecord = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n statusEntryId?: string | null\n currencyCode?: string | null\n customerEntityId?: string | null\n billingAddressId?: string | null\n shippingAddressId?: string | null\n customerReference?: string | null\n externalReference?: string | null\n channelId?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n customerSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n channelCode?: string | null\n comment?: string | null\n subtotalNetAmount?: number | null\n subtotalGrossAmount?: number | null\n discountTotalAmount?: number | null\n taxTotalAmount?: number | null\n shippingNetAmount?: number | null\n shippingGrossAmount?: number | null\n surchargeTotalAmount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n createdAt?: string\n updatedAt?: string\n metadata?: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n tags?: TagOption[] | null\n}\n\ntype DocumentUpdateResult = {\n externalReference?: string | null\n customerReference?: string | null\n comment?: string | null\n currencyCode?: string | null\n placedAt?: string | null\n expectedDeliveryAt?: string | null\n statusEntryId?: string | null\n status?: string | null\n channelId?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n shippingAddressSnapshot?: Record<string, unknown> | null\n billingAddressSnapshot?: Record<string, unknown> | null\n shippingMethodId?: string | null\n shippingMethodCode?: string | null\n shippingMethodSnapshot?: Record<string, unknown> | null\n paymentMethodId?: string | null\n paymentMethodCode?: string | null\n paymentMethodSnapshot?: Record<string, unknown> | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n customerName?: string | null\n contactEmail?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.filter((entry) => entry !== undefined)\n }\n if (value === undefined) return null\n return value\n}\n\nconst prefixCustomFieldValues = (input: Record<string, unknown> | null | undefined): Record<string, unknown> => {\n if (!input || typeof input !== 'object') return {}\n return Object.entries(input).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const normalized = key.startsWith('cf_') ? key : `cf_${key}`\n acc[normalized] = value\n return acc\n }, {})\n}\n\nconst resolveLineItemCount = (record: unknown): number | null => {\n if (!record || typeof record !== 'object') return null\n const current = (record as any).lineItemCount ?? (record as any).line_item_count\n if (typeof current !== 'number') return null\n return Number.isFinite(current) ? current : null\n}\n\nasync function fetchDocument(id: string, kind: 'order' | 'quote', errorMessage: string): Promise<DocumentRecord | null> {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const payload = await readApiResultOrThrow<{ items?: DocumentRecord[] }>(\n `/api/sales/${kind === 'order' ? 'orders' : 'quotes'}?${params.toString()}`,\n undefined,\n { errorMessage }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.length ? (items[0] as DocumentRecord) : null\n}\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const displayName =\n typeof snapshot.customer?.displayName === 'string' && snapshot.customer.displayName.trim().length\n ? snapshot.customer.displayName.trim()\n : null\n if (displayName) return displayName\n const contact = snapshot.contact ?? null\n const personProfile = snapshot.customer?.personProfile ?? null\n const preferred =\n (contact?.preferredName && contact.preferredName.trim()) ||\n (personProfile?.preferredName && personProfile.preferredName.trim()) ||\n null\n const firstName =\n (contact?.firstName && contact.firstName.trim()) ||\n (personProfile?.firstName && personProfile.firstName.trim()) ||\n null\n const lastName =\n (contact?.lastName && contact.lastName.trim()) ||\n (personProfile?.lastName && personProfile.lastName.trim()) ||\n null\n const parts = [preferred ?? firstName, lastName].filter((part) => part && part.length)\n if (parts.length) return parts.join(' ')\n const legalName =\n (snapshot.customer?.companyProfile?.legalName &&\n snapshot.customer.companyProfile.legalName.trim()) ||\n null\n if (legalName) return legalName\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n const primary =\n (snapshot.customer?.primaryEmail && snapshot.customer.primaryEmail.trim()) ||\n null\n if (primary) return primary\n return null\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction SectionCard({\n title,\n action,\n children,\n muted,\n}: {\n title: string\n action?: React.ReactNode\n children: React.ReactNode\n muted?: boolean\n}) {\n return (\n <div className={cn('rounded border p-4', muted ? 'bg-muted/30' : 'bg-card')}>\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{title}</p>\n {action}\n </div>\n {children}\n </div>\n )\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction ContactEmailInlineEditor({\n label,\n value,\n placeholder,\n emptyLabel,\n onSave,\n renderDisplay,\n recordId,\n}: {\n label: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel: string\n renderDisplay: (params: { value: string | null | undefined; emptyLabel: string }) => React.ReactNode\n onSave: (next: string | null) => Promise<void>\n recordId?: string | null\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState(value ?? '')\n const [error, setError] = React.useState<string | null>(null)\n const [saving, setSaving] = React.useState(false)\n const trimmedDraft = React.useMemo(() => draft.trim(), [draft])\n const isValidEmail = React.useMemo(() => {\n if (!trimmedDraft.length) return true\n return EMAIL_REGEX.test(trimmedDraft)\n }, [trimmedDraft])\n const { duplicate, checking } = useEmailDuplicateCheck(draft, {\n recordId: typeof recordId === 'string' ? recordId : null,\n disabled: !editing || !!error || saving || !trimmedDraft.length || !isValidEmail,\n matchMode: 'prefix',\n })\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? '')\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const normalized = trimmedDraft.length ? trimmedDraft : ''\n if (normalized.length && !EMAIL_REGEX.test(normalized)) {\n setError(t('customers.people.detail.inline.emailInvalid', 'Enter a valid email address.'))\n return\n }\n setError(null)\n setSaving(true)\n try {\n await onSave(normalized.length ? normalized : null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.people.detail.inline.error', 'Failed to save value.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [onSave, t, trimmedDraft])\n\n const interactiveProps =\n !editing && !saving\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: () => setEditing(true),\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n }\n },\n }\n : {}\n\n return (\n <div className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" {...interactiveProps}>\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <form\n className=\"mt-2 space-y-2\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!saving) void handleSave()\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n className=\"w-full rounded-md border pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n value={draft}\n onChange={(event) => {\n if (error) setError(null)\n setDraft(event.target.value)\n }}\n placeholder={placeholder}\n type=\"email\"\n autoFocus\n spellCheck={false}\n />\n </div>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n {!error && duplicate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.people.detail.inline.emailDuplicate', undefined, { name: duplicate.displayName })}{' '}\n <Link\n className=\"font-medium text-primary underline underline-offset-2\"\n href={`/backend/customers/people/${duplicate.id}`}\n >\n {t('customers.people.detail.inline.emailDuplicateLink')}\n </Link>\n </p>\n ) : null}\n {!error && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.detail.inline.emailChecking')}</p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {t('customers.people.detail.inline.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? '')\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"mt-1\">{renderDisplay({ value, emptyLabel })}</div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? '')\n setError(null)\n }\n setEditing((prev) => !prev)\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n disabled={saving}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction ChannelInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: ChannelOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<ChannelOption[]>\n onSave: (next: string | null) => Promise<void>\n saveLabel: string\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const current = React.useMemo(\n () => (draft ?? value ? options.find((opt) => opt.id === (draft ?? value)) ?? null : null),\n [draft, options, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n const query = current?.label ?? value ?? ''\n setSearchQueryRef.current(query)\n }, [current?.label, editing, value])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleActivate = React.useCallback(() => {\n if (!editing) {\n setEditing(true)\n prefillSearch()\n void onLoadOptions()\n }\n }, [editing, onLoadOptions, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={handleActivate}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleActivate()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm text-foreground\">\n {current ? (\n <span className=\"text-sm\">{current.label}</span>\n ) : value ? (\n <span className=\"text-sm\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\ntype MethodOption = ShippingMethodOption | PaymentMethodOption\n\nfunction MethodInlineEditor({\n label,\n value,\n snapshot,\n emptyLabel,\n options,\n loading,\n onLoadOptions,\n onSave,\n saveLabel,\n placeholder,\n loadingLabel,\n emptyResultsLabel,\n selectedHint,\n icon,\n allowClear = true,\n}: {\n label: string\n value: string | null | undefined\n snapshot: Record<string, unknown> | null\n emptyLabel: string\n options: MethodOption[]\n loading: boolean\n onLoadOptions: (query?: string) => Promise<MethodOption[]>\n onSave: (nextId: string | null) => Promise<void>\n saveLabel: string\n placeholder: string\n loadingLabel: string\n emptyResultsLabel: string\n selectedHint: (id: string) => string\n icon: React.ReactNode\n allowClear?: boolean\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | null>(value ?? null)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const setSearchQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const containerClasses = cn(\n 'group relative rounded border bg-muted/30 p-3',\n !editing ? 'cursor-pointer' : null\n )\n\n const triggerClasses = cn(\n 'h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150',\n editing\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100'\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? null)\n setError(null)\n }\n }, [editing, value])\n\n React.useEffect(() => {\n if (!editing) setSearchQueryRef.current = null\n }, [editing])\n\n const resolveDisplay = React.useCallback(\n (id: string | null | undefined): { label: string | null; description: string | null } => {\n if (!id) return { label: null, description: null }\n const option = options.find((entry) => entry.id === id)\n if (option) {\n return {\n label: option.name ?? option.code,\n description: option.description ?? null,\n }\n }\n const snapName =\n snapshot && typeof (snapshot as any)?.name === 'string' ? (snapshot as any).name : null\n const snapCode =\n snapshot && typeof (snapshot as any)?.code === 'string' ? (snapshot as any).code : null\n const snapDescription =\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null\n return {\n label: snapName ?? snapCode ?? id,\n description: snapDescription,\n }\n },\n [options, snapshot]\n )\n\n const currentDisplay = React.useMemo(\n () => resolveDisplay(draft ?? value ?? null),\n [draft, resolveDisplay, value]\n )\n\n const prefillSearch = React.useCallback(() => {\n if (!editing || !setSearchQueryRef.current) return\n setSearchQueryRef.current('')\n }, [editing])\n\n React.useEffect(() => {\n if (editing) prefillSearch()\n }, [editing, prefillSearch])\n\n const handleSave = React.useCallback(async () => {\n setSaving(true)\n setError(null)\n try {\n await onSave(draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, t])\n\n return (\n <div\n className={containerClasses}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (editing) return\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n prefillSearch()\n void onLoadOptions('')\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <LookupSelect\n value={draft}\n onChange={setDraft}\n fetchItems={async (query) => {\n const items = await onLoadOptions(query)\n return items.map<LookupSelectItem>((item) => ({\n id: item.id,\n title: item.name ?? item.code,\n subtitle: item.code,\n icon: icon,\n }))\n }}\n minQuery={0}\n onReady={({ setQuery }) => {\n setSearchQueryRef.current = setQuery\n prefillSearch()\n }}\n searchPlaceholder={placeholder}\n loadingLabel={loadingLabel}\n emptyLabel={emptyResultsLabel}\n selectedHintLabel={(id) => selectedHint(id)}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n {allowClear ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDraft(null)}\n disabled={saving}\n >\n {t('ui.actions.clear', 'Clear')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? null)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n {currentDisplay.label ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm\">{currentDisplay.label}</span>\n {currentDisplay.description ? (\n <p className=\"text-xs text-muted-foreground\">{currentDisplay.description}</p>\n ) : null}\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )}\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={triggerClasses}\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(value ?? null)\n setError(null)\n }\n setEditing((prev) => {\n const next = !prev\n if (!prev && next) prefillSearch()\n return next\n })\n void onLoadOptions('')\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction StatusInlineEditor({\n label,\n value,\n emptyLabel,\n options,\n onSave,\n onLoadOptions,\n labels,\n manageHref,\n loading,\n saveLabel,\n dictionaryMap,\n}: {\n label: string\n value: string | null | undefined\n emptyLabel: string\n options: StatusOption[]\n onSave: (entryId: string | null, value: string | null) => Promise<void>\n onLoadOptions: () => Promise<StatusOption[]>\n labels: DictionarySelectLabels\n manageHref?: string\n loading: boolean\n saveLabel: string\n dictionaryMap: DictionaryMap\n}) {\n const t = useT()\n const [editing, setEditing] = React.useState(false)\n const [draft, setDraft] = React.useState<string | undefined>(value ?? undefined)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const fetchStatusOptions = React.useCallback(\n async () =>\n (await onLoadOptions()).map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n [onLoadOptions]\n )\n\n React.useEffect(() => {\n if (!editing) {\n setDraft(value ?? undefined)\n setError(null)\n }\n }, [editing, value])\n\n const handleSave = React.useCallback(async () => {\n const selected = draft ? options.find((opt) => opt.value === draft) ?? null : null\n if (draft && !selected) {\n setError(t('sales.documents.detail.statusInvalid', 'Selected status could not be found.'))\n return\n }\n setSaving(true)\n setError(null)\n try {\n await onSave(selected?.id ?? null, draft ?? null)\n setEditing(false)\n } catch (err) {\n const message =\n err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setError(message)\n } finally {\n setSaving(false)\n }\n }, [draft, onSave, options, t])\n\n return (\n <div\n className={cn('group rounded-lg border bg-card p-4', !editing ? 'cursor-pointer' : null)}\n role={!editing ? 'button' : undefined}\n tabIndex={!editing ? 0 : undefined}\n onClick={() => {\n if (!editing) {\n setEditing(true)\n void onLoadOptions()\n }\n }}\n onKeyDown={(event) => {\n if (editing) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setEditing(true)\n void onLoadOptions()\n }\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">{label}</p>\n {editing ? (\n <div\n className=\"mt-2 space-y-2\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving) void handleSave()\n }\n }}\n >\n <DictionaryEntrySelect\n value={draft}\n onChange={(next) => setDraft(next ?? undefined)}\n fetchOptions={fetchStatusOptions}\n allowInlineCreate={false}\n allowAppearance\n manageHref={manageHref}\n labels={labels}\n />\n {loading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {labels.loadingLabel}\n </p>\n ) : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={saving}>\n {saving ? <Spinner className=\"mr-2 h-3.5 w-3.5 animate-spin\" /> : null}\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false)\n setDraft(value ?? undefined)\n setError(null)\n }}\n disabled={saving}\n >\n {t('ui.detail.inline.cancel', 'Cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"mt-1 text-sm\">\n <DictionaryValue\n value={value}\n map={dictionaryMap}\n fallback={<span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>}\n className=\"text-sm\"\n iconWrapperClassName=\"inline-flex h-6 w-6 items-center justify-center rounded border border-border bg-card\"\n iconClassName=\"h-4 w-4\"\n colorClassName=\"h-3 w-3 rounded-full\"\n />\n </div>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground transition-opacity duration-150 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n if (editing) {\n setDraft(normalizedValue)\n setError(null)\n }\n setEditing((prev) => !prev)\n void onLoadOptions()\n }}\n aria-label={editing ? t('ui.detail.inline.cancel', 'Cancel') : t('ui.detail.inline.edit', 'Edit')}\n >\n {editing ? <X className=\"h-4 w-4\" /> : <Pencil className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n\nexport default function SalesDocumentDetailPage({\n params,\n initialKind,\n}: {\n params: { id: string }\n initialKind?: 'order' | 'quote'\n}) {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [loading, setLoading] = React.useState(true)\n const [record, setRecord] = React.useState<DocumentRecord | null>(null)\n const [tags, setTags] = React.useState<TagOption[]>([])\n const [kind, setKind] = React.useState<'order' | 'quote'>('quote')\n const [error, setError] = React.useState<string | null>(null)\n const [reloadKey, setReloadKey] = React.useState(0)\n const [activeTab, setActiveTab] = React.useState<string>('comments')\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const detailSectionRef = React.useRef<HTMLDivElement | null>(null)\n const [generating, setGenerating] = React.useState(false)\n const [converting, setConverting] = React.useState(false)\n const [deleting, setDeleting] = React.useState(false)\n const [sending, setSending] = React.useState(false)\n const [sendOpen, setSendOpen] = React.useState(false)\n const [validForDays, setValidForDays] = React.useState(14)\n const [numberEditing, setNumberEditing] = React.useState(false)\n const [currencyError, setCurrencyError] = React.useState<string | null>(null)\n const [hasItems, setHasItems] = React.useState(false)\n const [hasPayments, setHasPayments] = React.useState(false)\n const [customerOptions, setCustomerOptions] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [customerSaving, setCustomerSaving] = React.useState(false)\n const [customerError, setCustomerError] = React.useState<string | null>(null)\n const [editingGuards, setEditingGuards] = React.useState<{\n customer: string[] | null\n addresses: string[] | null\n } | null>(null)\n const [channelOptions, setChannelOptions] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const channelOptionsRef = React.useRef<Map<string, ChannelOption>>(new Map())\n const [shippingMethodOptions, setShippingMethodOptions] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const shippingMethodOptionsRef = React.useRef<Map<string, ShippingMethodOption>>(new Map())\n const [paymentMethodOptions, setPaymentMethodOptions] = React.useState<PaymentMethodOption[]>([])\n const [paymentMethodLoading, setPaymentMethodLoading] = React.useState(false)\n const paymentMethodOptionsRef = React.useRef<Map<string, PaymentMethodOption>>(new Map())\n const [statusOptions, setStatusOptions] = React.useState<StatusOption[]>([])\n const [statusLoading, setStatusLoading] = React.useState(false)\n const statusOptionsRef = React.useRef<Map<string, StatusOption>>(new Map())\n const [adjustmentRows, setAdjustmentRows] = React.useState<AdjustmentRowData[]>([])\n const clearCustomerError = React.useCallback(() => setCustomerError(null), [])\n const { data: currencyDictionary } = useCurrencyDictionary()\n const scopeVersion = useOrganizationScopeVersion()\n const parseNumber = React.useCallback((value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return NaN\n }, [])\n\n const loadErrorMessage = React.useMemo(\n () => t('sales.documents.detail.error', 'Document not found or inaccessible.'),\n [t]\n )\n const saveShortcutLabel = React.useMemo(\n () => t('sales.documents.detail.inline.save', 'Save \u2318\u23CE / Ctrl+Enter'),\n [t]\n )\n const customDataLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.customDataLoading', 'Loading custom data\u2026'),\n emptyValue: t('sales.documents.detail.empty', 'Not set'),\n noFields: t('entities.customFields.empty'),\n defineFields: t('sales.documents.detail.customDataDefine', 'Define custom fields first.'),\n saveShortcut: saveShortcutLabel,\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [saveShortcutLabel, t],\n )\n const tagLabels = React.useMemo(\n () => ({\n loading: t('sales.documents.detail.tags.loading', 'Loading tags\u2026'),\n placeholder: t('sales.documents.detail.tags.placeholder', 'Type to add tags'),\n empty: t('sales.documents.detail.tags.placeholder', 'No tags yet. Add labels to keep documents organized.'),\n loadError: t('sales.documents.detail.tags.loadError', 'Failed to load tags.'),\n createError: t('sales.documents.detail.tags.createError', 'Failed to create tag.'),\n updateError: t('sales.documents.detail.tags.updateError', 'Failed to update tags.'),\n labelRequired: t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'),\n saveShortcut: t('sales.documents.detail.tags.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter'),\n cancelShortcut: t('sales.documents.detail.tags.cancelShortcut', 'Cancel (Esc)'),\n edit: t('ui.forms.actions.edit'),\n cancel: t('ui.forms.actions.cancel'),\n }),\n [t],\n )\n\n const upsertChannelOptions = React.useCallback((options: ChannelOption[]) => {\n setChannelOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n channelOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertShippingMethodOptions = React.useCallback((options: ShippingMethodOption[]) => {\n setShippingMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n shippingMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertPaymentMethodOptions = React.useCallback((options: PaymentMethodOption[]) => {\n setPaymentMethodOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.id, opt]))\n options.forEach((opt) => map.set(opt.id, opt))\n paymentMethodOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const upsertStatusOptions = React.useCallback((options: StatusOption[]) => {\n setStatusOptions((prev) => {\n const map = new Map(prev.map((opt) => [opt.value, opt]))\n options.forEach((opt) => map.set(opt.value, opt))\n statusOptionsRef.current = map\n return Array.from(map.values())\n })\n }, [])\n\n const loadCustomers = React.useCallback(\n async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomerOptions((prev) => {\n const combined = [...prev]\n merged.forEach((entry) => {\n if (!combined.some((item) => item.id === entry.id)) {\n combined.push(entry)\n }\n })\n return combined\n })\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n },\n [t]\n )\n\n const loadChannels = React.useCallback(\n async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) upsertChannelOptions(options)\n return options\n }\n if (!query) upsertChannelOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n if (!query) {\n flash(t('sales.channels.offers.filters.channelsLoadError', 'Failed to load channels'), 'error')\n }\n return []\n } finally {\n setChannelLoading(false)\n }\n },\n [t, upsertChannelOptions]\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string) => {\n setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n carrierCode: typeof (item as any)?.carrierCode === 'string' ? (item as any).carrierCode : null,\n serviceLevel: typeof (item as any)?.serviceLevel === 'string' ? (item as any).serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : null,\n currencyCode: typeof item?.currencyCode === 'string' ? item.currencyCode : null,\n baseRateNet:\n typeof (item as any)?.baseRateNet === 'string'\n ? (item as any).baseRateNet\n : typeof (item as any)?.baseRateNet === 'number'\n ? (item as any).baseRateNet.toString()\n : null,\n baseRateGross:\n typeof (item as any)?.baseRateGross === 'string'\n ? (item as any).baseRateGross\n : typeof (item as any)?.baseRateGross === 'number'\n ? (item as any).baseRateGross.toString()\n : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) upsertShippingMethodOptions(options)\n return options\n }\n if (!query) upsertShippingMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadShippingMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.shippingMethodLoadError', 'Failed to load shipping methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setShippingMethodLoading(false)\n }\n },\n [t, upsertShippingMethodOptions]\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string) => {\n setPaymentMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n const code = typeof item?.code === 'string' ? item.code : null\n if (!id || !name || !code) return null\n const metadata =\n item && typeof item?.metadata === 'object' && item.metadata ? (item.metadata as Record<string, unknown>) : null\n const providerSettings =\n item && typeof (item as any)?.providerSettings === 'object' && (item as any).providerSettings\n ? ((item as any).providerSettings as Record<string, unknown>)\n : metadata && typeof metadata.providerSettings === 'object'\n ? (metadata.providerSettings as Record<string, unknown>)\n : null\n return {\n id,\n name,\n code,\n description: typeof item?.description === 'string' ? item.description : null,\n providerKey: typeof (item as any)?.providerKey === 'string' ? (item as any).providerKey : null,\n terms: typeof (item as any)?.terms === 'string' ? (item as any).terms : null,\n providerSettings,\n metadata,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) upsertPaymentMethodOptions(options)\n return options\n }\n if (!query) upsertPaymentMethodOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadPaymentMethods', err)\n if (!query) {\n flash(\n t('sales.documents.detail.paymentMethodLoadError', 'Failed to load payment methods.'),\n 'error'\n )\n }\n return []\n } finally {\n setPaymentMethodLoading(false)\n }\n },\n [t, upsertPaymentMethodOptions]\n )\n\n const refreshPaymentPresence = React.useCallback(async () => {\n if (!record?.id || kind !== 'order') {\n setHasPayments(false)\n return\n }\n const params = new URLSearchParams({ page: '1', pageSize: '1', orderId: record.id })\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payments?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n setHasPayments(items.some((item) => item && typeof (item as any).id === 'string'))\n } catch (err) {\n console.error('sales.documents.currency.paymentsGuard', err)\n }\n }, [kind, record?.id])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customerOptions.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomerOptions((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customerOptions],\n )\n\n const ensureChannelOption = React.useCallback(\n async (id: string | null | undefined) => {\n if (!id) return null\n const existing = channelOptionsRef.current.get(id)\n if (existing) return existing\n try {\n const params = new URLSearchParams({ id, page: '1', pageSize: '1' })\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const item = call.result.items[0]\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n const option: ChannelOption = { id, label: code ? `${label} (${code})` : label }\n upsertChannelOptions([option])\n return option\n }\n } catch (err) {\n console.error('sales.documents.channel.ensure', err)\n }\n return null\n },\n [upsertChannelOptions]\n )\n\n const ensureShippingMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = shippingMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: ShippingMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n carrierCode:\n snapshot && typeof (snapshot as any)?.carrierCode === 'string'\n ? (snapshot as any).carrierCode\n : null,\n serviceLevel:\n snapshot && typeof (snapshot as any)?.serviceLevel === 'string'\n ? (snapshot as any).serviceLevel\n : null,\n estimatedTransitDays:\n snapshot && typeof (snapshot as any)?.estimatedTransitDays === 'number'\n ? (snapshot as any).estimatedTransitDays\n : null,\n currencyCode:\n snapshot && typeof (snapshot as any)?.currencyCode === 'string'\n ? (snapshot as any).currencyCode\n : null,\n }\n upsertShippingMethodOptions([option])\n return option\n },\n [upsertShippingMethodOptions]\n )\n\n const ensurePaymentMethodOption = React.useCallback(\n (id: string | null | undefined, snapshot?: Record<string, unknown> | null) => {\n if (!id) return null\n const existing = paymentMethodOptionsRef.current.get(id)\n if (existing) return existing\n const name =\n (snapshot && typeof (snapshot as any)?.name === 'string' && (snapshot as any).name) || null\n const code =\n (snapshot && typeof (snapshot as any)?.code === 'string' && (snapshot as any).code) || null\n if (!name && !code) return null\n const option: PaymentMethodOption = {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n description:\n snapshot && typeof (snapshot as any)?.description === 'string'\n ? (snapshot as any).description\n : null,\n providerKey:\n snapshot && typeof (snapshot as any)?.providerKey === 'string'\n ? (snapshot as any).providerKey\n : null,\n terms:\n snapshot && typeof (snapshot as any)?.terms === 'string' ? (snapshot as any).terms : null,\n }\n upsertPaymentMethodOptions([option])\n return option\n },\n [upsertPaymentMethodOptions]\n )\n\n const loadStatuses = React.useCallback(async () => {\n setStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<{ items?: Array<{ id?: string; value?: string; label?: string | null; color?: string | null; icon?: string | null }> }>(\n `/api/sales/order-statuses?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n const value = typeof item?.value === 'string' ? item.value : null\n if (!id || !value) return null\n const label = typeof item?.label === 'string' && item.label.trim().length ? item.label : value\n const color = typeof item?.color === 'string' && item.color.trim().length ? item.color : null\n const icon = typeof item?.icon === 'string' && item.icon.trim().length ? item.icon : null\n return { id, value, label, color, icon }\n })\n .filter((opt): opt is StatusOption => !!opt)\n upsertStatusOptions(options)\n return options\n }\n upsertStatusOptions([])\n return []\n } catch (err) {\n console.error('sales.documents.loadStatuses', err)\n flash(t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'), 'error')\n return []\n } finally {\n setStatusLoading(false)\n }\n }, [t, upsertStatusOptions])\n\n const ensureStatusOption = React.useCallback(\n (value: string | null | undefined, entryId: string | null | undefined) => {\n if (!value) return\n if (statusOptionsRef.current.has(value)) return\n upsertStatusOptions([\n {\n id: entryId ?? value,\n value,\n label: value,\n color: null,\n icon: null,\n },\n ])\n },\n [upsertStatusOptions]\n )\n\n const fetchDocumentByKind = React.useCallback(\n async (documentId: string, candidateKind: 'order' | 'quote') => {\n return fetchDocument(documentId, candidateKind, loadErrorMessage)\n },\n [loadErrorMessage]\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setLoading(true)\n setError(null)\n const requestedKind = searchParams.get('kind')\n const preferredKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : initialKind ?? null\n const kindsToTry: Array<'order' | 'quote'> = preferredKind\n ? [preferredKind, preferredKind === 'order' ? 'quote' : 'order']\n : ['quote', 'order']\n let lastError: string | null = null\n for (const candidate of kindsToTry) {\n try {\n const entry = await fetchDocumentByKind(params.id, candidate)\n if (entry && !cancelled) {\n setRecord(entry)\n setKind(candidate)\n setLoading(false)\n return\n }\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n lastError = message\n }\n }\n if (!cancelled) {\n setLoading(false)\n setError(lastError ?? loadErrorMessage)\n }\n }\n load().catch((err) => {\n if (cancelled) return\n const message = err instanceof Error && err.message ? err.message : loadErrorMessage\n setError(message)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [fetchDocumentByKind, initialKind, loadErrorMessage, params.id, reloadKey, searchParams])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n }, [loadCustomers])\n\n React.useEffect(() => {\n setTags(Array.isArray(record?.tags) ? record.tags : [])\n }, [record?.tags])\n\n React.useEffect(() => {\n if (!record) {\n setHasItems(false)\n return\n }\n const lineItemCount = resolveLineItemCount(record)\n if (lineItemCount !== null) {\n setHasItems(lineItemCount > 0)\n }\n }, [record])\n\n React.useEffect(() => {\n loadChannels().catch(() => {})\n loadStatuses().catch(() => {})\n loadShippingMethods().catch(() => {})\n loadPaymentMethods().catch(() => {})\n }, [loadChannels, loadPaymentMethods, loadShippingMethods, loadStatuses, scopeVersion])\n\n React.useEffect(() => {\n void refreshPaymentPresence()\n }, [refreshPaymentPresence])\n\n const normalizeGuardList = React.useCallback((value: unknown): string[] | null => {\n if (value === null) return null\n if (!Array.isArray(value)) return []\n const set = new Set<string>()\n value.forEach((entry) => {\n if (typeof entry === 'string' && entry.trim().length) set.add(entry.trim())\n })\n return Array.from(set)\n }, [])\n\n React.useEffect(() => {\n if (kind !== 'order') {\n setEditingGuards(null)\n return\n }\n let cancelled = false\n async function loadGuards() {\n try {\n const call = await apiCall<{\n orderCustomerEditableStatuses?: unknown\n orderAddressEditableStatuses?: unknown\n }>('/api/sales/settings/order-editing')\n if (!call.ok || cancelled) return\n setEditingGuards({\n customer: normalizeGuardList(call.result?.orderCustomerEditableStatuses ?? null),\n addresses: normalizeGuardList(call.result?.orderAddressEditableStatuses ?? null),\n })\n } catch (err) {\n console.error('sales.documents.loadGuards', err)\n }\n }\n void loadGuards()\n return () => {\n cancelled = true\n }\n }, [kind, normalizeGuardList, scopeVersion])\n\n React.useEffect(() => {\n if (!record?.channelId) return\n void ensureChannelOption(record.channelId)\n }, [ensureChannelOption, record?.channelId])\n\n React.useEffect(() => {\n if (kind !== 'order') return\n ensureShippingMethodOption(record?.shippingMethodId ?? null, record?.shippingMethodSnapshot ?? null)\n ensurePaymentMethodOption(record?.paymentMethodId ?? null, record?.paymentMethodSnapshot ?? null)\n }, [\n ensurePaymentMethodOption,\n ensureShippingMethodOption,\n kind,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n ])\n\n React.useEffect(() => {\n ensureStatusOption(record?.status ?? null, record?.statusEntryId ?? null)\n }, [ensureStatusOption, record?.status, record?.statusEntryId])\n\n const handleRetry = React.useCallback(() => {\n setReloadKey((prev) => prev + 1)\n }, [])\n\n const loadAdjustmentsForTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', [kind === 'order' ? 'orderId' : 'quoteId']: record.id })\n const resourcePath = kind === 'order' ? '/api/sales/order-adjustments' : '/api/sales/quote-adjustments'\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `${resourcePath}?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped: AdjustmentRowData[] = items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const amountNet = parseNumber(\n (item as any).amount_net ?? (item as any).amountNet ?? (item as any).amount_net_amount\n )\n const amountGross = parseNumber(\n (item as any).amount_gross ?? (item as any).amountGross ?? (item as any).amount_gross_amount\n )\n const rateRaw = parseNumber((item as any).rate)\n const kindValue =\n typeof item.kind === 'string' && item.kind.trim().length\n ? (item.kind.trim() as SalesAdjustmentKind)\n : 'custom'\n const currency =\n typeof (item as any).currency_code === 'string'\n ? (item as any).currency_code\n : typeof (item as any).currencyCode === 'string'\n ? (item as any).currencyCode\n : record?.currencyCode ?? null\n return {\n id,\n label: typeof item.label === 'string' ? item.label : null,\n code: typeof item.code === 'string' ? item.code : null,\n kind: kindValue,\n calculatorKey:\n typeof (item as any).calculator_key === 'string'\n ? (item as any).calculator_key\n : typeof (item as any).calculatorKey === 'string'\n ? (item as any).calculatorKey\n : null,\n rate: Number.isFinite(rateRaw) ? rateRaw : null,\n amountNet: Number.isFinite(amountNet) ? amountNet : null,\n amountGross: Number.isFinite(amountGross) ? amountGross : null,\n currencyCode: currency,\n position:\n typeof item.position === 'number'\n ? item.position\n : typeof (item as any).position === 'string'\n ? Number((item as any).position)\n : 0,\n customFields: null,\n customFieldSetId:\n typeof (item as any).custom_field_set_id === 'string'\n ? (item as any).custom_field_set_id\n : typeof (item as any).customFieldSetId === 'string'\n ? (item as any).customFieldSetId\n : null,\n }\n })\n .filter((entry): entry is AdjustmentRowData => Boolean(entry))\n const ordered = [...mapped].sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n setAdjustmentRows(ordered)\n } catch (err) {\n console.error('sales.documents.adjustments.totals.load', err)\n }\n }, [kind, parseNumber, record?.currencyCode, record?.id])\n\n React.useEffect(() => {\n void loadAdjustmentsForTotals()\n }, [loadAdjustmentsForTotals])\n\n const refreshDocumentTotals = React.useCallback(async () => {\n if (!record?.id) return\n try {\n const updated = await fetchDocumentByKind(record.id, kind)\n if (updated) {\n setRecord(updated)\n }\n await loadAdjustmentsForTotals()\n } catch (err) {\n console.error('sales.documents.totals.refresh', err)\n }\n }, [fetchDocumentByKind, kind, loadAdjustmentsForTotals, record?.id])\n\n React.useEffect(\n () =>\n subscribeSalesDocumentTotalsRefresh((detail) => {\n if (!record?.id) return\n if (detail.documentId !== record.id) return\n if (detail.kind && detail.kind !== kind) return\n void refreshDocumentTotals()\n }),\n [kind, record?.id, refreshDocumentTotals],\n )\n\n const statusDictionaryMap = React.useMemo(\n () =>\n createDictionaryMap(\n statusOptions.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n }))\n ),\n [statusOptions]\n )\n const statusOptionsForEditor = React.useMemo(() => {\n if (kind === 'order') {\n return statusOptions.filter((option) => option.value !== 'sent')\n }\n return statusOptions\n }, [kind, statusOptions])\n const number = record?.orderNumber ?? record?.quoteNumber ?? record?.id\n const customerSnapshot = (record?.customerSnapshot ?? null) as CustomerSnapshot | null\n const billingSnapshot = (record?.billingAddressSnapshot ?? null) as AddressSnapshot | null\n const shippingSnapshot = (record?.shippingAddressSnapshot ?? null) as AddressSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, record?.customerName ?? record?.customerEntityId ?? null)\n const metadataEmail =\n record?.metadata && typeof (record.metadata as Record<string, unknown>).customerEmail === 'string'\n ? (record.metadata as Record<string, unknown>).customerEmail\n : null\n const contactEmail = resolveCustomerEmail(customerSnapshot) ?? metadataEmail ?? record?.contactEmail ?? null\n const statusDisplay = record?.status ? statusDictionaryMap[record.status] ?? null : null\n const contactRecordId = customerSnapshot?.contact?.id ?? customerSnapshot?.customer?.id ?? record?.customerEntityId ?? null\n const resolveAdjustmentLabel = React.useCallback(\n (row: AdjustmentRowData) => {\n const base = (row.label ?? '').trim()\n const fallback = t(`sales.documents.adjustments.kindLabels.${row.kind}`, row.kind)\n const label = base.length ? base : fallback\n const hasRate = Number.isFinite(row.rate) && row.rate !== null\n const suffix = hasRate ? ` (${row.rate}%)` : ''\n return `${label}${suffix}`\n },\n [t]\n )\n const totalsItems = React.useMemo(() => {\n if (!record) return []\n const items: { key: string; label: string; amount: number | null | undefined; emphasize?: boolean }[] = [\n {\n key: 'subtotalNetAmount',\n label: t('sales.documents.detail.totals.subtotalNet', 'Subtotal (net)'),\n amount: record.subtotalNetAmount ?? null,\n },\n {\n key: 'subtotalGrossAmount',\n label: t('sales.documents.detail.totals.subtotalGross', 'Subtotal (gross)'),\n amount: record.subtotalGrossAmount ?? null,\n },\n {\n key: 'discountTotalAmount',\n label: t('sales.documents.detail.totals.discountTotal', 'Discounts'),\n amount: record.discountTotalAmount ?? null,\n },\n {\n key: 'taxTotalAmount',\n label: t('sales.documents.detail.totals.taxTotal', 'Tax total'),\n amount: record.taxTotalAmount ?? null,\n },\n ]\n if (kind === 'order') {\n items.push(\n {\n key: 'shippingNetAmount',\n label: t('sales.documents.detail.totals.shippingNet', 'Shipping (net)'),\n amount: record.shippingNetAmount ?? null,\n },\n {\n key: 'shippingGrossAmount',\n label: t('sales.documents.detail.totals.shippingGross', 'Shipping (gross)'),\n amount: record.shippingGrossAmount ?? null,\n },\n {\n key: 'surchargeTotalAmount',\n label: t('sales.documents.detail.totals.surchargeTotal', 'Surcharges'),\n amount: record.surchargeTotalAmount ?? null,\n }\n )\n }\n if (adjustmentRows.length) {\n adjustmentRows.forEach((adj) => {\n items.push({\n key: `adjustment-${adj.id}`,\n label: resolveAdjustmentLabel(adj),\n amount: adj.amountGross ?? adj.amountNet ?? null,\n })\n })\n }\n items.push(\n {\n key: 'grandTotalNetAmount',\n label: t('sales.documents.detail.totals.grandTotalNet', 'Grand total (net)'),\n amount: record.grandTotalNetAmount ?? null,\n emphasize: true,\n },\n {\n key: 'grandTotalGrossAmount',\n label: t('sales.documents.detail.totals.grandTotalGross', 'Grand total (gross)'),\n amount: record.grandTotalGrossAmount ?? null,\n emphasize: true,\n }\n )\n if (kind === 'order') {\n items.push(\n {\n key: 'paidTotalAmount',\n label: t('sales.documents.detail.totals.paidTotal', 'Paid'),\n amount: record.paidTotalAmount ?? null,\n },\n {\n key: 'refundedTotalAmount',\n label: t('sales.documents.detail.totals.refundedTotal', 'Refunded'),\n amount: record.refundedTotalAmount ?? null,\n },\n {\n key: 'outstandingAmount',\n label: t('sales.documents.detail.totals.outstandingTotal', 'Outstanding'),\n amount: record.outstandingAmount ?? null,\n emphasize: true,\n }\n )\n }\n return items\n }, [\n kind,\n record,\n record?.discountTotalAmount,\n record?.grandTotalGrossAmount,\n record?.grandTotalNetAmount,\n record?.outstandingAmount,\n record?.paidTotalAmount,\n record?.refundedTotalAmount,\n record?.shippingGrossAmount,\n record?.shippingNetAmount,\n record?.surchargeTotalAmount,\n record?.subtotalGrossAmount,\n record?.subtotalNetAmount,\n record?.taxTotalAmount,\n adjustmentRows,\n resolveAdjustmentLabel,\n t,\n ])\n const guardAllows = (list: string[] | null | undefined, status: string | null | undefined) => {\n if (list === null || list === undefined) return true\n if (list.length === 0) return false\n if (!status) return false\n return list.includes(status)\n }\n const customerGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.customer ?? null, record?.status ?? null)\n const addressGuardBlocked =\n kind === 'order' && !guardAllows(editingGuards?.addresses ?? null, record?.status ?? null)\n const customerGuardMessage = customerGuardBlocked\n ? t('sales.documents.detail.customerBlocked', 'Customer cannot be changed for the current status.')\n : null\n const addressGuardMessage = addressGuardBlocked\n ? t('sales.documents.detail.addresses.blocked', 'Addresses cannot be changed for the current status.')\n : null\n React.useEffect(() => {\n const id = record?.customerEntityId ?? null\n if (!id) return\n const label = customerName ?? id\n setCustomerOptions((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: contactEmail ?? null,\n kind: 'company',\n primaryEmail: contactEmail ?? null,\n }\n return [next, ...prev]\n })\n }, [contactEmail, customerName, record?.customerEntityId])\n const currencyEntries = React.useMemo(() => {\n const entries = Array.isArray(currencyDictionary?.entries) ? currencyDictionary.entries : []\n return entries.map((entry) => ({\n value: entry.value.toUpperCase(),\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }, [currencyDictionary?.entries])\n const currencyOptions = React.useMemo(() => {\n const set = new Map<string, { value: string; label: string; color: string | null; icon: string | null }>()\n currencyEntries.forEach((entry) => {\n set.set(entry.value, { value: entry.value, label: entry.label, color: entry.color ?? null, icon: entry.icon ?? null })\n })\n const currentCode = typeof record?.currencyCode === 'string' ? record.currencyCode.toUpperCase() : null\n if (currentCode && !set.has(currentCode)) {\n set.set(currentCode, { value: currentCode, label: currentCode, color: null, icon: null })\n }\n return Array.from(set.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n }, [currencyEntries, record?.currencyCode])\n const currencyLabels = React.useMemo(\n () => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }),\n [t]\n )\n const currencyLocked = React.useMemo(\n () => hasItems || (kind === 'order' && hasPayments),\n [hasItems, hasPayments, kind]\n )\n const currencyLockMessage = React.useMemo(\n () =>\n currencyLocked\n ? t(\n 'sales.documents.detail.currencyLocked',\n 'Currency cannot be changed after adding items or payments.'\n )\n : null,\n [currencyLocked, t]\n )\n const statusLabels = React.useMemo<DictionarySelectLabels>(\n () => ({\n placeholder: t('sales.documents.detail.status.placeholder', 'Select status'),\n addLabel: t('sales.config.statuses.actions.add', 'Add status'),\n dialogTitle: t('sales.documents.detail.status.dialogTitle', 'Add status'),\n valueLabel: t('sales.documents.detail.status.valueLabel', 'Value'),\n valuePlaceholder: t('sales.documents.detail.status.valuePlaceholder', 'e.g. confirmed'),\n labelLabel: t('sales.documents.detail.status.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.detail.status.labelPlaceholder', 'Display label'),\n emptyError: t('sales.documents.detail.status.emptyError', 'Status value is required.'),\n cancelLabel: t('sales.documents.detail.status.cancel', 'Cancel'),\n saveLabel: t('sales.documents.detail.status.save', 'Save'),\n saveShortcutHint: 'Ctrl/Cmd + Enter',\n successCreateLabel: t('sales.documents.detail.status.created', 'Status saved.'),\n errorLoad: t('sales.documents.detail.status.errorLoad', 'Failed to load statuses.'),\n errorSave: t('sales.documents.detail.status.errorSave', 'Failed to save status.'),\n loadingLabel: t('sales.documents.detail.status.loading', 'Loading statuses\u2026'),\n manageTitle: t('sales.documents.detail.status.manage', 'Manage statuses'),\n }),\n [t]\n )\n\n const updateDocument = React.useCallback(\n async (patch: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n return apiCallOrThrow<DocumentUpdateResult>(\n endpoint,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id, ...patch }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n [kind, record, t]\n )\n\n const handleUpdateCurrency = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (currencyLocked) {\n const message =\n currencyLockMessage ??\n t('sales.documents.detail.currencyLocked', 'Currency cannot be changed after adding items or payments.')\n flash(message, 'error')\n throw new Error(message)\n }\n const normalized = typeof next === 'string' ? next.trim().toUpperCase() : ''\n if (!/^[A-Z]{3}$/.test(normalized)) {\n const message = t('sales.documents.detail.currencyInvalid', 'Currency code must be 3 letters.')\n flash(message, 'error')\n throw new Error(message)\n }\n try {\n const call = await updateDocument({ currencyCode: normalized })\n const savedCode = call.result?.currencyCode ?? normalized\n setRecord((prev) => (prev ? { ...prev, currencyCode: savedCode } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n return savedCode\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [currencyLockMessage, currencyLocked, record, t, updateDocument]\n )\n\n const handleUpdatePlacedAt = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { placedAt: string | null } = { placedAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.placedAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedPlacedAt =\n typeof call.result?.placedAt === 'string' ? call.result.placedAt : payload.placedAt\n setRecord((prev) => (prev ? { ...prev, placedAt: savedPlacedAt } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExpectedDeliveryAt = React.useCallback(\n async (next: string | null) => {\n if (!record || kind !== 'order') return\n const raw = typeof next === 'string' ? next.trim() : ''\n const payload: { expectedDeliveryAt: string | null } = { expectedDeliveryAt: null }\n if (raw.length) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw) || Number.isNaN(new Date(raw).getTime())) {\n const message = t('sales.documents.detail.dateInvalid', 'Enter a valid date in YYYY-MM-DD format.')\n flash(message, 'error')\n throw new Error(message)\n }\n payload.expectedDeliveryAt = raw\n }\n try {\n const call = await updateDocument(payload)\n const savedExpectedDelivery =\n typeof call.result?.expectedDeliveryAt === 'string'\n ? call.result.expectedDeliveryAt\n : payload.expectedDeliveryAt\n setRecord((prev) => (prev ? { ...prev, expectedDeliveryAt: savedExpectedDelivery } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [kind, record, t, updateDocument]\n )\n\n const handleUpdateComment = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ comment: normalized.length ? normalized : null })\n const savedComment =\n typeof call.result?.comment === 'string'\n ? call.result.comment\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, comment: savedComment } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateExternalReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ externalReference: normalized.length ? normalized : null })\n const savedExternalReference =\n typeof call.result?.externalReference === 'string'\n ? call.result.externalReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, externalReference: savedExternalReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateCustomerReference = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n const normalized = typeof next === 'string' ? next.trim() : ''\n try {\n const call = await updateDocument({ customerReference: normalized.length ? normalized : null })\n const savedCustomerReference =\n typeof call.result?.customerReference === 'string'\n ? call.result.customerReference\n : normalized.length\n ? normalized\n : null\n setRecord((prev) => (prev ? { ...prev, customerReference: savedCustomerReference } : prev))\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [record, t, updateDocument]\n )\n\n const handleUpdateContactEmail = React.useCallback(\n async (next: string | null) => {\n if (!record) return\n if (customerGuardMessage) {\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n const baseMetadata = (record.metadata ?? {}) as Record<string, unknown>\n const trimmed = typeof next === 'string' ? next.trim() : ''\n const nextValue = trimmed.length ? trimmed : null\n const updatedMetadata =\n nextValue === null\n ? Object.fromEntries(Object.entries(baseMetadata).filter(([key]) => key !== 'customerEmail'))\n : { ...baseMetadata, customerEmail: nextValue }\n const metadataPayload = Object.keys(updatedMetadata).length ? updatedMetadata : null\n const snapshotBase = (record.customerSnapshot ?? null) as CustomerSnapshot | null\n const nextSnapshot =\n snapshotBase || nextValue !== null\n ? {\n ...(snapshotBase ?? {}),\n customer: {\n ...(snapshotBase?.customer ?? {}),\n primaryEmail: nextValue,\n },\n }\n : null\n try {\n const call = await updateDocument({ metadata: metadataPayload, customerSnapshot: nextSnapshot })\n const savedMetadata =\n (call.result?.metadata as Record<string, unknown> | null | undefined) ?? metadataPayload ?? null\n const snapshotFromResult = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot = hasSnapshotInResponse ? snapshotFromResult : nextSnapshot\n const savedEmail =\n resolveCustomerEmail(savedSnapshot ?? null) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : undefined) ??\n (typeof savedMetadata?.customerEmail === 'string' ? (savedMetadata.customerEmail as string) : undefined) ??\n nextValue\n setRecord((prev) => {\n if (!prev) return prev\n const resolvedEmail = savedEmail === undefined ? prev.contactEmail ?? null : savedEmail ?? null\n return {\n ...prev,\n metadata: savedMetadata ?? null,\n customerSnapshot: savedSnapshot ?? prev.customerSnapshot ?? null,\n contactEmail: resolvedEmail,\n }\n })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw new Error(message)\n }\n },\n [customerGuardMessage, record, t, updateDocument]\n )\n\n const handleUpdateChannel = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ channelId: nextId })\n const savedChannelId =\n typeof call.result?.channelId === 'string' ? call.result.channelId : nextId ?? null\n setRecord((prev) => (prev ? { ...prev, channelId: savedChannelId } : prev))\n if (savedChannelId) {\n void ensureChannelOption(savedChannelId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureChannelOption, record, t, updateDocument]\n )\n\n const handleUpdateShippingMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? shippingMethodOptionsRef.current.get(nextId) ??\n shippingMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n shippingMethodId: nextId,\n shippingMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.shippingMethodId === 'string' ? call.result.shippingMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.shippingMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.shippingMethodCode === 'string'\n ? call.result.shippingMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n shippingMethodId: savedId,\n shippingMethodCode: savedCode,\n shippingMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensureShippingMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensureShippingMethodOption,\n record,\n kind,\n shippingMethodOptions,\n shippingMethodOptionsRef,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdatePaymentMethod = React.useCallback(\n async (nextId: string | null) => {\n if (!record) return\n const option =\n nextId\n ? paymentMethodOptionsRef.current.get(nextId) ??\n paymentMethodOptions.find((entry) => entry.id === nextId) ??\n null\n : null\n try {\n const call = await updateDocument({\n paymentMethodId: nextId,\n paymentMethodCode: option?.code ?? null,\n })\n const savedId =\n typeof call.result?.paymentMethodId === 'string' ? call.result.paymentMethodId : nextId ?? null\n const savedSnapshot =\n (call.result?.paymentMethodSnapshot as Record<string, unknown> | null | undefined) ?? null\n const savedCode =\n typeof call.result?.paymentMethodCode === 'string'\n ? call.result.paymentMethodCode\n : option?.code ?? null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paymentMethodId: savedId,\n paymentMethodCode: savedCode,\n paymentMethodSnapshot: savedSnapshot,\n }\n : prev\n )\n if (savedId && savedSnapshot) {\n ensurePaymentMethodOption(savedId, savedSnapshot)\n }\n emitSalesDocumentTotalsRefresh({ documentId: record.id, kind })\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [\n ensurePaymentMethodOption,\n kind,\n paymentMethodOptions,\n paymentMethodOptionsRef,\n record,\n t,\n updateDocument,\n ]\n )\n\n const handleUpdateStatus = React.useCallback(\n async (entryId: string | null, value: string | null) => {\n if (!record) return\n try {\n const call = await updateDocument({ statusEntryId: entryId })\n const savedStatusEntryId =\n typeof call.result?.statusEntryId === 'string' ? call.result.statusEntryId : entryId ?? null\n const savedStatus =\n typeof call.result?.status === 'string'\n ? call.result.status\n : value\n setRecord((prev) => (prev ? { ...prev, statusEntryId: savedStatusEntryId, status: savedStatus ?? null } : prev))\n if (savedStatus) {\n ensureStatusOption(savedStatus, savedStatusEntryId)\n }\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n flash(message, 'error')\n throw err\n }\n },\n [ensureStatusOption, record, t, updateDocument]\n )\n\n const handleUpdateCustomer = React.useCallback(\n async (nextId: string | null, email: string | null) => {\n if (!record) return\n const changedCustomer = nextId !== record.customerEntityId\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n if (changedCustomer) {\n const hasAddresses =\n !!record.shippingAddressId ||\n !!record.billingAddressId ||\n !!record.shippingAddressSnapshot ||\n !!record.billingAddressSnapshot\n if (hasAddresses) {\n const confirmed = window.confirm(\n t(\n 'sales.documents.detail.customerChangeConfirm',\n 'Change the customer? Existing shipping and billing addresses will be unassigned.'\n )\n )\n if (!confirmed) return\n }\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const payload: Record<string, unknown> = { customerEntityId: nextId }\n if (email && email.trim().length) {\n payload.metadata = { customerEmail: email.trim() }\n }\n const call = await updateDocument(payload)\n const snapshot = (call.result?.customerSnapshot ?? null) as CustomerSnapshot | null\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const selected = customerOptions.find((entry) => entry.id === nextId) ?? null\n const resolvedName =\n (call.result?.customerName as string | undefined) ??\n resolveCustomerName(snapshot, selected?.label ?? record.customerName ?? record.customerEntityId ?? null)\n const resolvedEmail =\n resolveCustomerEmail(snapshot) ??\n (call.result?.contactEmail as string | undefined | null) ??\n email ??\n selected?.primaryEmail ??\n null\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerEntityId: nextId ?? null,\n customerName: nextId ? resolvedName ?? prev.customerName : resolvedName ?? null,\n contactEmail: resolvedEmail ?? (nextId ? prev.contactEmail ?? null : null),\n customerSnapshot:\n hasSnapshotInResponse || changedCustomer\n ? snapshot\n : prev.customerSnapshot ?? null,\n shippingAddressId: changedCustomer ? null : prev.shippingAddressId ?? null,\n billingAddressId: changedCustomer ? null : prev.billingAddressId ?? null,\n shippingAddressSnapshot: changedCustomer ? null : prev.shippingAddressSnapshot ?? null,\n billingAddressSnapshot: changedCustomer ? null : prev.billingAddressSnapshot ?? null,\n }\n : prev\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerOptions, record, t, updateDocument]\n )\n\n const handleUpdateCustomerSnapshot = React.useCallback(\n async (snapshot: CustomerSnapshot) => {\n if (!record) return\n if (customerGuardMessage) {\n setCustomerError(customerGuardMessage)\n flash(customerGuardMessage, 'error')\n throw new Error(customerGuardMessage)\n }\n setCustomerSaving(true)\n setCustomerError(null)\n try {\n const call = await updateDocument({ customerSnapshot: snapshot })\n const hasSnapshotInResponse =\n call.result && Object.prototype.hasOwnProperty.call(call.result, 'customerSnapshot')\n const savedSnapshot =\n (hasSnapshotInResponse ? (call.result?.customerSnapshot ?? null) : snapshot) as CustomerSnapshot | null\n const resolvedName = resolveCustomerName(\n savedSnapshot,\n record.customerName ?? record.customerEntityId ?? null,\n )\n const resolvedEmail =\n resolveCustomerEmail(savedSnapshot) ??\n (typeof call.result?.contactEmail === 'string' ? call.result.contactEmail : record.contactEmail ?? null)\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customerSnapshot: savedSnapshot ?? null,\n customerName: resolvedName,\n contactEmail: resolvedEmail ?? null,\n }\n : prev,\n )\n flash(t('sales.documents.detail.updatedMessage', 'Document updated.'), 'success')\n } catch (err) {\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCustomerError(message)\n flash(message, 'error')\n throw err\n } finally {\n setCustomerSaving(false)\n }\n },\n [customerGuardMessage, record, t, updateDocument],\n )\n\n const handleGenerateNumber = React.useCallback(async () => {\n setGenerating(true)\n const call = await apiCall<{ number?: string }>(`/api/sales/document-numbers`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n if (call.ok && call.result?.number) {\n setRecord((prev) => (prev ? { ...prev, orderNumber: kind === 'order' ? call.result?.number : prev.orderNumber, quoteNumber: kind === 'quote' ? call.result?.number : prev.quoteNumber } : prev))\n flash(t('sales.documents.detail.numberGenerated', 'New number generated.'), 'success')\n } else {\n flash(t('sales.documents.detail.numberGenerateError', 'Could not generate number.'), 'error')\n }\n setGenerating(false)\n }, [kind, t])\n\n const handleConvert = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setConverting(true)\n try {\n const call = await apiCallOrThrow<{ orderId?: string }>(\n '/api/sales/quotes/convert',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id }),\n },\n { errorMessage: t('sales.documents.detail.convertError', 'Failed to convert quote.') },\n )\n const orderId = call.result?.orderId ?? record.id\n flash(t('sales.documents.detail.convertSuccess', 'Quote converted to order.'), 'success')\n router.replace(`/backend/sales/orders/${orderId}`)\n } catch (err) {\n console.error('sales.documents.convert', err)\n flash(t('sales.documents.detail.convertError', 'Failed to convert quote.'), 'error')\n } finally {\n setConverting(false)\n }\n }, [kind, record, router, t])\n\n const handleSendQuote = React.useCallback(async () => {\n if (!record || kind !== 'quote') return\n setSending(true)\n try {\n await apiCallOrThrow('/api/sales/quotes/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ quoteId: record.id, validForDays }),\n })\n flash(t('sales.quotes.send.success', 'Quote sent.'), 'success')\n setSendOpen(false)\n // Reload the document to reflect status changes.\n const updated = await fetchDocumentByKind(record.id, 'quote')\n if (updated) setRecord(updated)\n } catch (err) {\n console.error('sales.quotes.send', err)\n flash(t('sales.quotes.send.failed', 'Failed to send quote.'), 'error')\n } finally {\n setSending(false)\n }\n }, [fetchDocumentByKind, flash, kind, record, t, validForDays])\n\n const handleDelete = React.useCallback(async () => {\n if (!record) return\n const confirmed = window.confirm(\n t('sales.documents.detail.deleteConfirm', 'Delete this document? This cannot be undone.')\n )\n if (!confirmed) return\n setDeleting(true)\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const call = await apiCall(endpoint, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: record.id }),\n })\n if (call.ok) {\n flash(t('sales.documents.detail.deleted', 'Document deleted.'), 'success')\n const listPath = kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n router.push(listPath)\n } else {\n flash(t('sales.documents.detail.deleteFailed', 'Could not delete document.'), 'error')\n }\n setDeleting(false)\n }, [kind, record, router, t])\n\n const detailFields = React.useMemo(() => {\n const fields: DetailFieldConfig[] = [\n {\n key: 'shippingMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.shippingMethod.label', 'Shipping method')}\n value={record?.shippingMethodId ?? null}\n snapshot={(record?.shippingMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={shippingMethodOptions}\n loading={shippingMethodLoading}\n onLoadOptions={loadShippingMethods}\n onSave={handleUpdateShippingMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.shippingMethod.placeholder', 'Select shipping method')}\n loadingLabel={t('sales.documents.detail.shippingMethod.loading', 'Loading shipping methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.shippingMethod.empty', 'No shipping methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.shippingMethod.selected', 'Selected shipping method: {{id}}', { id })\n }\n icon={<Truck className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n {\n key: 'paymentMethod',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <MethodInlineEditor\n label={t('sales.documents.detail.paymentMethod.label', 'Payment method')}\n value={record?.paymentMethodId ?? null}\n snapshot={(record?.paymentMethodSnapshot ?? null) as Record<string, unknown> | null}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n options={paymentMethodOptions}\n loading={paymentMethodLoading}\n onLoadOptions={loadPaymentMethods}\n onSave={handleUpdatePaymentMethod}\n saveLabel={saveShortcutLabel}\n placeholder={t('sales.documents.detail.paymentMethod.placeholder', 'Select payment method')}\n loadingLabel={t('sales.documents.detail.paymentMethod.loading', 'Loading payment methods\u2026')}\n emptyResultsLabel={t('sales.documents.detail.paymentMethod.empty', 'No payment methods found.')}\n selectedHint={(id) =>\n t('sales.documents.detail.paymentMethod.selected', 'Selected payment method: {{id}}', { id })\n }\n icon={<CreditCard className=\"h-5 w-5 text-muted-foreground\" />}\n />\n ),\n },\n ]\n if (kind === 'order') {\n fields.push({\n key: 'expectedDeliveryAt',\n kind: 'text',\n label: t('sales.documents.detail.expectedDeliveryAt.label', 'Expected delivery'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.expectedDeliveryAt.placeholder', 'Add expected delivery date'),\n value: record?.expectedDeliveryAt\n ? new Date(record.expectedDeliveryAt).toISOString().slice(0, 10)\n : null,\n onSave: handleUpdateExpectedDeliveryAt,\n inputType: 'date',\n renderDisplay: (params) => {\n const { value, emptyLabel } = params\n if (value && value.length) {\n return <span className=\"text-sm text-muted-foreground\">{new Date(value).toLocaleDateString()}</span>\n }\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n },\n })\n }\n fields.push(\n {\n key: 'externalRef',\n kind: 'text',\n label: t('sales.documents.detail.externalRef', 'External reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.externalRef.placeholder', 'Add external reference'),\n value: record?.externalReference ?? null,\n onSave: handleUpdateExternalReference,\n },\n {\n key: 'customerRef',\n kind: 'text',\n label: t('sales.documents.detail.customerRef', 'Customer reference'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.customerRef.placeholder', 'Customer PO or note'),\n value: record?.customerReference ?? null,\n onSave: handleUpdateCustomerReference,\n },\n {\n key: 'comment',\n kind: 'multiline',\n label: t('sales.documents.detail.comment', 'Comment'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n placeholder: t('sales.documents.detail.comment.placeholder', 'Add comment'),\n value: record?.comment ?? null,\n onSave: handleUpdateComment,\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n },\n {\n key: 'timestamps',\n kind: 'custom',\n label: '',\n emptyLabel: '',\n render: () => (\n <SectionCard title={t('sales.documents.detail.timestamps', 'Timestamps')} muted>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.created', 'Created')}: {record?.createdAt ?? '\u2014'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.detail.updated', 'Updated')}: {record?.updatedAt ?? '\u2014'}\n </p>\n </SectionCard>\n ),\n }\n )\n return fields\n }, [\n handleUpdateComment,\n handleUpdateCustomerReference,\n handleUpdateExpectedDeliveryAt,\n handleUpdateExternalReference,\n handleUpdatePaymentMethod,\n handleUpdateShippingMethod,\n loadPaymentMethods,\n loadShippingMethods,\n paymentMethodLoading,\n paymentMethodOptions,\n record?.comment,\n record?.createdAt,\n record?.customerReference,\n record?.expectedDeliveryAt,\n record?.externalReference,\n record?.paymentMethodId,\n record?.paymentMethodSnapshot,\n record?.shippingMethodId,\n record?.shippingMethodSnapshot,\n record?.updatedAt,\n shippingMethodLoading,\n shippingMethodOptions,\n t,\n kind,\n saveShortcutLabel,\n ])\n\n const summaryCards: Array<{\n key: 'email' | 'channel' | 'status' | 'currency'\n title: string\n value: string | null | undefined\n placeholder?: string\n emptyLabel?: string\n type?: 'email'\n containerClassName?: string\n }> = [\n {\n key: 'email',\n title: t('sales.documents.detail.email', 'Primary email'),\n value: contactEmail,\n placeholder: t('sales.documents.detail.email.placeholder', 'Add email'),\n emptyLabel: t('sales.documents.detail.empty', 'Not set'),\n type: 'email' as const,\n },\n {\n key: 'channel',\n title: t('sales.documents.detail.channel', 'Channel'),\n value: record?.channelId ?? null,\n },\n {\n key: 'status',\n title: t('sales.documents.detail.status', 'Status'),\n value: record?.status ?? null,\n },\n {\n key: 'currency',\n title: t('sales.documents.detail.currency', 'Currency'),\n value: record?.currencyCode ?? null,\n containerClassName: 'md:col-start-4 md:row-start-1',\n },\n ]\n\n const renderEmailDisplay = React.useCallback(\n ({ value, emptyLabel }: { value: string | null | undefined; emptyLabel: string }) => {\n const emailValue = typeof value === 'string' ? value.trim() : ''\n if (!emailValue.length) {\n return <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n }\n return (\n <a\n className=\"inline-flex items-center gap-2 text-sm text-primary hover:text-primary/80 hover:underline\"\n href={`mailto:${emailValue}`}\n >\n <Mail className=\"h-4 w-4\" aria-hidden />\n <span className=\"truncate\">{emailValue}</span>\n </a>\n )\n },\n []\n )\n\n const injectionContext = React.useMemo(() => ({ kind, record }), [kind, record])\n const tabInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:tabs`, [kind])\n const detailsInjectionSpotId = React.useMemo(() => `sales.document.detail.${kind}:details`, [kind])\n const { widgets: injectedTabWidgets } = useInjectionWidgets(tabInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel ?? widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={injectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [injectedTabWidgets, injectionContext, record, setRecord],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabButtons = React.useMemo<Array<{ id: string; label: string }>>(\n () => {\n const tabs: Array<{ id: string; label: string }> = [\n { id: 'comments', label: t('sales.documents.detail.tabs.comments', 'Comments') },\n { id: 'addresses', label: t('sales.documents.detail.tabs.addresses', 'Addresses') },\n { id: 'items', label: t('sales.documents.detail.tabs.items', 'Items') },\n ]\n if (kind === 'order') {\n tabs.push(\n { id: 'shipments', label: t('sales.documents.detail.tabs.shipments', 'Shipments') },\n { id: 'payments', label: t('sales.documents.detail.tabs.payments', 'Payments') },\n )\n }\n tabs.push({ id: 'adjustments', label: t('sales.documents.detail.tabs.adjustments', 'Adjustments') })\n injectedTabs.forEach((tab) => {\n tabs.push({ id: tab.id, label: tab.label })\n })\n return tabs\n },\n [injectedTabs, kind, t],\n )\n\n React.useEffect(() => {\n if (tabButtons.some((tab) => tab.id === activeTab)) return\n const fallbackTab = tabButtons[0]?.id ?? 'comments'\n if (activeTab !== fallbackTab) {\n setActiveTab(fallbackTab)\n }\n }, [activeTab, tabButtons])\n\n const notesViewerLabel = React.useMemo(() => t('customers.people.detail.notes.you', 'You'), [t])\n\n const salesNotesAdapter = React.useMemo<NotesDataAdapter>(\n () => ({\n list: async ({ entityId }) => {\n if (!record || !entityId || record.id !== entityId) return []\n const params = new URLSearchParams({ contextType: kind, contextId: entityId })\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/notes?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items.map(mapCommentSummary)\n },\n create: async ({ entityId, body, appearanceIcon, appearanceColor }) => {\n if (!record || record.id !== entityId) {\n throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/notes',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n contextType: kind,\n contextId: entityId,\n body,\n appearanceIcon: appearanceIcon ?? undefined,\n appearanceColor: appearanceColor ?? undefined,\n }),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n return response.result ?? {}\n },\n update: async ({ id, patch }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n const payload: Record<string, unknown> = { id }\n if (patch.body !== undefined) payload.body = patch.body\n if (patch.appearanceIcon !== undefined) payload.appearanceIcon = patch.appearanceIcon\n if (patch.appearanceColor !== undefined) payload.appearanceColor = patch.appearanceColor\n await apiCallOrThrow(\n '/api/sales/notes',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n delete: async ({ id }) => {\n if (!record) throw new Error(t('sales.documents.detail.updateError', 'Failed to update document.'))\n await apiCallOrThrow(\n `/api/sales/notes?id=${encodeURIComponent(id)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('sales.documents.detail.updateError', 'Failed to update document.') }\n )\n },\n }),\n [kind, record, t],\n )\n\n const appendShipmentComment = React.useCallback(\n async (body: string) => {\n if (!record) return\n try {\n await salesNotesAdapter.create?.({\n entityId: record.id,\n body,\n appearanceIcon: 'lucide:truck',\n appearanceColor: '#0ea5e9',\n })\n } catch (err) {\n console.error('sales.shipments.comment', err)\n }\n },\n [record, salesNotesAdapter],\n )\n\n const commentEmptyState = React.useMemo(\n () => ({\n title: t('sales.documents.detail.empty.comments.title', 'No comments yet.'),\n description: t('sales.documents.detail.empty.comments.description', 'Notes from teammates will appear here.'),\n actionLabel: t('sales.documents.detail.comments.add', 'Add comment'),\n }),\n [t]\n )\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n const tabEmptyStates = React.useMemo<Record<string, { title: string; description?: string }>>(\n () => ({\n items: {\n title: t('sales.documents.detail.empty.items.title', 'No items yet.'),\n description: t('sales.documents.detail.empty.items.description', 'Line items editor is coming in the next iteration.'),\n },\n shipments: {\n title: t('sales.documents.detail.empty.shipments.title', 'No shipments yet.'),\n description: t(\n 'sales.documents.shipments.empty.description',\n 'Add shipments for this document to let the user track the order.'\n ),\n },\n payments: {\n title: t('sales.documents.detail.empty.payments.title', 'No payments yet.'),\n description: t('sales.documents.detail.empty.payments.description', 'Payments are work in progress.'),\n },\n adjustments: {\n title: t('sales.documents.detail.empty.adjustments.title', 'No adjustments yet.'),\n description: t(\n 'sales.documents.detail.empty.adjustments.description',\n 'Add discounts, surcharges, taxes, or shipping to refine totals.'\n ),\n },\n }),\n [t]\n )\n\n const renderTabContent = () => {\n const injectedRenderer = injectedTabMap.get(activeTab)\n if (injectedRenderer) {\n return injectedRenderer()\n }\n if (activeTab === 'comments') {\n return (\n <NotesSection\n entityId={record.id}\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n viewerUserId={null}\n viewerName={notesViewerLabel}\n addActionLabel={commentEmptyState.actionLabel}\n emptyState={{\n title: commentEmptyState.title,\n description: commentEmptyState.description,\n actionLabel: commentEmptyState.actionLabel,\n }}\n translator={t}\n dataAdapter={salesNotesAdapter}\n onActionChange={handleSectionActionChange}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <SalesDocumentAddressesSection\n documentId={record.id}\n kind={kind}\n customerId={record.customerEntityId ?? null}\n shippingAddressId={record.shippingAddressId ?? null}\n billingAddressId={record.billingAddressId ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n billingAddressSnapshot={billingSnapshot ?? null}\n lockedReason={addressGuardMessage}\n onUpdated={(patch) => setRecord((prev) => (prev ? { ...prev, ...patch } : prev))}\n />\n )\n }\n if (activeTab === 'items') {\n return (\n <SalesDocumentItemsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onItemsChange={(items) => setHasItems(items.length > 0)}\n />\n )\n }\n if (activeTab === 'shipments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.shipments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesShipmentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n shippingAddressSnapshot={shippingSnapshot ?? null}\n onActionChange={handleSectionActionChange}\n onAddComment={appendShipmentComment}\n />\n )\n }\n if (activeTab === 'adjustments') {\n return (\n <SalesDocumentAdjustmentsSection\n documentId={record.id}\n kind={kind}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onRowsChange={setAdjustmentRows}\n />\n )\n }\n if (activeTab === 'payments') {\n if (kind !== 'order') {\n const placeholder = tabEmptyStates.payments\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n return (\n <SalesDocumentPaymentsSection\n orderId={record.id}\n currencyCode={record.currencyCode ?? null}\n organizationId={(record as any)?.organizationId ?? (record as any)?.organization_id ?? null}\n tenantId={(record as any)?.tenantId ?? (record as any)?.tenant_id ?? null}\n onActionChange={handleSectionActionChange}\n onPaymentsChange={(payments) => setHasPayments(payments.length > 0)}\n onTotalsChange={(totals) =>\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n paidTotalAmount:\n totals?.paidTotalAmount ?? prev.paidTotalAmount ?? null,\n refundedTotalAmount:\n totals?.refundedTotalAmount ?? prev.refundedTotalAmount ?? null,\n outstandingAmount:\n totals?.outstandingAmount ?? prev.outstandingAmount ?? null,\n }\n : prev\n )\n }\n />\n )\n }\n const placeholder =\n tabEmptyStates[activeTab] ??\n {\n title: t('sales.documents.detail.empty.generic', 'Nothing to show here yet.'),\n description: undefined,\n }\n return (\n <TabEmptyState\n title={placeholder.title}\n description={placeholder.description}\n />\n )\n }\n\n const customFieldValues = React.useMemo(() => {\n const merged: Record<string, unknown> = {}\n if (record?.customValues && typeof record.customValues === 'object' && !Array.isArray(record.customValues)) {\n Object.assign(merged, record.customValues as Record<string, unknown>)\n }\n const rawFields = record?.customFields\n if (Array.isArray(rawFields)) {\n rawFields.forEach((entry) => {\n const key = entry && typeof entry === 'object' && 'key' in entry ? (entry as any).key : null\n const value = entry && typeof entry === 'object' && 'value' in entry ? (entry as any).value : undefined\n if (typeof key === 'string' && key.trim()) merged[key] = value\n })\n } else if (rawFields && typeof rawFields === 'object') {\n Object.assign(merged, rawFields as Record<string, unknown>)\n }\n return prefixCustomFieldValues(merged)\n }, [record?.customFields, record?.customValues])\n\n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!record) {\n throw new Error(t('sales.documents.detail.inlineError', 'Unable to update document.'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n accept: (fieldId) => !fieldId.startsWith('cf_'),\n })\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n return\n }\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n try {\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, customFields: customPayload }),\n },\n { errorMessage: t('sales.documents.detail.inlineError', 'Unable to update document.') },\n )\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('sales.documents.detail.inlineError', 'Unable to update document.')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setRecord((prev) =>\n prev\n ? {\n ...prev,\n customFields: customPayload,\n customValues: customPayload,\n }\n : prev,\n )\n flash(t('ui.forms.flash.saveSuccess', 'Saved successfully.'), 'success')\n },\n [kind, record, t],\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string): Promise<TagOption[]> => {\n const params = new URLSearchParams({ pageSize: '100' })\n if (query) params.set('search', query)\n const payload = await readApiResultOrThrow<Record<string, unknown>>(\n `/api/sales/tags?${params.toString()}`,\n undefined,\n { errorMessage: t('sales.documents.detail.tags.loadError', 'Failed to load tags.') },\n )\n const items = Array.isArray(payload?.items) ? payload.items : []\n return items\n .map((item: unknown): TagOption | null => {\n if (!item || typeof item !== 'object') return null\n const raw = item as { id?: unknown; tagId?: unknown; label?: unknown; slug?: unknown; color?: unknown }\n const rawId =\n typeof raw.id === 'string'\n ? raw.id\n : typeof raw.tagId === 'string'\n ? raw.tagId\n : null\n if (!rawId) return null\n const labelValue =\n (typeof raw.label === 'string' && raw.label.trim().length && raw.label.trim()) ||\n (typeof raw.slug === 'string' && raw.slug.trim().length && raw.slug.trim()) ||\n rawId\n const color = typeof raw.color === 'string' && raw.color.trim().length ? raw.color.trim() : null\n return { id: rawId, label: labelValue, color }\n })\n .filter((entry): entry is TagOption => entry !== null)\n },\n [t],\n )\n\n const createTag = React.useCallback(\n async (label: string): Promise<TagOption> => {\n const trimmed = label.trim()\n if (!trimmed.length) {\n throw new Error(t('sales.documents.detail.tags.labelRequired', 'Tag name is required.'))\n }\n const response = await apiCallOrThrow<Record<string, unknown>>(\n '/api/sales/tags',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ label: trimmed }),\n },\n { errorMessage: t('sales.documents.detail.tags.createError', 'Failed to create tag.') },\n )\n const payload = response.result ?? {}\n const id =\n typeof payload?.id === 'string'\n ? payload.id\n : typeof (payload as any)?.tagId === 'string'\n ? (payload as any).tagId\n : ''\n if (!id) throw new Error(t('sales.documents.detail.tags.createError', 'Failed to create tag.'))\n const color = typeof (payload as any)?.color === 'string' && (payload as any).color.trim().length\n ? (payload as any).color.trim()\n : null\n return { id, label: trimmed, color }\n },\n [t],\n )\n\n const handleTagsSave = React.useCallback(\n async ({ next }: { next: TagOption[] }) => {\n if (!record) return\n const endpoint = kind === 'order' ? '/api/sales/orders' : '/api/sales/quotes'\n const tagIds = Array.from(new Set(next.map((tag) => tag.id)))\n await apiCallOrThrow(\n endpoint,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: record.id, tags: tagIds }),\n },\n { errorMessage: t('sales.documents.detail.tags.updateError', 'Failed to update tags.') },\n )\n setRecord((prev) => (prev ? { ...prev, tags: next } : prev))\n setTags(next)\n flash(t('sales.documents.detail.tags.success', 'Tags updated.'), 'success')\n },\n [kind, record, t],\n )\n\n if (loading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] items-center justify-center\">\n <LoadingMessage\n label={t('sales.documents.detail.loading', 'Loading document\u2026')}\n className=\"min-w-[280px] justify-center border-0 bg-transparent text-base shadow-none\"\n />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error}\n action={\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" onClick={() => handleRetry()}>\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => router.push('/backend/sales/documents/create')}\n >\n {t('sales.documents.detail.backToCreate', 'Create a new document')}\n </Button>\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n }\n\n if (!record) return null\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href={kind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'}\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('sales.documents.detail.back', 'Back to documents')}</span>\n </Link>\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.detail.order', 'Sales order')\n : t('sales.documents.detail.quote', 'Sales quote')}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <InlineTextEditor\n label={t('sales.documents.detail.number', 'Document number')}\n value={number}\n emptyLabel={t('sales.documents.detail.numberEmpty', 'No number yet')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving number will land soon.'), 'info')}\n variant=\"plain\"\n activateOnClick\n hideLabel\n triggerClassName=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 mt-1\"\n containerClassName=\"max-w-full w-full flex-1 sm:min-w-[28rem] lg:min-w-[36rem] xl:min-w-[44rem]\"\n renderDisplay={({ value: displayValue, emptyLabel }) =>\n displayValue && displayValue.length ? (\n <span className=\"text-2xl font-semibold leading-tight whitespace-nowrap\">{displayValue}</span>\n ) : (\n <span className=\"text-muted-foreground\">{emptyLabel}</span>\n )\n }\n onEditingChange={setNumberEditing}\n renderActions={\n numberEditing ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => void handleGenerateNumber()}\n disabled={generating}\n className=\"h-9 w-9\"\n >\n {generating ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Wand2 className=\"h-4 w-4\" />}\n <span className=\"sr-only\">{t('sales.documents.detail.generateNumber', 'Generate number')}</span>\n </Button>\n ) : null\n }\n />\n </div>\n {record.status ? (\n <Badge variant=\"secondary\" className=\"inline-flex items-center gap-2\">\n {statusDisplay?.icon ? renderDictionaryIcon(statusDisplay.icon, 'h-4 w-4') : null}\n <span className=\"inline-flex items-center gap-1\">\n {statusDisplay?.color\n ? renderDictionaryColor(statusDisplay.color, 'h-2.5 w-2.5 rounded-full border border-border/60')\n : <span className=\"h-2.5 w-2.5 rounded-full bg-primary\" />}\n </span>\n <span>{statusDisplay?.label ?? record.status}</span>\n </Badge>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {kind === 'quote' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void handleConvert()}\n disabled={converting}\n >\n {converting ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.documents.detail.convertToOrder', 'Convert to order')}\n </Button>\n ) : null}\n {kind === 'quote' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setSendOpen(true)}\n disabled={!contactEmail || sending}\n >\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.action', 'Send to customer')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleDelete()}\n disabled={deleting}\n className=\"rounded-none border-destructive/40 text-destructive hover:bg-destructive/5 hover:text-destructive\"\n >\n {deleting ? <Spinner className=\"h-4 w-4 animate-spin\" /> : <Trash2 className=\"h-4 w-4\" aria-hidden />}\n {t('sales.documents.detail.delete', 'Delete')}\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"md:col-span-3\">\n <CustomerInlineEditor\n label={t('sales.documents.detail.customer', 'Customer')}\n customerId={record.customerEntityId ?? null}\n customerName={customerName}\n customerEmail={contactEmail ?? null}\n customerSnapshot={customerSnapshot}\n customers={customerOptions}\n customerLoading={customerLoading}\n onLoadCustomers={loadCustomers}\n fetchCustomerEmail={fetchCustomerEmail}\n onSave={handleUpdateCustomer}\n onSaveSnapshot={handleUpdateCustomerSnapshot}\n saving={customerSaving}\n error={customerError}\n guardMessage={customerGuardMessage}\n onClearError={clearCustomerError}\n />\n </div>\n <InlineTextEditor\n key=\"date\"\n label={t('sales.documents.detail.date', 'Date')}\n value={\n record?.placedAt\n ? new Date(record.placedAt).toISOString().slice(0, 10)\n : record?.createdAt\n ? new Date(record.createdAt).toISOString().slice(0, 10)\n : null\n }\n emptyLabel={t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdatePlacedAt}\n inputType=\"date\"\n activateOnClick\n containerClassName=\"h-full\"\n saveLabel={t('customers.people.detail.inline.saveShortcut')}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-muted-foreground\">\n {new Date(value).toLocaleDateString()}\n </span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {summaryCards.map((card) => {\n if (card.key === 'email') {\n return (\n <ContactEmailInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n placeholder={card.placeholder}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={handleUpdateContactEmail}\n renderDisplay={renderEmailDisplay}\n recordId={contactRecordId}\n />\n )\n }\n if (card.key === 'channel') {\n return (\n <ChannelInlineEditor\n key={card.key}\n label={card.title}\n value={record?.channelId ?? null}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={channelOptions}\n loading={channelLoading}\n onLoadOptions={loadChannels}\n onSave={handleUpdateChannel}\n saveLabel={saveShortcutLabel}\n />\n )\n }\n if (card.key === 'status') {\n return (\n <StatusInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={statusOptionsForEditor}\n onSave={handleUpdateStatus}\n onLoadOptions={loadStatuses}\n labels={statusLabels}\n manageHref=\"/backend/config/sales\"\n loading={statusLoading}\n saveLabel={saveShortcutLabel}\n dictionaryMap={statusDictionaryMap}\n />\n )\n }\n if (card.key === 'date') {\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType=\"date\"\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={({ value, emptyLabel }) =>\n value && value.length ? (\n <span className=\"text-sm text-foreground\">{value}</span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">{emptyLabel}</span>\n )\n }\n />\n )\n }\n if (card.key === 'currency') {\n return (\n <CurrencyInlineEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n options={currencyOptions}\n labels={currencyLabels}\n error={currencyError}\n onClearError={() => setCurrencyError(null)}\n locked={currencyLocked}\n onLocked={() => {\n if (currencyLockMessage) {\n flash(currencyLockMessage, 'error')\n }\n }}\n onSave={async (next) => {\n setCurrencyError(null)\n try {\n await handleUpdateCurrency(next)\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('sales.documents.detail.updateError', 'Failed to update document.')\n setCurrencyError(message)\n throw err\n }\n }}\n />\n )\n }\n return (\n <InlineTextEditor\n key={card.key}\n label={card.title}\n value={card.value}\n emptyLabel={card.emptyLabel ?? t('sales.documents.detail.empty', 'Not set')}\n placeholder={card.placeholder}\n onSave={async () => flash(t('sales.documents.detail.saveStub', 'Saving details will land soon.'), 'info')}\n inputType={card.type === 'email' ? 'email' : 'text'}\n activateOnClick\n containerClassName={card.containerClassName}\n renderDisplay={(params) =>\n card.key === 'email'\n ? renderEmailDisplay(params)\n : params.value && params.value.length\n ? <span className=\"text-base font-medium\">{params.value}</span>\n : <span className=\"text-sm text-muted-foreground\">{params.emptyLabel}</span>\n }\n />\n )\n })}\n </div>\n\n <div>\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-2 pb-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {tabButtons.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={cn(\n 'px-3 py-2 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-b-2 border-primary text-primary'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => setActiveTab(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {sectionAction ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSectionAction}\n disabled={sectionAction.disabled}\n >\n {sectionAction.icon ?? <Plus className=\"mr-2 h-4 w-4\" />}\n {sectionAction.label}\n </Button>\n ) : null}\n </div>\n {renderTabContent()}\n </div>\n\n <DocumentTotals\n title={t('sales.documents.detail.totals.title', 'Totals')}\n currency={record.currencyCode ?? null}\n items={totalsItems}\n />\n\n <div className=\"space-y-4\" ref={detailSectionRef}>\n <p className=\"text-sm font-semibold\">{t('sales.documents.detail.details', 'Details')}</p>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId={detailsInjectionSpotId}\n context={injectionContext}\n data={record}\n onDataChange={(next) => setRecord(next as unknown as DocumentRecord)}\n />\n </div>\n\n <div className=\"space-y-4\">\n <CustomDataSection\n title={t('sales.documents.detail.customData', 'Custom data')}\n entityIds={[kind === 'order' ? E.sales.sales_order : E.sales.sales_quote]}\n values={customFieldValues}\n onSubmit={handleCustomFieldsSubmit}\n labels={customDataLabels}\n />\n <TagsSection\n title={t('sales.documents.detail.tags', 'Tags')}\n tags={tags}\n onChange={setTags}\n isSubmitting={false}\n canEdit\n loadOptions={loadTagOptions}\n createTag={createTag}\n onSave={({ next }) => handleTagsSave({ next })}\n labels={tagLabels}\n />\n </div>\n </PageBody>\n\n <Dialog open={sendOpen} onOpenChange={setSendOpen}>\n <DialogContent\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSendOpen(false)\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!sending) void handleSendQuote()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{t('sales.quotes.send.title', 'Send quote to customer')}</DialogTitle>\n <DialogDescription>\n {t('sales.quotes.send.description', 'Email will be sent to:')} {contactEmail ?? t('sales.quotes.send.noEmail', 'No email')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('sales.quotes.send.validForDays', 'Valid for (days)')}</label>\n <Input\n type=\"number\"\n min={1}\n max={365}\n value={validForDays}\n onChange={(e) => setValidForDays(Number(e.target.value || 14))}\n disabled={sending}\n />\n </div>\n <DialogFooter>\n <Button variant=\"secondary\" onClick={() => setSendOpen(false)} disabled={sending}>\n {t('sales.quotes.send.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void handleSendQuote()} disabled={sending || !contactEmail}>\n {sending ? <Spinner className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {t('sales.quotes.send.submit', 'Send quote')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Page>\n )\n}\n"],
5
+ "mappings": ";AA8JU,cAuCM,YAvCN;AA1JV,YAAY,WAAW;AACvB,SAAS,iBAAiB,iBAAiB;AAC3C,SAAS,MAAM,gBAAgB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,oBAA2C;AACpD,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,QAAQ,eAAe,mBAAmB,cAAc,cAAc,mBAAmB;AAClG,SAAS,WAAW,YAAY,MAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO,WAAW,OAAO,SAAS;AACrG,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,SAAS,SAAS,gBAAgB,4BAA4B;AAC9D,SAAS,gCAAgC;AACzC,SAAS,sCAAsC;AAC/C,SAAS,YAAY;AACrB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;AAC9C,SAAS,iCAAiC;AAC1C,SAAS,oCAAoC;AAC7C,SAAS,uCAAuC;AAEhD,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,SAAS;AAElB,SAAS,6BAA6B;AAEtC,SAAS,iBAAiB,qBAAqB,uBAAuB,4BAAgD;AACtH,SAAS,6BAA6B;AACtC,SAAS,mCAAmC;AAC5C,SAAS,8BAA8B;AACvC,SAAS,cAAc,yBAAgD;AACvE;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,wBAAwB;AACjC,SAAS,8BAA8B,qCAAqC;AAC5E,SAAS,eAAe,2BAA2B;AAEnD,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAMA,mBAAkB,MAAM,QAAQ,MAAO,OAAO,UAAU,WAAW,MAAM,YAAY,IAAI,QAAY,CAAC,KAAK,CAAC;AAClH,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAA6BA,gBAAe;AAC5E,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,gBAAgB,MAAM;AAAA,IAC1B,MACE;AAAA,MACE,QAAQ,IAAI,CAAC,YAAY;AAAA,QACvB,OAAO,OAAO,MAAM,YAAY;AAAA,QAChC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO,SAAS;AAAA,QACvB,MAAM,OAAO,QAAQ;AAAA,MACvB,EAAE;AAAA,IACJ;AAAA,IACF,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAS,UAASA,gBAAe;AAAA,EACxC,GAAG,CAAC,SAASA,gBAAe,CAAC;AAE7B,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,SAAS;AACrB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,QAAM,eAAe,MAAM,YAAY,YAAY,SAAS,CAAC,OAAO,CAAC;AAErE,QAAM,eAAe,MAAM,YAAY,MAAM;AAC3C,QAAI,SAAU,UAAS;AAAA,EACzB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,iBAAiB,MAAM,YAAY,MAAM;AAC7C,QAAI,QAAQ;AACV,mBAAa;AACb,mBAAa;AACb;AAAA,IACF;AACA,QAAI,CAAC,SAAS;AACZ,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAS,cAAc,QAAQ,YAAY,CAAC;AAEhD,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,cAAU,IAAI;AACd,QAAI;AACF,mBAAa;AACb,YAAM,OAAO,SAAS,IAAI;AAC1B,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,cAAQ,MAAM,iCAAiC,GAAG;AAAA,IACpD,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,cAAc,MAAM,CAAC;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,CAAC,UAAU,mBAAmB;AAAA,QAC9B,SAAS,kCAAkC;AAAA,MAC7C;AAAA,MACA,MAAM,CAAC,UAAU,WAAW;AAAA,MAC5B,UAAU,CAAC,UAAU,IAAI;AAAA,MACzB,SAAS;AAAA,MACT,WAAW,CAAC,UAAU;AACpB,YAAI,QAAS;AACb,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,gBAAM,eAAe;AACrB,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,MAEA,+BAAC,SAAI,WAAU,0CACb;AAAA,6BAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,UAC3E,UACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,WAAW,CAAC,UAAU;AACpB,oBAAI,MAAM,QAAQ,UAAU;AAC1B,wBAAM,eAAe;AACrB,6BAAW,KAAK;AAChB,+BAAa;AACb;AAAA,gBACF;AACA,oBAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,wBAAM,eAAe;AACrB,sBAAI,CAAC,QAAQ;AACX,yBAAK,WAAW;AAAA,kBAClB;AAAA,gBACF;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,SAAS,SAAS,OAAO,KAAK,YAAY,IAAI,MAAS;AAAA,oBAClE;AAAA,oBACA,mBAAmB;AAAA,oBACnB,YAAW;AAAA,oBACX,iBAAgB;AAAA,oBAChB;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,SAASA,oBAAmB;AAAA,oBACnC,KAAK;AAAA,oBACL,UAAU,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA,oBACtE,WAAU;AAAA,oBACV,sBAAqB;AAAA,oBACrB,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBACC,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,gBAC/D,qBAAC,SAAI,WAAU,2BACb;AAAA,uCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,WAAW,GAAG,UAAU,QACzE;AAAA,6BAAS,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,oBAC7D,EAAE,6CAA6C;AAAA,qBAClD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,SAAS,MAAM;AACb,qCAAa;AACb,mCAAW,KAAK;AAChB,iCAAS,SAAS,MAAS;AAAA,sBAC7B;AAAA,sBACA,UAAU;AAAA,sBAET,YAAE,2BAA2B,QAAQ;AAAA;AAAA,kBACxC;AAAA,mBACF;AAAA;AAAA;AAAA,UACF,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA,oBAAmB;AAAA,cAC1B,KAAK;AAAA,cACL,UAAU,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA,cACtE,WAAU;AAAA,cACV,sBAAqB;AAAA,cACrB,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA,WAEJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,kBAAI,QAAQ;AACV,6BAAa;AACb,6BAAa;AACb;AAAA,cACF;AACA,kBAAI,SAAS;AACX,6BAAa;AACb,yBAAS,SAAS,MAAS;AAAA,cAC7B;AACA,yBAAW,CAAC,SAAS,CAAC,IAAI;AAAA,YAC5B;AAAA,YACA,iBAAe,SAAS,OAAO;AAAA,YAC/B,cAAY,UAAU,EAAE,2BAA2B,QAAQ,IAAI,EAAE,yBAAyB,MAAM;AAAA,YAE/F,oBAAU,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,UAAO,WAAU,WAAU;AAAA;AAAA,QACrE;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAYA,SAAS,oBACP,UACA,cACA,eACe;AACf,QAAM,WAAW,UAAU,YAAY;AACvC,QAAM,gBAAgB,UAAU,iBAAiB,UAAU,WAAW;AACtE,QAAM,iBAAiB,UAAU,kBAAkB;AACnD,QAAM,eACJ,UAAU,SAAS,YAAY,UAAU,UAAU,WAAW;AAChE,SAAO;AAAA,IACL,aACG,UAAU,eAAe,SAAS,YAAY,KAAK,KACnD,gBAAgB,aAAa,KAAK,KACnC;AAAA,IACF,MAAM;AAAA,IACN,cACG,UAAU,gBAAgB,SAAS,aAAa,KAAK,KACrD,iBAAiB,cAAc,KAAK,KACrC;AAAA,IACF,cAAe,UAAU,gBAAgB,SAAS,aAAa,KAAK,KAAM;AAAA,IAC1E,WAAY,eAAe,aAAa,cAAc,UAAU,KAAK,KAAM;AAAA,IAC3E,UAAW,eAAe,YAAY,cAAc,SAAS,KAAK,KAAM;AAAA,IACxE,WAAY,gBAAgB,aAAa,eAAe,UAAU,KAAK,KAAM;AAAA,EAC/E;AACF;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAgBG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAuC,IAAI;AACzE,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAwB,UAAU;AACtE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAwB,iBAAiB,IAAI;AACvF,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM;AAAA,IAAwB,MACtE,oBAAoB,kBAAkB,cAAc,iBAAiB,IAAI;AAAA,EAC3E;AACA,QAAM,cAAc,MAAM,OAAsB,UAAU;AAC1D,QAAM,sBAAsB,MAAM,OAAyC,IAAI;AAE/E,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,gBAAgB,aAAa,KAAK,EAAE,OAAQ,QAAO;AACvD,UAAM,QAAQ,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU;AAC/D,WAAO,OAAO,SAAS;AAAA,EACzB,GAAG,CAAC,YAAY,cAAc,SAAS,CAAC;AAExC,QAAM,UAAU,MAAM;AACpB,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,UAAU;AACrB,iBAAW,UAAU;AACrB,oBAAc,iBAAiB,IAAI;AACnC,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,eAAe,YAAY,MAAM,YAAY,CAAC;AAElD,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,YAAY;AACvB,uBAAiB,oBAAoB,kBAAkB,cAAc,iBAAiB,IAAI,CAAC;AAAA,IAC7F;AAAA,EACF,GAAG,CAAC,eAAe,kBAAkB,cAAc,IAAI,CAAC;AAExD,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,SAAU;AACvB,UAAM,aAAa;AACnB,QAAI,cAAc,oBAAoB,SAAS;AAC7C,0BAAoB,QAAQ,UAAU;AAAA,IACxC;AACA,SAAK,gBAAgB,cAAc,MAAS;AAAA,EAC9C,GAAG,CAAC,cAAc,MAAM,eAAe,CAAC;AAExC,QAAM,uBAAuB,MAAM,YAAY,MAAM;AACnD,QAAI,cAAc;AAChB,mBAAa;AACb,YAAM,cAAc,OAAO;AAC3B;AAAA,IACF;AACA,YAAQ,QAAQ;AAChB,SAAK,gBAAgB;AAAA,EACvB,GAAG,CAAC,cAAc,cAAc,eAAe,CAAC;AAEhD,QAAM,yBAAyB,MAAM,YAAY,MAAM;AACrD,QAAI,cAAc;AAChB,mBAAa;AACb,YAAM,cAAc,OAAO;AAC3B;AAAA,IACF;AACA,YAAQ,UAAU;AAAA,EACpB,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,QAAM,eAAe,MAAM,YAAY,MAAM;AAC3C,iBAAa;AACb,YAAQ,IAAI;AACZ,eAAW,UAAU;AACrB,kBAAc,iBAAiB,IAAI;AACnC,qBAAiB,oBAAoB,kBAAkB,cAAc,iBAAiB,IAAI,CAAC;AAAA,EAC7F,GAAG,CAAC,eAAe,YAAY,kBAAkB,cAAc,YAAY,CAAC;AAE5E,QAAM,uBAAuB,MAAM,YAAY,MAAwB;AACrE,UAAM,OAAO,cAAc;AAC3B,UAAM,iBAAiB,cAAc,YAAY,KAAK;AACtD,UAAM,kBAAkB,cAAc,aAAa,KAAK;AACxD,UAAM,kBAAkB,cAAc,aAAa,KAAK;AACxD,UAAM,eAAe,cAAc,UAAU,KAAK;AAClD,UAAM,cAAc,cAAc,SAAS,KAAK;AAChD,UAAM,eAAe,cAAc,UAAU,KAAK;AAClD,UAAM,gBACJ,SAAS,WACL,CAAC,cAAc,WAAW,EAAE,OAAO,CAAC,UAAU,MAAM,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,IAC3E;AACN,UAAM,sBAAsB,kBAAkB,iBAAiB;AAC/D,UAAM,eAAe,kBAAkB,YAAY,CAAC;AACpD,UAAM,oBACJ,SAAS,WACL;AAAA,MACE,GAAI,aAAa,iBAAiB,kBAAkB,WAAW,CAAC;AAAA,MAChE,WAAW,gBAAgB;AAAA,MAC3B,UAAU,eAAe;AAAA,IAC3B,IACA;AACN,UAAM,qBACJ,SAAS,YACL,EAAE,GAAI,aAAa,kBAAkB,CAAC,GAAI,WAAW,gBAAgB,KAAK,IAC1E;AACN,WAAO;AAAA,MACL,GAAI,oBAAoB,CAAC;AAAA,MACzB,UAAU;AAAA,QACR,GAAG;AAAA,QACH;AAAA,QACA,aAAa;AAAA,QACb,cAAc,mBAAmB;AAAA,QACjC,cAAc,mBAAmB;AAAA,QACjC,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,MACA,SAAS,kBAAkB,WAAW;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,kBAAkB,aAAa,CAAC;AAEpC,QAAM,sBAAsB,MAAM,YAAY,YAAY;AACxD,QAAI;AACF,mBAAa;AACb,YAAM,OAAO,SAAS,UAAU;AAChC,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAM,iCAAiC,GAAG;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,cAAc,MAAM,CAAC;AAE9C,QAAM,qBAAqB,MAAM,YAAY,YAAY;AACvD,QAAI;AACF,mBAAa;AACb,YAAM,UAAU,qBAAqB;AACrC,YAAM,eAAe,OAAO;AAC5B,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,sBAAsB,cAAc,cAAc,CAAC;AAEvD,MAAI,SAAS,UAAU;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAM,eAAe;AACrB,yBAAa;AACb;AAAA,UACF;AACA,cAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,kBAAM,eAAe;AACrB,gBAAI,CAAC,OAAQ,MAAK,oBAAoB;AAAA,UACxC;AAAA,QACF;AAAA,QAEA,+BAAC,SAAI,WAAU,0CACb;AAAA,+BAAC,SAAI,WAAU,4BACb;AAAA,gCAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,YAC5E;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,SAAS;AAClB,6BAAW,IAAI;AACf,gCAAc,IAAI;AAClB,8BAAY,UAAU;AACtB,sBAAI,CAAC,KAAM;AACX,wBAAM,QAAQ,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,IAAI;AACzD,sBAAI,OAAO,cAAc;AACvB,kCAAc,MAAM,YAAY;AAAA,kBAClC,OAAO;AACL,0BAAM,aAAa;AACnB,uCAAmB,YAAY,OAAO,IAAI,EACvC,KAAK,CAAC,aAAa;AAClB,0BAAI,YAAY,YAAY,YAAY,WAAY,eAAc,QAAQ;AAAA,oBAC5E,CAAC,EACA,MAAM,MAAM;AAAA,oBAAC,CAAC;AAAA,kBACnB;AAAA,gBACF;AAAA,gBACA,YAAY,OAAO,UAAU;AAC3B,wBAAM,UAAU,MAAM,gBAAgB,KAAK;AAC3C,yBAAO,QAAQ,IAAsB,CAAC,SAAS;AAAA,oBAC7C,IAAI,IAAI;AAAA,oBACR,OAAO,IAAI;AAAA,oBACX,UAAU,IAAI,YAAY;AAAA,oBAC1B,MACE,IAAI,SAAS,WACX,oBAAC,aAAU,WAAU,iCAAgC,IAErD,oBAAC,aAAU,WAAU,iCAAgC;AAAA,kBAE3D,EAAE;AAAA,gBACJ;AAAA,gBACA,SAAS,CAAC,EAAE,SAAS,MAAM;AACzB,sCAAoB,UAAU;AAAA,gBAChC;AAAA,gBACA,mBAAmB,EAAE,6CAA6C,wBAAmB;AAAA,gBACrF,cAAc,EAAE,yCAAyC,yBAAoB;AAAA,gBAC7E,YAAY,EAAE,uCAAuC,qBAAqB;AAAA,gBAC1E,mBAAmB,CAAC,OAClB,EAAE,0CAA0C,6BAA6B,EAAE,GAAG,CAAC;AAAA;AAAA,YAEnF;AAAA,YACC,kBACC,qBAAC,OAAE,WAAU,yDACX;AAAA,kCAAC,WAAQ,WAAU,4BAA2B;AAAA,cAC7C,EAAE,yCAAyC,yBAAoB;AAAA,eAClE,IACE;AAAA,YACH,aACC,qBAAC,OAAE,WAAU,yDACX;AAAA,kCAAC,QAAK,WAAU,eAAc,eAAW,MAAC;AAAA,cAC1C,oBAAC,UAAK,WAAU,YAAY,sBAAW;AAAA,eACzC,IACE;AAAA,YACH,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,YAC/D,qBAAC,SAAI,WAAU,2BACb;AAAA,mCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,oBAAoB,GAAG,UAAU,QAClF;AAAA,yBAAS,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,gBAC7D,EAAE,6CAA6C;AAAA,iBAClD;AAAA,cACA,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,cAAc,UAAU,QAC9E,YAAE,2BAA2B,QAAQ,GACxC;AAAA,eACF;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,EAAE,2BAA2B,QAAQ;AAAA,cAEjD,8BAAC,KAAE,WAAU,WAAU;AAAA;AAAA,UACzB;AAAA,WACF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,SAAS,YAAY;AACvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAM,eAAe;AACrB,yBAAa;AACb;AAAA,UACF;AACA,cAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,kBAAM,eAAe;AACrB,gBAAI,CAAC,OAAQ,MAAK,mBAAmB;AAAA,UACvC;AAAA,QACF;AAAA,QAEA;AAAA,+BAAC,SAAI,WAAU,0CACb;AAAA,iCAAC,SAAI,WAAU,aACb;AAAA,kCAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,cAC5E,oBAAC,OAAE,WAAU,iCACV,YAAE,gDAAgD,4CAA4C,GACjG;AAAA,eACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,cAAY,EAAE,2BAA2B,QAAQ;AAAA,gBAEjD,8BAAC,KAAE,WAAU,WAAU;AAAA;AAAA,YACzB;AAAA,aACF;AAAA,UAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,iCAAC,SAAI,WAAU,6BACb;AAAA,mCAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,2CAA2C,cAAc,GAC9D;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,cAAc;AAAA,oBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,aAAa,MAAM,OAAO,MAAM,EAAE;AAAA,oBAC9F,aAAa,EAAE,iDAAiD,oBAAoB;AAAA;AAAA,gBACtF;AAAA,iBACF;AAAA,cACA,qBAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,gDAAgD,eAAe,GACpE;AAAA,gBACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,cAAc,SAAS,YAAY,cAAc;AAAA,sBAC1D,MAAK;AAAA,sBACL,SAAS,MAAM,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,UAAU,EAAE;AAAA,sBAEvE,YAAE,+CAA+C,SAAS;AAAA;AAAA,kBAC7D;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,cAAc,SAAS,WAAW,cAAc;AAAA,sBACzD,MAAK;AAAA,sBACL,SAAS,MAAM,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,SAAS,EAAE;AAAA,sBAEtE,YAAE,8CAA8C,QAAQ;AAAA;AAAA,kBAC3D;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA,YAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,mCAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,mDAAmD,eAAe,GACvE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,cAAc;AAAA,oBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,MAAM,OAAO,MAAM,EAAE;AAAA,oBAC/F,aAAa,EAAE,iDAAiD,kBAAkB;AAAA;AAAA,gBACpF;AAAA,iBACF;AAAA,cACA,qBAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,mDAAmD,eAAe,GACvE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,cAAc;AAAA,oBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,MAAM,OAAO,MAAM,EAAE;AAAA,oBAC/F,aAAa,EAAE,iDAAiD,iBAAiB;AAAA;AAAA,gBACnF;AAAA,iBACF;AAAA,eACF;AAAA,YAEC,cAAc,SAAS,WACtB,qBAAC,SAAI,WAAU,6BACb;AAAA,mCAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,mCAAmC,YAAY,GACpD;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,cAAc;AAAA,oBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,MAAM,OAAO,MAAM,EAAE;AAAA,oBAC5F,aAAa,EAAE,mCAAmC,YAAY;AAAA;AAAA,gBAChE;AAAA,iBACF;AAAA,cACA,qBAAC,SAAI,WAAU,aACb;AAAA,oCAAC,WAAM,WAAU,uCACd,YAAE,kCAAkC,WAAW,GAClD;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,cAAc;AAAA,oBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,UAAU,MAAM,OAAO,MAAM,EAAE;AAAA,oBAC3F,aAAa,EAAE,kCAAkC,WAAW;AAAA;AAAA,gBAC9D;AAAA,iBACF;AAAA,eACF,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,kCAAC,WAAM,WAAU,uCACd,YAAE,+CAA+C,YAAY,GAChE;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,cAAc;AAAA,kBACrB,UAAU,CAAC,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,MAAM,OAAO,MAAM,EAAE;AAAA,kBAC5F,aAAa,EAAE,0DAA0D,gBAAgB;AAAA;AAAA,cAC3F;AAAA,eACF;AAAA,YAGD,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,YAE/D,qBAAC,SAAI,WAAU,2BACb;AAAA,mCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,mBAAmB,GAAG,UAAU,QACjF;AAAA,yBAAS,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,gBAC7D,EAAE,6CAA6C;AAAA,iBAClD;AAAA,cACA,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,cAAc,UAAU,QAC9E,YAAE,2BAA2B,QAAQ,GACxC;AAAA,eACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,gBAAgB;AAAA,MACtB,OAAO,iBAAiB;AAAA,MACxB,MAAM,kBAAkB,UAAU,SAAS,WAAW,WAAW;AAAA,MACjE,WAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,kBAAkB;AAAA;AAAA,EACpB;AAEJ;AAoKA,MAAM,kCAAkC,CAAC,UAA4B;AACnE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,OAAO,CAAC,UAAU,UAAU,MAAS;AAAA,EACpD;AACA,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO;AACT;AAEA,MAAM,0BAA0B,CAAC,UAA+E;AAC9G,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,SAAO,OAAO,QAAQ,KAAK,EAAE,OAAgC,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAClF,UAAM,aAAa,IAAI,WAAW,KAAK,IAAI,MAAM,MAAM,GAAG;AAC1D,QAAI,UAAU,IAAI;AAClB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEA,MAAM,uBAAuB,CAAC,WAAmC;AAC/D,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,UAAW,OAAe,iBAAkB,OAAe;AACjE,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,SAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAC9C;AAEA,eAAe,cAAc,IAAY,MAAyB,cAAsD;AACtH,QAAM,SAAS,IAAI,gBAAgB,EAAE,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AACnE,QAAM,UAAU,MAAM;AAAA,IACpB,cAAc,SAAS,UAAU,WAAW,QAAQ,IAAI,OAAO,SAAS,CAAC;AAAA,IACzE;AAAA,IACA,EAAE,aAAa;AAAA,EACjB;AACA,QAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC/D,SAAO,MAAM,SAAU,MAAM,CAAC,IAAuB;AACvD;AAEA,SAAS,oBAAoB,UAA+C,UAA0B;AACpG,MAAI,CAAC,SAAU,QAAO,YAAY;AAClC,QAAM,cACJ,OAAO,SAAS,UAAU,gBAAgB,YAAY,SAAS,SAAS,YAAY,KAAK,EAAE,SACvF,SAAS,SAAS,YAAY,KAAK,IACnC;AACN,MAAI,YAAa,QAAO;AACxB,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,gBAAgB,SAAS,UAAU,iBAAiB;AAC1D,QAAM,YACH,SAAS,iBAAiB,QAAQ,cAAc,KAAK,KACrD,eAAe,iBAAiB,cAAc,cAAc,KAAK,KAClE;AACF,QAAM,YACH,SAAS,aAAa,QAAQ,UAAU,KAAK,KAC7C,eAAe,aAAa,cAAc,UAAU,KAAK,KAC1D;AACF,QAAM,WACH,SAAS,YAAY,QAAQ,SAAS,KAAK,KAC3C,eAAe,YAAY,cAAc,SAAS,KAAK,KACxD;AACF,QAAM,QAAQ,CAAC,aAAa,WAAW,QAAQ,EAAE,OAAO,CAAC,SAAS,QAAQ,KAAK,MAAM;AACrF,MAAI,MAAM,OAAQ,QAAO,MAAM,KAAK,GAAG;AACvC,QAAM,YACH,SAAS,UAAU,gBAAgB,aAClC,SAAS,SAAS,eAAe,UAAU,KAAK,KAClD;AACF,MAAI,UAAW,QAAO;AACtB,SAAO,YAAY;AACrB;AAEA,SAAS,qBAAqB,UAA+C;AAC3E,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,UACH,SAAS,UAAU,gBAAgB,SAAS,SAAS,aAAa,KAAK,KACxE;AACF,MAAI,QAAS,QAAO;AACpB,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAkB,MAA8C;AAC5F,QAAM,SAA2B,CAAC;AAClC,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,YAAY,SAAS,KAAM;AAC/C,UAAM,SAAS;AACf,UAAM,KAAK,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK;AACvD,QAAI,CAAC,GAAI;AACT,UAAM,cACJ,OAAO,OAAO,iBAAiB,WAC3B,OAAO,eACP,OAAO,OAAO,SAAS,WACrB,OAAO,OACP;AACR,UAAM,QAAQ,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAChF,UAAM,SAAS,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AACnF,UAAM,QAAQ,gBAAgB,SAAS,UAAU;AACjD,UAAM,WAAW,SAAS,WAAW,QAAQ,UAAU;AACvD,WAAO,KAAK,EAAE,IAAI,OAAO,GAAG,KAAK,IAAI,UAAU,MAAM,cAAc,MAAM,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,qBAAC,SAAI,WAAW,GAAG,sBAAsB,QAAQ,gBAAgB,SAAS,GACxE;AAAA,yBAAC,SAAI,WAAU,gDACb;AAAA,0BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,MAC3E;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,MAAM,cAAc;AAEpB,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,SAAS,EAAE;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,eAAe,MAAM,QAAQ,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC;AAC9D,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,WAAO,YAAY,KAAK,YAAY;AAAA,EACtC,GAAG,CAAC,YAAY,CAAC;AACjB,QAAM,EAAE,WAAW,SAAS,IAAI,uBAAuB,OAAO;AAAA,IAC5D,UAAU,OAAO,aAAa,WAAW,WAAW;AAAA,IACpD,UAAU,CAAC,WAAW,CAAC,CAAC,SAAS,UAAU,CAAC,aAAa,UAAU,CAAC;AAAA,IACpE,WAAW;AAAA,EACb,CAAC;AAED,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAS;AACZ,eAAS,SAAS,EAAE;AACpB,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,UAAM,aAAa,aAAa,SAAS,eAAe;AACxD,QAAI,WAAW,UAAU,CAAC,YAAY,KAAK,UAAU,GAAG;AACtD,eAAS,EAAE,+CAA+C,8BAA8B,CAAC;AACzF;AAAA,IACF;AACA,aAAS,IAAI;AACb,cAAU,IAAI;AACd,QAAI;AACF,YAAM,OAAO,WAAW,SAAS,aAAa,IAAI;AAClD,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,wCAAwC,uBAAuB;AACvE,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;AAE5B,QAAM,mBACJ,CAAC,WAAW,CAAC,SACT;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,MAAM,WAAW,IAAI;AAAA,IAC9B,WAAW,CAAC,UAA+C;AACzD,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,cAAM,eAAe;AACrB,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEP,SACE,oBAAC,SAAI,WAAW,GAAG,uCAAuC,CAAC,UAAU,mBAAmB,IAAI,GAC1F,+BAAC,SAAI,WAAU,0CACb;AAAA,yBAAC,SAAI,WAAU,kBAAkB,GAAG,kBAClC;AAAA,0BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,MAC3E,UACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,UAAU,CAAC,UAAU;AACnB,kBAAM,eAAe;AACrB,gBAAI,CAAC,OAAQ,MAAK,WAAW;AAAA,UAC/B;AAAA,UACA,WAAW,CAAC,UAAU;AACpB,gBAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAM,eAAe;AACrB,yBAAW,KAAK;AAChB,uBAAS,IAAI;AACb;AAAA,YACF;AACA,gBAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,oBAAM,eAAe;AACrB,kBAAI,CAAC,OAAQ,MAAK,WAAW;AAAA,YAC/B;AAAA,UACF;AAAA,UAEA;AAAA,iCAAC,SAAI,WAAU,YACb;AAAA,kCAAC,QAAK,WAAU,6EAA4E;AAAA,cAC5F;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP,UAAU,CAAC,UAAU;AACnB,wBAAI,MAAO,UAAS,IAAI;AACxB,6BAAS,MAAM,OAAO,KAAK;AAAA,kBAC7B;AAAA,kBACA;AAAA,kBACA,MAAK;AAAA,kBACL,WAAS;AAAA,kBACT,YAAY;AAAA;AAAA,cACd;AAAA,eACF;AAAA,YACC,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,YAC9D,CAAC,SAAS,YACT,qBAAC,OAAE,WAAU,iCACV;AAAA,gBAAE,iDAAiD,QAAW,EAAE,MAAM,UAAU,YAAY,CAAC;AAAA,cAAG;AAAA,cACjG;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAM,6BAA6B,UAAU,EAAE;AAAA,kBAE9C,YAAE,mDAAmD;AAAA;AAAA,cACxD;AAAA,eACF,IACE;AAAA,YACH,CAAC,SAAS,CAAC,aAAa,WACvB,oBAAC,OAAE,WAAU,iCAAiC,YAAE,8CAA8C,GAAE,IAC9F;AAAA,YACJ,qBAAC,SAAI,WAAU,2BACb;AAAA,mCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,UAAU,QACvC;AAAA,yBAAS,oBAAC,WAAQ,WAAU,iCAAgC,IAAK;AAAA,gBACjE,EAAE,+CAA+C,gCAAsB;AAAA,iBAC1E;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,+BAAW,KAAK;AAChB,6BAAS,SAAS,EAAE;AACpB,6BAAS,IAAI;AAAA,kBACf;AAAA,kBACA,UAAU;AAAA,kBAET,YAAE,2BAA2B,QAAQ;AAAA;AAAA,cACxC;AAAA,eACF;AAAA;AAAA;AAAA,MACF,IAEA,oBAAC,SAAI,WAAU,QAAQ,wBAAc,EAAE,OAAO,WAAW,CAAC,GAAE;AAAA,OAEhE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AACtB,cAAI,SAAS;AACX,qBAAS,SAAS,EAAE;AACpB,qBAAS,IAAI;AAAA,UACf;AACA,qBAAW,CAAC,SAAS,CAAC,IAAI;AAAA,QAC5B;AAAA,QACA,cAAY,UAAU,EAAE,2BAA2B,QAAQ,IAAI,EAAE,yBAAyB,MAAM;AAAA,QAChG,UAAU;AAAA,QAET,oBAAU,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,UAAO,WAAU,WAAU;AAAA;AAAA,IACrE;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,SAAS,IAAI;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,oBAAoB,MAAM,OAAyC,IAAI;AAC7E,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,CAAC,UAAU,mBAAmB;AAAA,EAChC;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,UACI,gBACA;AAAA,EACN;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAS;AACZ,eAAS,SAAS,IAAI;AACtB,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAS,mBAAkB,UAAU;AAAA,EAC5C,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAU,MAAM;AAAA,IACpB,MAAO,SAAS,QAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ,SAAS,MAAM,KAAK,OAAO;AAAA,IACrF,CAAC,OAAO,SAAS,KAAK;AAAA,EACxB;AAEA,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,QAAI,CAAC,WAAW,CAAC,kBAAkB,QAAS;AAC5C,UAAM,QAAQ,SAAS,SAAS,SAAS;AACzC,sBAAkB,QAAQ,KAAK;AAAA,EACjC,GAAG,CAAC,SAAS,OAAO,SAAS,KAAK,CAAC;AAEnC,QAAM,UAAU,MAAM;AACpB,QAAI,QAAS,eAAc;AAAA,EAC7B,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,iBAAiB,MAAM,YAAY,MAAM;AAC7C,QAAI,CAAC,SAAS;AACZ,iBAAW,IAAI;AACf,oBAAc;AACd,WAAK,cAAc;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,aAAa,CAAC;AAE1C,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,cAAU,IAAI;AACd,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,SAAS,IAAI;AAC1B,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,UACJ,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU,EAAE,sCAAsC,4BAA4B;AAC1H,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,uCAAuC,CAAC,UAAU,mBAAmB,IAAI;AAAA,MACvF,MAAM,CAAC,UAAU,WAAW;AAAA,MAC5B,UAAU,CAAC,UAAU,IAAI;AAAA,MACzB,SAAS;AAAA,MACT,WAAW,CAAC,UAAU;AACpB,YAAI,QAAS;AACb,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,gBAAM,eAAe;AACrB,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,MAEA,+BAAC,SAAI,WAAU,0CACb;AAAA,6BAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,UAC3E,UACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,WAAW,CAAC,UAAU;AACpB,oBAAI,MAAM,QAAQ,UAAU;AAC1B,wBAAM,eAAe;AACrB,6BAAW,KAAK;AAChB,2BAAS,SAAS,IAAI;AACtB,2BAAS,IAAI;AACb;AAAA,gBACF;AACA,oBAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,wBAAM,eAAe;AACrB,sBAAI,CAAC,OAAQ,MAAK,WAAW;AAAA,gBAC/B;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY,OAAO,UAAU;AAC3B,4BAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,6BAAO,MAAM,IAAsB,CAAC,UAAU;AAAA,wBAC5C,IAAI,KAAK;AAAA,wBACT,OAAO,KAAK;AAAA,wBACZ,MAAM,oBAAC,SAAM,WAAU,iCAAgC;AAAA,sBACzD,EAAE;AAAA,oBACJ;AAAA,oBACA,SAAS,CAAC,EAAE,SAAS,MAAM;AACzB,wCAAkB,UAAU;AAC5B,oCAAc;AAAA,oBAChB;AAAA,oBACA,mBAAmB,EAAE,4CAA4C,kBAAkB;AAAA,oBACnF,cAAc,EAAE,wCAAwC,wBAAmB;AAAA,oBAC3E,YAAY,EAAE,sCAAsC,oBAAoB;AAAA,oBACxE,mBAAmB,CAAC,OAAO,EAAE,yCAAyC,4BAA4B,EAAE,GAAG,CAAC;AAAA;AAAA,gBAC1G;AAAA,gBACC,UACC,qBAAC,OAAE,WAAU,yDACX;AAAA,sCAAC,WAAQ,WAAU,4BAA2B;AAAA,kBAC7C,EAAE,wCAAwC,wBAAmB;AAAA,mBAChE,IACE;AAAA,gBACH,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,gBAC/D,qBAAC,SAAI,WAAU,2BACb;AAAA,uCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,WAAW,GAAG,UAAU,QACzE;AAAA,6BAAS,oBAAC,WAAQ,WAAU,iCAAgC,IAAK;AAAA,oBACjE;AAAA,qBACH;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,SAAS,MAAM;AACb,mCAAW,KAAK;AAChB,iCAAS,SAAS,IAAI;AACtB,iCAAS,IAAI;AAAA,sBACf;AAAA,sBACA,UAAU;AAAA,sBAET,YAAE,2BAA2B,QAAQ;AAAA;AAAA,kBACxC;AAAA,mBACF;AAAA;AAAA;AAAA,UACF,IAEA,oBAAC,SAAI,WAAU,gCACZ,oBACC,oBAAC,UAAK,WAAU,WAAW,kBAAQ,OAAM,IACvC,QACF,oBAAC,UAAK,WAAU,WAAW,iBAAM,IAEjC,oBAAC,UAAK,WAAU,iCAAiC,sBAAW,GAEhE;AAAA,WAEJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,kBAAI,SAAS;AACX,yBAAS,SAAS,IAAI;AACtB,yBAAS,IAAI;AAAA,cACf;AACA,yBAAW,CAAC,SAAS;AACnB,sBAAM,OAAO,CAAC;AACd,oBAAI,CAAC,QAAQ,KAAM,eAAc;AACjC,uBAAO;AAAA,cACT,CAAC;AACD,mBAAK,cAAc;AAAA,YACrB;AAAA,YACA,cAAY,UAAU,EAAE,2BAA2B,QAAQ,IAAI,EAAE,yBAAyB,MAAM;AAAA,YAE/F,oBAAU,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,UAAO,WAAU,WAAU;AAAA;AAAA,QACrE;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAIA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAgBG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,SAAS,IAAI;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,oBAAoB,MAAM,OAAyC,IAAI;AAE7E,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,CAAC,UAAU,mBAAmB;AAAA,EAChC;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,UACI,gBACA;AAAA,EACN;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAS;AACZ,eAAS,SAAS,IAAI;AACtB,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAS,mBAAkB,UAAU;AAAA,EAC5C,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,OAAwF;AACvF,UAAI,CAAC,GAAI,QAAO,EAAE,OAAO,MAAM,aAAa,KAAK;AACjD,YAAM,SAAS,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AACtD,UAAI,QAAQ;AACV,eAAO;AAAA,UACL,OAAO,OAAO,QAAQ,OAAO;AAAA,UAC7B,aAAa,OAAO,eAAe;AAAA,QACrC;AAAA,MACF;AACA,YAAM,WACJ,YAAY,OAAQ,UAAkB,SAAS,WAAY,SAAiB,OAAO;AACrF,YAAM,WACJ,YAAY,OAAQ,UAAkB,SAAS,WAAY,SAAiB,OAAO;AACrF,YAAM,kBACJ,YAAY,OAAQ,UAAkB,gBAAgB,WACjD,SAAiB,cAClB;AACN,aAAO;AAAA,QACL,OAAO,YAAY,YAAY;AAAA,QAC/B,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,eAAe,SAAS,SAAS,IAAI;AAAA,IAC3C,CAAC,OAAO,gBAAgB,KAAK;AAAA,EAC/B;AAEA,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,QAAI,CAAC,WAAW,CAAC,kBAAkB,QAAS;AAC5C,sBAAkB,QAAQ,EAAE;AAAA,EAC9B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAU,MAAM;AACpB,QAAI,QAAS,eAAc;AAAA,EAC7B,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,cAAU,IAAI;AACd,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,SAAS,IAAI;AAC1B,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,MAAM,CAAC,UAAU,WAAW;AAAA,MAC5B,UAAU,CAAC,UAAU,IAAI;AAAA,MACzB,SAAS,MAAM;AACb,YAAI,QAAS;AACb,mBAAW,IAAI;AACf,sBAAc;AACd,aAAK,cAAc,EAAE;AAAA,MACvB;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,YAAI,QAAS;AACb,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,gBAAM,eAAe;AACrB,qBAAW,IAAI;AACf,wBAAc;AACd,eAAK,cAAc,EAAE;AAAA,QACvB;AAAA,MACF;AAAA,MAEA,+BAAC,SAAI,WAAU,0CACb;AAAA,6BAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,UAC3E,UACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,WAAW,CAAC,UAAU;AACpB,oBAAI,MAAM,QAAQ,UAAU;AAC1B,wBAAM,eAAe;AACrB,6BAAW,KAAK;AAChB,2BAAS,SAAS,IAAI;AACtB,2BAAS,IAAI;AACb;AAAA,gBACF;AACA,oBAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,wBAAM,eAAe;AACrB,sBAAI,CAAC,OAAQ,MAAK,WAAW;AAAA,gBAC/B;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY,OAAO,UAAU;AAC3B,4BAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,6BAAO,MAAM,IAAsB,CAAC,UAAU;AAAA,wBAC5C,IAAI,KAAK;AAAA,wBACT,OAAO,KAAK,QAAQ,KAAK;AAAA,wBACzB,UAAU,KAAK;AAAA,wBACf;AAAA,sBACF,EAAE;AAAA,oBACJ;AAAA,oBACA,UAAU;AAAA,oBACV,SAAS,CAAC,EAAE,SAAS,MAAM;AACzB,wCAAkB,UAAU;AAC5B,oCAAc;AAAA,oBAChB;AAAA,oBACA,mBAAmB;AAAA,oBACnB;AAAA,oBACA,YAAY;AAAA,oBACZ,mBAAmB,CAAC,OAAO,aAAa,EAAE;AAAA;AAAA,gBAC5C;AAAA,gBACC,UACC,qBAAC,OAAE,WAAU,yDACX;AAAA,sCAAC,WAAQ,WAAU,4BAA2B;AAAA,kBAC7C;AAAA,mBACH,IACE;AAAA,gBACH,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,gBAC/D,qBAAC,SAAI,WAAU,qCACb;AAAA,uCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,WAAW,GAAG,UAAU,QACzE;AAAA,6BAAS,oBAAC,WAAQ,WAAU,iCAAgC,IAAK;AAAA,oBACjE;AAAA,qBACH;AAAA,kBACC,aACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,SAAS,MAAM,SAAS,IAAI;AAAA,sBAC5B,UAAU;AAAA,sBAET,YAAE,oBAAoB,OAAO;AAAA;AAAA,kBAChC,IACE;AAAA,kBACJ;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,SAAS,MAAM;AACb,mCAAW,KAAK;AAChB,iCAAS,SAAS,IAAI;AACtB,iCAAS,IAAI;AAAA,sBACf;AAAA,sBACA,UAAU;AAAA,sBAET,YAAE,2BAA2B,QAAQ;AAAA;AAAA,kBACxC;AAAA,mBACF;AAAA;AAAA;AAAA,UACF,IAEA,oBAAC,SAAI,WAAU,gBACZ,yBAAe,QACd,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,UAAK,WAAU,WAAW,yBAAe,OAAM;AAAA,YAC/C,eAAe,cACd,oBAAC,OAAE,WAAU,iCAAiC,yBAAe,aAAY,IACvE;AAAA,aACN,IAEA,oBAAC,UAAK,WAAU,iCAAiC,sBAAW,GAEhE;AAAA,WAEJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW;AAAA,YACX,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,kBAAI,SAAS;AACX,yBAAS,SAAS,IAAI;AACtB,yBAAS,IAAI;AAAA,cACf;AACA,yBAAW,CAAC,SAAS;AACnB,sBAAM,OAAO,CAAC;AACd,oBAAI,CAAC,QAAQ,KAAM,eAAc;AACjC,uBAAO;AAAA,cACT,CAAC;AACD,mBAAK,cAAc,EAAE;AAAA,YACvB;AAAA,YACA,cAAY,UAAU,EAAE,2BAA2B,QAAQ,IAAI,EAAE,yBAAyB,MAAM;AAAA,YAE/F,oBAAU,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,UAAO,WAAU,WAAU;AAAA;AAAA,QACrE;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAA6B,SAAS,MAAS;AAC/E,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,qBAAqB,MAAM;AAAA,IAC/B,aACG,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY;AAAA,MACvC,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,IACf,EAAE;AAAA,IACJ,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAS;AACZ,eAAS,SAAS,MAAS;AAC3B,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,UAAM,WAAW,QAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,KAAK,OAAO;AAC9E,QAAI,SAAS,CAAC,UAAU;AACtB,eAAS,EAAE,wCAAwC,qCAAqC,CAAC;AACzF;AAAA,IACF;AACA,cAAU,IAAI;AACd,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,UAAU,MAAM,MAAM,SAAS,IAAI;AAChD,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,UACJ,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU,EAAE,sCAAsC,4BAA4B;AAC1H,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,SAAS,CAAC,CAAC;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,uCAAuC,CAAC,UAAU,mBAAmB,IAAI;AAAA,MACvF,MAAM,CAAC,UAAU,WAAW;AAAA,MAC5B,UAAU,CAAC,UAAU,IAAI;AAAA,MACzB,SAAS,MAAM;AACb,YAAI,CAAC,SAAS;AACZ,qBAAW,IAAI;AACf,eAAK,cAAc;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,YAAI,QAAS;AACb,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,gBAAM,eAAe;AACrB,qBAAW,IAAI;AACf,eAAK,cAAc;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,+BAAC,SAAI,WAAU,0CACb;AAAA,6BAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,OAAE,WAAU,yDAAyD,iBAAM;AAAA,UAC3E,UACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,WAAW,CAAC,UAAU;AACpB,oBAAI,MAAM,QAAQ,UAAU;AAC1B,wBAAM,eAAe;AACrB,6BAAW,KAAK;AAChB,2BAAS,SAAS,MAAS;AAC3B,2BAAS,IAAI;AACb;AAAA,gBACF;AACA,oBAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,wBAAM,eAAe;AACrB,sBAAI,CAAC,OAAQ,MAAK,WAAW;AAAA,gBAC/B;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,SAAS,SAAS,QAAQ,MAAS;AAAA,oBAC9C,cAAc;AAAA,oBACd,mBAAmB;AAAA,oBACnB,iBAAe;AAAA,oBACf;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,gBACC,UACC,qBAAC,OAAE,WAAU,yDACX;AAAA,sCAAC,WAAQ,WAAU,4BAA2B;AAAA,kBAC7C,OAAO;AAAA,mBACV,IACE;AAAA,gBACH,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,gBAC/D,qBAAC,SAAI,WAAU,2BACb;AAAA,uCAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,KAAK,WAAW,GAAG,UAAU,QACzE;AAAA,6BAAS,oBAAC,WAAQ,WAAU,iCAAgC,IAAK;AAAA,oBACjE;AAAA,qBACH;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,SAAS,MAAM;AACb,mCAAW,KAAK;AAChB,iCAAS,SAAS,MAAS;AAC3B,iCAAS,IAAI;AAAA,sBACf;AAAA,sBACA,UAAU;AAAA,sBAET,YAAE,2BAA2B,QAAQ;AAAA;AAAA,kBACxC;AAAA,mBACF;AAAA;AAAA;AAAA,UACF,IAEA,oBAAC,SAAI,WAAU,gBACb;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,KAAK;AAAA,cACL,UAAU,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA,cACtE,WAAU;AAAA,cACV,sBAAqB;AAAA,cACrB,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB,GACF;AAAA,WAEJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,kBAAI,SAAS;AACX,yBAAS,eAAe;AACxB,yBAAS,IAAI;AAAA,cACf;AACA,yBAAW,CAAC,SAAS,CAAC,IAAI;AAC1B,mBAAK,cAAc;AAAA,YACrB;AAAA,YACA,cAAY,UAAU,EAAE,2BAA2B,QAAQ,IAAI,EAAE,yBAAyB,MAAM;AAAA,YAE/F,oBAAU,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,UAAO,WAAU,WAAU;AAAA;AAAA,QACrE;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEe,SAAR,wBAAyC;AAAA,EAC9C;AAAA,EACA;AACF,GAGG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,gBAAgB;AACrC,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,IAAI;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAgC,IAAI;AACtE,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAsB,CAAC,CAAC;AACtD,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA4B,OAAO;AACjE,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,CAAC;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAiB,UAAU;AACnE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA+B,IAAI;AACnF,QAAM,mBAAmB,MAAM,OAA8B,IAAI;AACjE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,EAAE;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAwB,IAAI;AAC5E,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,KAAK;AAC1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAA2B,CAAC,CAAC;AACjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,KAAK;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAS,KAAK;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAwB,IAAI;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAGtC,IAAI;AACd,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAA0B,CAAC,CAAC;AAC9E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAS,KAAK;AAChE,QAAM,oBAAoB,MAAM,OAAmC,oBAAI,IAAI,CAAC;AAC5E,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,MAAM,SAAiC,CAAC,CAAC;AACnG,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,MAAM,SAAS,KAAK;AAC9E,QAAM,2BAA2B,MAAM,OAA0C,oBAAI,IAAI,CAAC;AAC1F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAgC,CAAC,CAAC;AAChG,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAS,KAAK;AAC5E,QAAM,0BAA0B,MAAM,OAAyC,oBAAI,IAAI,CAAC;AACxF,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAyB,CAAC,CAAC;AAC3E,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,mBAAmB,MAAM,OAAkC,oBAAI,IAAI,CAAC;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAA8B,CAAC,CAAC;AAClF,QAAM,qBAAqB,MAAM,YAAY,MAAM,iBAAiB,IAAI,GAAG,CAAC,CAAC;AAC7E,QAAM,EAAE,MAAM,mBAAmB,IAAI,sBAAsB;AAC3D,QAAM,eAAe,4BAA4B;AACjD,QAAM,cAAc,MAAM,YAAY,CAAC,UAA2B;AAChE,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAChE,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,QAAQ;AACpD,YAAM,SAAS,OAAO,KAAK;AAC3B,UAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO;AAAA,IACpC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,MAAM;AAAA,IAC7B,MAAM,EAAE,gCAAgC,qCAAqC;AAAA,IAC7E,CAAC,CAAC;AAAA,EACJ;AACA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAM,EAAE,sCAAsC,gCAAsB;AAAA,IACpE,CAAC,CAAC;AAAA,EACJ;AACA,QAAM,mBAAmB,MAAM;AAAA,IAC7B,OAAO;AAAA,MACL,SAAS,EAAE,4CAA4C,2BAAsB;AAAA,MAC7E,YAAY,EAAE,gCAAgC,SAAS;AAAA,MACvD,UAAU,EAAE,6BAA6B;AAAA,MACzC,cAAc,EAAE,2CAA2C,6BAA6B;AAAA,MACxF,cAAc;AAAA,MACd,MAAM,EAAE,uBAAuB;AAAA,MAC/B,QAAQ,EAAE,yBAAyB;AAAA,IACrC;AAAA,IACA,CAAC,mBAAmB,CAAC;AAAA,EACvB;AACA,QAAM,YAAY,MAAM;AAAA,IACtB,OAAO;AAAA,MACL,SAAS,EAAE,uCAAuC,oBAAe;AAAA,MACjE,aAAa,EAAE,2CAA2C,kBAAkB;AAAA,MAC5E,OAAO,EAAE,2CAA2C,sDAAsD;AAAA,MAC1G,WAAW,EAAE,yCAAyC,sBAAsB;AAAA,MAC5E,aAAa,EAAE,2CAA2C,uBAAuB;AAAA,MACjF,aAAa,EAAE,2CAA2C,wBAAwB;AAAA,MAClF,eAAe,EAAE,6CAA6C,uBAAuB;AAAA,MACrF,cAAc,EAAE,4CAA4C,gCAAsB;AAAA,MAClF,gBAAgB,EAAE,8CAA8C,cAAc;AAAA,MAC9E,MAAM,EAAE,uBAAuB;AAAA,MAC/B,QAAQ,EAAE,yBAAyB;AAAA,IACrC;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,uBAAuB,MAAM,YAAY,CAAC,YAA6B;AAC3E,sBAAkB,CAAC,SAAS;AAC1B,YAAM,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACpD,cAAQ,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAC7C,wBAAkB,UAAU;AAC5B,aAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8B,MAAM,YAAY,CAAC,YAAoC;AACzF,6BAAyB,CAAC,SAAS;AACjC,YAAM,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACpD,cAAQ,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAC7C,+BAAyB,UAAU;AACnC,aAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,6BAA6B,MAAM,YAAY,CAAC,YAAmC;AACvF,4BAAwB,CAAC,SAAS;AAChC,YAAM,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACpD,cAAQ,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAC7C,8BAAwB,UAAU;AAClC,aAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM,YAAY,CAAC,YAA4B;AACzE,qBAAiB,CAAC,SAAS;AACzB,YAAM,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;AACvD,cAAQ,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC;AAChD,uBAAiB,UAAU;AAC3B,aAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM;AAAA,IAC1B,OAAO,UAAmB;AACxB,yBAAmB,IAAI;AACvB,UAAI;AACF,cAAMC,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,YAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,CAAAA,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,cAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC5C,QAA+B,yBAAyBA,QAAO,SAAS,CAAC,EAAE;AAAA,UAC3E,QAA+B,4BAA4BA,QAAO,SAAS,CAAC,EAAE;AAAA,QAChF,CAAC;AACD,cAAM,cAAc,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,IAAI,CAAC;AACxF,cAAM,eAAe,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,SAAS,CAAC,IAAI,CAAC;AAC/F,cAAM,SAAS,CAAC,GAAG,qBAAqB,aAAa,QAAQ,GAAG,GAAG,qBAAqB,cAAc,SAAS,CAAC;AAChH,2BAAmB,CAAC,SAAS;AAC3B,gBAAM,WAAW,CAAC,GAAG,IAAI;AACzB,iBAAO,QAAQ,CAAC,UAAU;AACxB,gBAAI,CAAC,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,EAAE,GAAG;AAClD,uBAAS,KAAK,KAAK;AAAA,YACrB;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT,CAAC;AACD,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,gBAAQ,MAAM,iCAAiC,GAAG;AAClD,cAAM,EAAE,yCAAyC,2BAA2B,GAAG,OAAO;AACtF,eAAO,CAAC;AAAA,MACV,UAAE;AACA,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO,UAAmB;AACxB,wBAAkB,IAAI;AACtB,UAAI;AACF,cAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,YAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,CAAAA,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,cAAM,OAAO,MAAM;AAAA,UACjB,uBAAuBA,QAAO,SAAS,CAAC;AAAA,QAC1C;AACA,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,gBAAM,UAAU,KAAK,OAAO,MACzB,IAAI,CAAC,SAAS;AACb,kBAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,gBAAI,CAAC,GAAI,QAAO;AAChB,kBAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACtF,kBAAM,OAAO,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACrF,mBAAO,EAAE,IAAI,OAAO,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM;AAAA,UAC1D,CAAC,EACA,OAAO,CAAC,QAA8B,CAAC,CAAC,GAAG;AAC9C,cAAI,CAAC,MAAO,sBAAqB,OAAO;AACxC,iBAAO;AAAA,QACT;AACA,YAAI,CAAC,MAAO,sBAAqB,CAAC,CAAC;AACnC,eAAO,CAAC;AAAA,MACV,SAAS,KAAK;AACZ,gBAAQ,MAAM,gCAAgC,GAAG;AACjD,YAAI,CAAC,OAAO;AACV,gBAAM,EAAE,mDAAmD,yBAAyB,GAAG,OAAO;AAAA,QAChG;AACA,eAAO,CAAC;AAAA,MACV,UAAE;AACA,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,GAAG,oBAAoB;AAAA,EAC1B;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,UAAmB;AACxB,+BAAyB,IAAI;AAC7B,UAAI;AACF,cAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACjE,YAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,CAAAA,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,cAAM,OAAO,MAAM;AAAA,UACjB,+BAA+BA,QAAO,SAAS,CAAC;AAAA,QAClD;AACA,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,gBAAM,UAAU,KAAK,OAAO,MACzB,IAAI,CAAC,SAAS;AACb,kBAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,kBAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,kBAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,gBAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAM,QAAO;AAClC,kBAAM,WACJ,QAAQ,OAAO,MAAM,aAAa,YAAY,KAAK,WAAY,KAAK,WAAuC;AAC7G,kBAAM,mBACJ,QAAQ,OAAQ,MAAc,qBAAqB,YAAa,KAAa,mBACvE,KAAa,mBACf,YAAY,OAAO,SAAS,qBAAqB,WAC9C,SAAS,mBACV;AACR,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,OAAO,MAAM,gBAAgB,WAAW,KAAK,cAAc;AAAA,cACxE,aAAa,OAAQ,MAAc,gBAAgB,WAAY,KAAa,cAAc;AAAA,cAC1F,cAAc,OAAQ,MAAc,iBAAiB,WAAY,KAAa,eAAe;AAAA,cAC7F,sBACE,OAAQ,MAAc,yBAAyB,WAC1C,KAAa,uBACd;AAAA,cACN,cAAc,OAAO,MAAM,iBAAiB,WAAW,KAAK,eAAe;AAAA,cAC3E,aACE,OAAQ,MAAc,gBAAgB,WACjC,KAAa,cACd,OAAQ,MAAc,gBAAgB,WACnC,KAAa,YAAY,SAAS,IACnC;AAAA,cACR,eACE,OAAQ,MAAc,kBAAkB,WACnC,KAAa,gBACd,OAAQ,MAAc,kBAAkB,WACrC,KAAa,cAAc,SAAS,IACrC;AAAA,cACR,aAAa,OAAQ,MAAc,gBAAgB,WAAY,KAAa,cAAc;AAAA,cAC1F;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC,EACA,OAAO,CAAC,UAAyC,CAAC,CAAC,KAAK;AAC3D,cAAI,CAAC,MAAO,6BAA4B,OAAO;AAC/C,iBAAO;AAAA,QACT;AACA,YAAI,CAAC,MAAO,6BAA4B,CAAC,CAAC;AAC1C,eAAO,CAAC;AAAA,MACV,SAAS,KAAK;AACZ,gBAAQ,MAAM,uCAAuC,GAAG;AACxD,YAAI,CAAC,OAAO;AACV;AAAA,YACE,EAAE,kDAAkD,kCAAkC;AAAA,YACtF;AAAA,UACF;AAAA,QACF;AACA,eAAO,CAAC;AAAA,MACV,UAAE;AACA,iCAAyB,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,GAAG,2BAA2B;AAAA,EACjC;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,UAAmB;AACxB,8BAAwB,IAAI;AAC5B,UAAI;AACF,cAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACjE,YAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,CAAAA,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,cAAM,OAAO,MAAM;AAAA,UACjB,8BAA8BA,QAAO,SAAS,CAAC;AAAA,QACjD;AACA,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,gBAAM,UAAU,KAAK,OAAO,MACzB,IAAI,CAAC,SAAS;AACb,kBAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,kBAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,kBAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,gBAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAM,QAAO;AAClC,kBAAM,WACJ,QAAQ,OAAO,MAAM,aAAa,YAAY,KAAK,WAAY,KAAK,WAAuC;AAC7G,kBAAM,mBACJ,QAAQ,OAAQ,MAAc,qBAAqB,YAAa,KAAa,mBACvE,KAAa,mBACf,YAAY,OAAO,SAAS,qBAAqB,WAC9C,SAAS,mBACV;AACR,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,OAAO,MAAM,gBAAgB,WAAW,KAAK,cAAc;AAAA,cACxE,aAAa,OAAQ,MAAc,gBAAgB,WAAY,KAAa,cAAc;AAAA,cAC1F,OAAO,OAAQ,MAAc,UAAU,WAAY,KAAa,QAAQ;AAAA,cACxE;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC,EACA,OAAO,CAAC,UAAwC,CAAC,CAAC,KAAK;AAC1D,cAAI,CAAC,MAAO,4BAA2B,OAAO;AAC9C,iBAAO;AAAA,QACT;AACA,YAAI,CAAC,MAAO,4BAA2B,CAAC,CAAC;AACzC,eAAO,CAAC;AAAA,MACV,SAAS,KAAK;AACZ,gBAAQ,MAAM,sCAAsC,GAAG;AACvD,YAAI,CAAC,OAAO;AACV;AAAA,YACE,EAAE,iDAAiD,iCAAiC;AAAA,YACpF;AAAA,UACF;AAAA,QACF;AACA,eAAO,CAAC;AAAA,MACV,UAAE;AACA,gCAAwB,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,GAAG,0BAA0B;AAAA,EAChC;AAEA,QAAM,yBAAyB,MAAM,YAAY,YAAY;AAC3D,QAAI,CAAC,QAAQ,MAAM,SAAS,SAAS;AACnC,qBAAe,KAAK;AACpB;AAAA,IACF;AACA,UAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,SAAS,OAAO,GAAG,CAAC;AACnF,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,uBAAuBA,QAAO,SAAS,CAAC;AAAA,QACxC;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,qBAAe,MAAM,KAAK,CAAC,SAAS,QAAQ,OAAQ,KAAa,OAAO,QAAQ,CAAC;AAAA,IACnF,SAAS,KAAK;AACZ,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC;AAErB,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,IAAY,aAA4D;AAC7E,UAAI;AACF,cAAMC,QAAO,YAAY,gBAAgB,KAAK,CAACC,UAASA,MAAK,OAAO,EAAE,GAAG,QAAQ;AACjF,cAAM,WAAWD,UAAS,YAAY,6BAA6B;AACnE,cAAMD,UAAS,IAAI,gBAAgB,EAAE,IAAI,UAAU,KAAK,MAAM,IAAI,CAAC;AACnE,cAAM,OAAO,MAAM,QAAoD,GAAG,QAAQ,IAAIA,QAAO,SAAS,CAAC,EAAE;AACzG,YAAI,CAAC,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,CAAC,KAAK,OAAO,MAAM,OAAQ,QAAO;AACxF,cAAM,OAAO,KAAK,OAAO,MAAM,CAAC;AAChC,cAAM,QACH,OAAO,MAAM,kBAAkB,YAAY,KAAK,iBAChD,OAAQ,MAAc,iBAAiB,YAAa,KAAa,gBAClE;AACF,YAAI,OAAO;AACT;AAAA,YAAmB,CAAC,SAClB,KAAK,IAAI,CAAC,UAAW,MAAM,OAAO,KAAK,EAAE,GAAG,OAAO,cAAc,MAAM,IAAI,KAAM;AAAA,UACnF;AAAA,QACF;AACA,eAAO,SAAS;AAAA,MAClB,SAAS,KAAK;AACZ,gBAAQ,MAAM,sCAAsC,GAAG;AACvD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,OAAkC;AACvC,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,WAAW,kBAAkB,QAAQ,IAAI,EAAE;AACjD,UAAI,SAAU,QAAO;AACrB,UAAI;AACF,cAAMA,UAAS,IAAI,gBAAgB,EAAE,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AACnE,cAAM,OAAO,MAAM;AAAA,UACjB,uBAAuBA,QAAO,SAAS,CAAC;AAAA,QAC1C;AACA,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,MAAM,QAAQ;AAC5E,gBAAM,OAAO,KAAK,OAAO,MAAM,CAAC;AAChC,gBAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACtF,gBAAM,OAAO,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACrF,gBAAM,SAAwB,EAAE,IAAI,OAAO,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM;AAC/E,+BAAqB,CAAC,MAAM,CAAC;AAC7B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,kCAAkC,GAAG;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,6BAA6B,MAAM;AAAA,IACvC,CAAC,IAA+B,aAA8C;AAC5E,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,WAAW,yBAAyB,QAAQ,IAAI,EAAE;AACxD,UAAI,SAAU,QAAO;AACrB,YAAM,OACH,YAAY,OAAQ,UAAkB,SAAS,YAAa,SAAiB,QAAS;AACzF,YAAM,OACH,YAAY,OAAQ,UAAkB,SAAS,YAAa,SAAiB,QAAS;AACzF,UAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAC3B,YAAM,SAA+B;AAAA,QACnC;AAAA,QACA,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,QAAQ;AAAA,QACd,aACE,YAAY,OAAQ,UAAkB,gBAAgB,WACjD,SAAiB,cAClB;AAAA,QACN,aACE,YAAY,OAAQ,UAAkB,gBAAgB,WACjD,SAAiB,cAClB;AAAA,QACN,cACE,YAAY,OAAQ,UAAkB,iBAAiB,WAClD,SAAiB,eAClB;AAAA,QACN,sBACE,YAAY,OAAQ,UAAkB,yBAAyB,WAC1D,SAAiB,uBAClB;AAAA,QACN,cACE,YAAY,OAAQ,UAAkB,iBAAiB,WAClD,SAAiB,eAClB;AAAA,MACR;AACA,kCAA4B,CAAC,MAAM,CAAC;AACpC,aAAO;AAAA,IACT;AAAA,IACA,CAAC,2BAA2B;AAAA,EAC9B;AAEA,QAAM,4BAA4B,MAAM;AAAA,IACtC,CAAC,IAA+B,aAA8C;AAC5E,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,WAAW,wBAAwB,QAAQ,IAAI,EAAE;AACvD,UAAI,SAAU,QAAO;AACrB,YAAM,OACH,YAAY,OAAQ,UAAkB,SAAS,YAAa,SAAiB,QAAS;AACzF,YAAM,OACH,YAAY,OAAQ,UAAkB,SAAS,YAAa,SAAiB,QAAS;AACzF,UAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAC3B,YAAM,SAA8B;AAAA,QAClC;AAAA,QACA,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,QAAQ;AAAA,QACd,aACE,YAAY,OAAQ,UAAkB,gBAAgB,WACjD,SAAiB,cAClB;AAAA,QACN,aACE,YAAY,OAAQ,UAAkB,gBAAgB,WACjD,SAAiB,cAClB;AAAA,QACN,OACE,YAAY,OAAQ,UAAkB,UAAU,WAAY,SAAiB,QAAQ;AAAA,MACzF;AACA,iCAA2B,CAAC,MAAM,CAAC;AACnC,aAAO;AAAA,IACT;AAAA,IACA,CAAC,0BAA0B;AAAA,EAC7B;AAEA,QAAM,eAAe,MAAM,YAAY,YAAY;AACjD,qBAAiB,IAAI;AACrB,QAAI;AACF,YAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACjE,YAAM,OAAO,MAAM;AAAA,QACjB,6BAA6BA,QAAO,SAAS,CAAC;AAAA,MAChD;AACA,UAAI,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAChD,cAAM,UAAU,KAAK,OAAO,MACzB,IAAI,CAAC,SAAS;AACb,gBAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,gBAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,KAAK,QAAQ;AAC7D,cAAI,CAAC,MAAM,CAAC,MAAO,QAAO;AAC1B,gBAAM,QAAQ,OAAO,MAAM,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,KAAK,QAAQ;AACzF,gBAAM,QAAQ,OAAO,MAAM,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,KAAK,QAAQ;AACzF,gBAAM,OAAO,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO;AACrF,iBAAO,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK;AAAA,QACzC,CAAC,EACA,OAAO,CAAC,QAA6B,CAAC,CAAC,GAAG;AAC7C,4BAAoB,OAAO;AAC3B,eAAO;AAAA,MACT;AACA,0BAAoB,CAAC,CAAC;AACtB,aAAO,CAAC;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,MAAM,gCAAgC,GAAG;AACjD,YAAM,EAAE,2CAA2C,0BAA0B,GAAG,OAAO;AACvF,aAAO,CAAC;AAAA,IACV,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,GAAG,mBAAmB,CAAC;AAE3B,QAAM,qBAAqB,MAAM;AAAA,IAC/B,CAAC,OAAkC,YAAuC;AACxE,UAAI,CAAC,MAAO;AACZ,UAAI,iBAAiB,QAAQ,IAAI,KAAK,EAAG;AACzC,0BAAoB;AAAA,QAClB;AAAA,UACE,IAAI,WAAW;AAAA,UACf;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,YAAoB,kBAAqC;AAC9D,aAAO,cAAc,YAAY,eAAe,gBAAgB;AAAA,IAClE;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,mBAAe,OAAO;AACpB,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,YAAM,gBAAgB,aAAa,IAAI,MAAM;AAC7C,YAAM,gBAAgB,kBAAkB,UAAU,UAAU,kBAAkB,UAAU,UAAU,eAAe;AACjH,YAAM,aAAuC,gBACzC,CAAC,eAAe,kBAAkB,UAAU,UAAU,OAAO,IAC7D,CAAC,SAAS,OAAO;AACrB,UAAI,YAA2B;AAC/B,iBAAW,aAAa,YAAY;AAClC,YAAI;AACF,gBAAM,QAAQ,MAAM,oBAAoB,OAAO,IAAI,SAAS;AAC5D,cAAI,SAAS,CAAC,WAAW;AACvB,sBAAU,KAAK;AACf,oBAAQ,SAAS;AACjB,uBAAW,KAAK;AAChB;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACpE,sBAAY;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,WAAW;AACd,mBAAW,KAAK;AAChB,iBAAS,aAAa,gBAAgB;AAAA,MACxC;AAAA,IACF;AACA,SAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAI,UAAW;AACf,YAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACpE,eAAS,OAAO;AAChB,iBAAW,KAAK;AAAA,IAClB,CAAC;AACD,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAC,qBAAqB,aAAa,kBAAkB,OAAO,IAAI,WAAW,YAAY,CAAC;AAE3F,QAAM,UAAU,MAAM;AACpB,kBAAc,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChC,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,UAAU,MAAM;AACpB,YAAQ,MAAM,QAAQ,QAAQ,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC;AAAA,EACxD,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAQ;AACX,kBAAY,KAAK;AACjB;AAAA,IACF;AACA,UAAM,gBAAgB,qBAAqB,MAAM;AACjD,QAAI,kBAAkB,MAAM;AAC1B,kBAAY,gBAAgB,CAAC;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,UAAU,MAAM;AACpB,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC7B,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC7B,wBAAoB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACpC,uBAAmB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACrC,GAAG,CAAC,cAAc,oBAAoB,qBAAqB,cAAc,YAAY,CAAC;AAEtF,QAAM,UAAU,MAAM;AACpB,SAAK,uBAAuB;AAAA,EAC9B,GAAG,CAAC,sBAAsB,CAAC;AAE3B,QAAM,qBAAqB,MAAM,YAAY,CAAC,UAAoC;AAChF,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,UAAM,MAAM,oBAAI,IAAY;AAC5B,UAAM,QAAQ,CAAC,UAAU;AACvB,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,OAAQ,KAAI,IAAI,MAAM,KAAK,CAAC;AAAA,IAC5E,CAAC;AACD,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,SAAS;AACpB,uBAAiB,IAAI;AACrB;AAAA,IACF;AACA,QAAI,YAAY;AAChB,mBAAe,aAAa;AAC1B,UAAI;AACF,cAAM,OAAO,MAAM,QAGhB,mCAAmC;AACtC,YAAI,CAAC,KAAK,MAAM,UAAW;AAC3B,yBAAiB;AAAA,UACf,UAAU,mBAAmB,KAAK,QAAQ,iCAAiC,IAAI;AAAA,UAC/E,WAAW,mBAAmB,KAAK,QAAQ,gCAAgC,IAAI;AAAA,QACjF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,gBAAQ,MAAM,8BAA8B,GAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,WAAW;AAChB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,oBAAoB,YAAY,CAAC;AAE3C,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,UAAW;AACxB,SAAK,oBAAoB,OAAO,SAAS;AAAA,EAC3C,GAAG,CAAC,qBAAqB,QAAQ,SAAS,CAAC;AAE3C,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,QAAS;AACtB,+BAA2B,QAAQ,oBAAoB,MAAM,QAAQ,0BAA0B,IAAI;AACnG,8BAA0B,QAAQ,mBAAmB,MAAM,QAAQ,yBAAyB,IAAI;AAAA,EAClG,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,UAAU,MAAM;AACpB,uBAAmB,QAAQ,UAAU,MAAM,QAAQ,iBAAiB,IAAI;AAAA,EAC1E,GAAG,CAAC,oBAAoB,QAAQ,QAAQ,QAAQ,aAAa,CAAC;AAE9D,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,iBAAa,CAAC,SAAS,OAAO,CAAC;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,2BAA2B,MAAM,YAAY,YAAY;AAC7D,QAAI,CAAC,QAAQ,GAAI;AACjB,QAAI;AACF,YAAMA,UAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,OAAO,CAAC,SAAS,UAAU,YAAY,SAAS,GAAG,OAAO,GAAG,CAAC;AACxH,YAAM,eAAe,SAAS,UAAU,iCAAiC;AACzE,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,YAAY,IAAIA,QAAO,SAAS,CAAC;AAAA,QACpC;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,YAAM,SAA8B,MACjC,IAAI,CAAC,SAAS;AACb,cAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,YAAI,CAAC,GAAI,QAAO;AAChB,cAAM,YAAY;AAAA,UACf,KAAa,cAAe,KAAa,aAAc,KAAa;AAAA,QACvE;AACA,cAAM,cAAc;AAAA,UACjB,KAAa,gBAAiB,KAAa,eAAgB,KAAa;AAAA,QAC3E;AACA,cAAM,UAAU,YAAa,KAAa,IAAI;AAC9C,cAAM,YACJ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC7C,KAAK,KAAK,KAAK,IAChB;AACN,cAAM,WACJ,OAAQ,KAAa,kBAAkB,WAClC,KAAa,gBACd,OAAQ,KAAa,iBAAiB,WACnC,KAAa,eACd,QAAQ,gBAAgB;AAChC,eAAO;AAAA,UACL;AAAA,UACA,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,UACrD,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,UAClD,MAAM;AAAA,UACN,eACE,OAAQ,KAAa,mBAAmB,WACnC,KAAa,iBACd,OAAQ,KAAa,kBAAkB,WACpC,KAAa,gBACd;AAAA,UACR,MAAM,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,UAC3C,WAAW,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,UACpD,aAAa,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,UAC1D,cAAc;AAAA,UACd,UACE,OAAO,KAAK,aAAa,WACrB,KAAK,WACL,OAAQ,KAAa,aAAa,WAChC,OAAQ,KAAa,QAAQ,IAC7B;AAAA,UACR,cAAc;AAAA,UACd,kBACE,OAAQ,KAAa,wBAAwB,WACxC,KAAa,sBACd,OAAQ,KAAa,qBAAqB,WACvC,KAAa,mBACd;AAAA,QACV;AAAA,MACF,CAAC,EACA,OAAO,CAAC,UAAsC,QAAQ,KAAK,CAAC;AAC/D,YAAM,UAAU,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAChF,wBAAkB,OAAO;AAAA,IAC3B,SAAS,KAAK;AACZ,cAAQ,MAAM,2CAA2C,GAAG;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,QAAQ,cAAc,QAAQ,EAAE,CAAC;AAExD,QAAM,UAAU,MAAM;AACpB,SAAK,yBAAyB;AAAA,EAChC,GAAG,CAAC,wBAAwB,CAAC;AAE7B,QAAM,wBAAwB,MAAM,YAAY,YAAY;AAC1D,QAAI,CAAC,QAAQ,GAAI;AACjB,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB,OAAO,IAAI,IAAI;AACzD,UAAI,SAAS;AACX,kBAAU,OAAO;AAAA,MACnB;AACA,YAAM,yBAAyB;AAAA,IACjC,SAAS,KAAK;AACZ,cAAQ,MAAM,kCAAkC,GAAG;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,qBAAqB,MAAM,0BAA0B,QAAQ,EAAE,CAAC;AAEpE,QAAM;AAAA,IACJ,MACE,oCAAoC,CAAC,WAAW;AAC9C,UAAI,CAAC,QAAQ,GAAI;AACjB,UAAI,OAAO,eAAe,OAAO,GAAI;AACrC,UAAI,OAAO,QAAQ,OAAO,SAAS,KAAM;AACzC,WAAK,sBAAsB;AAAA,IAC7B,CAAC;AAAA,IACH,CAAC,MAAM,QAAQ,IAAI,qBAAqB;AAAA,EAC1C;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,MACE;AAAA,MACE,cAAc,IAAI,CAAC,YAAY;AAAA,QAC7B,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,MACf,EAAE;AAAA,IACJ;AAAA,IACF,CAAC,aAAa;AAAA,EAChB;AACA,QAAM,yBAAyB,MAAM,QAAQ,MAAM;AACjD,QAAI,SAAS,SAAS;AACpB,aAAO,cAAc,OAAO,CAAC,WAAW,OAAO,UAAU,MAAM;AAAA,IACjE;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,aAAa,CAAC;AACxB,QAAM,SAAS,QAAQ,eAAe,QAAQ,eAAe,QAAQ;AACrE,QAAM,mBAAoB,QAAQ,oBAAoB;AACtD,QAAM,kBAAmB,QAAQ,0BAA0B;AAC3D,QAAM,mBAAoB,QAAQ,2BAA2B;AAC7D,QAAM,eAAe,oBAAoB,kBAAkB,QAAQ,gBAAgB,QAAQ,oBAAoB,IAAI;AACnH,QAAM,gBACJ,QAAQ,YAAY,OAAQ,OAAO,SAAqC,kBAAkB,WACrF,OAAO,SAAqC,gBAC7C;AACN,QAAM,eAAe,qBAAqB,gBAAgB,KAAK,iBAAiB,QAAQ,gBAAgB;AACxG,QAAM,gBAAgB,QAAQ,SAAS,oBAAoB,OAAO,MAAM,KAAK,OAAO;AACpF,QAAM,kBAAkB,kBAAkB,SAAS,MAAM,kBAAkB,UAAU,MAAM,QAAQ,oBAAoB;AACvH,QAAM,yBAAyB,MAAM;AAAA,IACnC,CAAC,QAA2B;AAC1B,YAAM,QAAQ,IAAI,SAAS,IAAI,KAAK;AACpC,YAAM,WAAW,EAAE,0CAA0C,IAAI,IAAI,IAAI,IAAI,IAAI;AACjF,YAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,YAAM,UAAU,OAAO,SAAS,IAAI,IAAI,KAAK,IAAI,SAAS;AAC1D,YAAM,SAAS,UAAU,KAAK,IAAI,IAAI,OAAO;AAC7C,aAAO,GAAG,KAAK,GAAG,MAAM;AAAA,IAC1B;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AACA,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,QAAkG;AAAA,MACtG;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,6CAA6C,gBAAgB;AAAA,QACtE,QAAQ,OAAO,qBAAqB;AAAA,MACtC;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,+CAA+C,kBAAkB;AAAA,QAC1E,QAAQ,OAAO,uBAAuB;AAAA,MACxC;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,+CAA+C,WAAW;AAAA,QACnE,QAAQ,OAAO,uBAAuB;AAAA,MACxC;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,0CAA0C,WAAW;AAAA,QAC9D,QAAQ,OAAO,kBAAkB;AAAA,MACnC;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,YAAM;AAAA,QACJ;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,6CAA6C,gBAAgB;AAAA,UACtE,QAAQ,OAAO,qBAAqB;AAAA,QACtC;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,+CAA+C,kBAAkB;AAAA,UAC1E,QAAQ,OAAO,uBAAuB;AAAA,QACxC;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,gDAAgD,YAAY;AAAA,UACrE,QAAQ,OAAO,wBAAwB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,eAAe,QAAQ;AACzB,qBAAe,QAAQ,CAAC,QAAQ;AAC9B,cAAM,KAAK;AAAA,UACT,KAAK,cAAc,IAAI,EAAE;AAAA,UACzB,OAAO,uBAAuB,GAAG;AAAA,UACjC,QAAQ,IAAI,eAAe,IAAI,aAAa;AAAA,QAC9C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,UAAM;AAAA,MACJ;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,+CAA+C,mBAAmB;AAAA,QAC3E,QAAQ,OAAO,uBAAuB;AAAA,QACtC,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO,EAAE,iDAAiD,qBAAqB;AAAA,QAC/E,QAAQ,OAAO,yBAAyB;AAAA,QACxC,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,YAAM;AAAA,QACJ;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,2CAA2C,MAAM;AAAA,UAC1D,QAAQ,OAAO,mBAAmB;AAAA,QACpC;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,+CAA+C,UAAU;AAAA,UAClE,QAAQ,OAAO,uBAAuB;AAAA,QACxC;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,kDAAkD,aAAa;AAAA,UACxE,QAAQ,OAAO,qBAAqB;AAAA,UACpC,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,cAAc,CAAC,MAAmC,WAAsC;AAC5F,QAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,QAAM,uBACJ,SAAS,WAAW,CAAC,YAAY,eAAe,YAAY,MAAM,QAAQ,UAAU,IAAI;AAC1F,QAAM,sBACJ,SAAS,WAAW,CAAC,YAAY,eAAe,aAAa,MAAM,QAAQ,UAAU,IAAI;AAC3F,QAAM,uBAAuB,uBACzB,EAAE,0CAA0C,oDAAoD,IAChG;AACJ,QAAM,sBAAsB,sBACxB,EAAE,4CAA4C,qDAAqD,IACnG;AACJ,QAAM,UAAU,MAAM;AACpB,UAAM,KAAK,QAAQ,oBAAoB;AACvC,QAAI,CAAC,GAAI;AACT,UAAM,QAAQ,gBAAgB;AAC9B,uBAAmB,CAAC,SAAS;AAC3B,YAAM,SAAS,KAAK,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AACnD,UAAI,OAAQ,QAAO;AACnB,YAAM,OAAuB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,UAAU,gBAAgB;AAAA,QAC1B,MAAM;AAAA,QACN,cAAc,gBAAgB;AAAA,MAChC;AACA,aAAO,CAAC,MAAM,GAAG,IAAI;AAAA,IACvB,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,cAAc,QAAQ,gBAAgB,CAAC;AACzD,QAAM,kBAAkB,MAAM,QAAQ,MAAM;AAC1C,UAAM,UAAU,MAAM,QAAQ,oBAAoB,OAAO,IAAI,mBAAmB,UAAU,CAAC;AAC3F,WAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,MAC7B,OAAO,MAAM,MAAM,YAAY;AAAA,MAC/B,OAAO,MAAM;AAAA,MACb,OAAO,MAAM,SAAS;AAAA,MACtB,MAAM,MAAM,QAAQ;AAAA,IACtB,EAAE;AAAA,EACJ,GAAG,CAAC,oBAAoB,OAAO,CAAC;AAChC,QAAM,kBAAkB,MAAM,QAAQ,MAAM;AAC1C,UAAM,MAAM,oBAAI,IAAyF;AACzG,oBAAgB,QAAQ,CAAC,UAAU;AACjC,UAAI,IAAI,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,OAAO,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,QAAQ,KAAK,CAAC;AAAA,IACvH,CAAC;AACD,UAAM,cAAc,OAAO,QAAQ,iBAAiB,WAAW,OAAO,aAAa,YAAY,IAAI;AACnG,QAAI,eAAe,CAAC,IAAI,IAAI,WAAW,GAAG;AACxC,UAAI,IAAI,aAAa,EAAE,OAAO,aAAa,OAAO,aAAa,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,IAC1F;AACA,WAAO,MAAM,KAAK,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,OAAO,QAAW,EAAE,aAAa,OAAO,CAAC,CAAC;AAAA,EACnH,GAAG,CAAC,iBAAiB,QAAQ,YAAY,CAAC;AAC1C,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO;AAAA,MACL,aAAa,EAAE,6CAA6C,iBAAiB;AAAA,MAC7E,UAAU,EAAE,qCAAqC,cAAc;AAAA,MAC/D,aAAa,EAAE,6CAA6C,cAAc;AAAA,MAC1E,YAAY,EAAE,4CAA4C,eAAe;AAAA,MACzE,kBAAkB,EAAE,kDAAkD,UAAU;AAAA,MAChF,YAAY,EAAE,4CAA4C,OAAO;AAAA,MACjE,kBAAkB,EAAE,kDAAkD,cAAc;AAAA,MACpF,YAAY,EAAE,4CAA4C,2BAA2B;AAAA,MACrF,aAAa,EAAE,wCAAwC,QAAQ;AAAA,MAC/D,WAAW,EAAE,sCAAsC,MAAM;AAAA,MACzD,kBAAkB;AAAA,MAClB,oBAAoB,EAAE,yCAAyC,iBAAiB;AAAA,MAChF,WAAW,EAAE,2CAA2C,4BAA4B;AAAA,MACpF,WAAW,EAAE,2CAA2C,0BAA0B;AAAA,MAClF,cAAc,EAAE,yCAAyC,0BAAqB;AAAA,MAC9E,aAAa,EAAE,wCAAwC,4BAA4B;AAAA,IACrF;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AACA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,YAAa,SAAS,WAAW;AAAA,IACvC,CAAC,UAAU,aAAa,IAAI;AAAA,EAC9B;AACA,QAAM,sBAAsB,MAAM;AAAA,IAChC,MACE,iBACI;AAAA,MACE;AAAA,MACA;AAAA,IACF,IACA;AAAA,IACN,CAAC,gBAAgB,CAAC;AAAA,EACpB;AACA,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO;AAAA,MACL,aAAa,EAAE,6CAA6C,eAAe;AAAA,MAC3E,UAAU,EAAE,qCAAqC,YAAY;AAAA,MAC7D,aAAa,EAAE,6CAA6C,YAAY;AAAA,MACxE,YAAY,EAAE,4CAA4C,OAAO;AAAA,MACjE,kBAAkB,EAAE,kDAAkD,gBAAgB;AAAA,MACtF,YAAY,EAAE,4CAA4C,OAAO;AAAA,MACjE,kBAAkB,EAAE,kDAAkD,eAAe;AAAA,MACrF,YAAY,EAAE,4CAA4C,2BAA2B;AAAA,MACrF,aAAa,EAAE,wCAAwC,QAAQ;AAAA,MAC/D,WAAW,EAAE,sCAAsC,MAAM;AAAA,MACzD,kBAAkB;AAAA,MAClB,oBAAoB,EAAE,yCAAyC,eAAe;AAAA,MAC9E,WAAW,EAAE,2CAA2C,0BAA0B;AAAA,MAClF,WAAW,EAAE,2CAA2C,wBAAwB;AAAA,MAChF,cAAc,EAAE,yCAAyC,wBAAmB;AAAA,MAC5E,aAAa,EAAE,wCAAwC,iBAAiB;AAAA,IAC1E;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO,UAAmC;AACxC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,EAAE,sCAAsC,4BAA4B,CAAC;AAAA,MACvF;AACA,YAAM,WAAW,SAAS,UAAU,sBAAsB;AAC1D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,IAAI,GAAG,MAAM,CAAC;AAAA,QAClD;AAAA,QACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,MACxF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClB;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,UAAI,gBAAgB;AAClB,cAAM,UACJ,uBACA,EAAE,yCAAyC,4DAA4D;AACzG,cAAM,SAAS,OAAO;AACtB,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AACA,YAAM,aAAa,OAAO,SAAS,WAAW,KAAK,KAAK,EAAE,YAAY,IAAI;AAC1E,UAAI,CAAC,aAAa,KAAK,UAAU,GAAG;AAClC,cAAM,UAAU,EAAE,0CAA0C,kCAAkC;AAC9F,cAAM,SAAS,OAAO;AACtB,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AACA,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,cAAc,WAAW,CAAC;AAC9D,cAAM,YAAY,KAAK,QAAQ,gBAAgB;AAC/C,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,cAAc,UAAU,IAAI,IAAK;AACxE,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAChF,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU,EAAE,sCAAsC,4BAA4B;AACxI,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,gBAAgB,QAAQ,GAAG,cAAc;AAAA,EACjE;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,YAAM,MAAM,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AACrD,YAAM,UAAuC,EAAE,UAAU,KAAK;AAC9D,UAAI,IAAI,QAAQ;AACd,YAAI,CAAC,sBAAsB,KAAK,GAAG,KAAK,OAAO,MAAM,IAAI,KAAK,GAAG,EAAE,QAAQ,CAAC,GAAG;AAC7E,gBAAM,UAAU,EAAE,sCAAsC,0CAA0C;AAClG,gBAAM,SAAS,OAAO;AACtB,gBAAM,IAAI,MAAM,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AAAA,MACrB;AACA,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,OAAO;AACzC,cAAM,gBACJ,OAAO,KAAK,QAAQ,aAAa,WAAW,KAAK,OAAO,WAAW,QAAQ;AAC7E,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,UAAU,cAAc,IAAI,IAAK;AACxE,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,GAAG,cAAc;AAAA,EAC5B;AAEA,QAAM,iCAAiC,MAAM;AAAA,IAC3C,OAAO,SAAwB;AAC7B,UAAI,CAAC,UAAU,SAAS,QAAS;AACjC,YAAM,MAAM,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AACrD,YAAM,UAAiD,EAAE,oBAAoB,KAAK;AAClF,UAAI,IAAI,QAAQ;AACd,YAAI,CAAC,sBAAsB,KAAK,GAAG,KAAK,OAAO,MAAM,IAAI,KAAK,GAAG,EAAE,QAAQ,CAAC,GAAG;AAC7E,gBAAM,UAAU,EAAE,sCAAsC,0CAA0C;AAClG,gBAAM,SAAS,OAAO;AACtB,gBAAM,IAAI,MAAM,OAAO;AAAA,QACzB;AACA,gBAAQ,qBAAqB;AAAA,MAC/B;AACA,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,OAAO;AACzC,cAAM,wBACJ,OAAO,KAAK,QAAQ,uBAAuB,WACvC,KAAK,OAAO,qBACZ,QAAQ;AACd,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,oBAAoB,sBAAsB,IAAI,IAAK;AAC1F,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,GAAG,cAAc;AAAA,EAClC;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,YAAM,aAAa,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AAC5D,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,SAAS,WAAW,SAAS,aAAa,KAAK,CAAC;AACpF,cAAM,eACJ,OAAO,KAAK,QAAQ,YAAY,WAC5B,KAAK,OAAO,UACZ,WAAW,SACT,aACA;AACR,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,SAAS,aAAa,IAAI,IAAK;AACtE,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,GAAG,cAAc;AAAA,EAC5B;AAEA,QAAM,gCAAgC,MAAM;AAAA,IAC1C,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,YAAM,aAAa,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AAC5D,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,mBAAmB,WAAW,SAAS,aAAa,KAAK,CAAC;AAC9F,cAAM,yBACJ,OAAO,KAAK,QAAQ,sBAAsB,WACtC,KAAK,OAAO,oBACZ,WAAW,SACT,aACA;AACR,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,mBAAmB,uBAAuB,IAAI,IAAK;AAC1F,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,GAAG,cAAc;AAAA,EAC5B;AAEA,QAAM,gCAAgC,MAAM;AAAA,IAC1C,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,YAAM,aAAa,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AAC5D,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,mBAAmB,WAAW,SAAS,aAAa,KAAK,CAAC;AAC9F,cAAM,yBACJ,OAAO,KAAK,QAAQ,sBAAsB,WACtC,KAAK,OAAO,oBACZ,WAAW,SACT,aACA;AACR,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,mBAAmB,uBAAuB,IAAI,IAAK;AAC1F,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,GAAG,cAAc;AAAA,EAC5B;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,OAAO,SAAwB;AAC7B,UAAI,CAAC,OAAQ;AACb,UAAI,sBAAsB;AACxB,cAAM,sBAAsB,OAAO;AACnC,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AACA,YAAM,eAAgB,OAAO,YAAY,CAAC;AAC1C,YAAM,UAAU,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AACzD,YAAM,YAAY,QAAQ,SAAS,UAAU;AAC7C,YAAM,kBACJ,cAAc,OACV,OAAO,YAAY,OAAO,QAAQ,YAAY,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,eAAe,CAAC,IAC1F,EAAE,GAAG,cAAc,eAAe,UAAU;AAClD,YAAM,kBAAkB,OAAO,KAAK,eAAe,EAAE,SAAS,kBAAkB;AAChF,YAAM,eAAgB,OAAO,oBAAoB;AACjD,YAAM,eACJ,gBAAgB,cAAc,OAC1B;AAAA,QACE,GAAI,gBAAgB,CAAC;AAAA,QACrB,UAAU;AAAA,UACR,GAAI,cAAc,YAAY,CAAC;AAAA,UAC/B,cAAc;AAAA,QAChB;AAAA,MACF,IACA;AACN,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,UAAU,iBAAiB,kBAAkB,aAAa,CAAC;AAC/F,cAAM,gBACH,KAAK,QAAQ,YAA2D,mBAAmB;AAC9F,cAAM,qBAAsB,KAAK,QAAQ,oBAAoB;AAC7D,cAAM,wBACJ,KAAK,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,kBAAkB;AACrF,cAAM,gBAAgB,wBAAwB,qBAAqB;AACnE,cAAM,aACJ,qBAAqB,iBAAiB,IAAI,MACzC,OAAO,KAAK,QAAQ,iBAAiB,WAAW,KAAK,OAAO,eAAe,YAC3E,OAAO,eAAe,kBAAkB,WAAY,cAAc,gBAA2B,WAC9F;AACF,kBAAU,CAAC,SAAS;AAClB,cAAI,CAAC,KAAM,QAAO;AAClB,gBAAM,gBAAgB,eAAe,SAAY,KAAK,gBAAgB,OAAO,cAAc;AAC3F,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,UAAU,iBAAiB;AAAA,YAC3B,kBAAkB,iBAAiB,KAAK,oBAAoB;AAAA,YAC5D,cAAc;AAAA,UAChB;AAAA,QACF,CAAC;AACD,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,QAAQ,GAAG,cAAc;AAAA,EAClD;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,WAA0B;AAC/B,UAAI,CAAC,OAAQ;AACb,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,WAAW,OAAO,CAAC;AACvD,cAAM,iBACJ,OAAO,KAAK,QAAQ,cAAc,WAAW,KAAK,OAAO,YAAY,UAAU;AACjF,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,WAAW,eAAe,IAAI,IAAK;AAC1E,YAAI,gBAAgB;AAClB,eAAK,oBAAoB,cAAc;AAAA,QACzC;AACA,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,QAAQ,GAAG,cAAc;AAAA,EACjD;AAEA,QAAM,6BAA6B,MAAM;AAAA,IACvC,OAAO,WAA0B;AAC/B,UAAI,CAAC,OAAQ;AACb,YAAM,SACJ,SACI,yBAAyB,QAAQ,IAAI,MAAM,KAC3C,sBAAsB,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,KACzD,OACA;AACN,UAAI;AACF,cAAM,OAAO,MAAM,eAAe;AAAA,UAChC,kBAAkB;AAAA,UAClB,oBAAoB,QAAQ,QAAQ;AAAA,QACtC,CAAC;AACD,cAAM,UACJ,OAAO,KAAK,QAAQ,qBAAqB,WAAW,KAAK,OAAO,mBAAmB,UAAU;AAC/F,cAAM,gBACH,KAAK,QAAQ,0BAAyE;AACzF,cAAM,YACJ,OAAO,KAAK,QAAQ,uBAAuB,WACvC,KAAK,OAAO,qBACZ,QAAQ,QAAQ;AACtB;AAAA,UAAU,CAAC,SACT,OACI;AAAA,YACE,GAAG;AAAA,YACH,kBAAkB;AAAA,YAClB,oBAAoB;AAAA,YACpB,wBAAwB;AAAA,UAC1B,IACA;AAAA,QACN;AACA,YAAI,WAAW,eAAe;AAC5B,qCAA2B,SAAS,aAAa;AAAA,QACnD;AACA,uCAA+B,EAAE,YAAY,OAAO,IAAI,KAAK,CAAC;AAC9D,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,4BAA4B,MAAM;AAAA,IACtC,OAAO,WAA0B;AAC/B,UAAI,CAAC,OAAQ;AACb,YAAM,SACJ,SACI,wBAAwB,QAAQ,IAAI,MAAM,KAC1C,qBAAqB,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,KACxD,OACA;AACN,UAAI;AACF,cAAM,OAAO,MAAM,eAAe;AAAA,UAChC,iBAAiB;AAAA,UACjB,mBAAmB,QAAQ,QAAQ;AAAA,QACrC,CAAC;AACD,cAAM,UACJ,OAAO,KAAK,QAAQ,oBAAoB,WAAW,KAAK,OAAO,kBAAkB,UAAU;AAC7F,cAAM,gBACH,KAAK,QAAQ,yBAAwE;AACxF,cAAM,YACJ,OAAO,KAAK,QAAQ,sBAAsB,WACtC,KAAK,OAAO,oBACZ,QAAQ,QAAQ;AACtB;AAAA,UAAU,CAAC,SACT,OACI;AAAA,YACE,GAAG;AAAA,YACH,iBAAiB;AAAA,YACjB,mBAAmB;AAAA,YACnB,uBAAuB;AAAA,UACzB,IACA;AAAA,QACN;AACA,YAAI,WAAW,eAAe;AAC5B,oCAA0B,SAAS,aAAa;AAAA,QAClD;AACA,uCAA+B,EAAE,YAAY,OAAO,IAAI,KAAK,CAAC;AAC9D,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,SAAwB,UAAyB;AACtD,UAAI,CAAC,OAAQ;AACb,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,eAAe,QAAQ,CAAC;AAC5D,cAAM,qBACJ,OAAO,KAAK,QAAQ,kBAAkB,WAAW,KAAK,OAAO,gBAAgB,WAAW;AAC1F,cAAM,cACJ,OAAO,KAAK,QAAQ,WAAW,WAC3B,KAAK,OAAO,SACZ;AACN,kBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,eAAe,oBAAoB,QAAQ,eAAe,KAAK,IAAI,IAAK;AAC/G,YAAI,aAAa;AACf,6BAAmB,aAAa,kBAAkB;AAAA,QACpD;AACA,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,oBAAoB,QAAQ,GAAG,cAAc;AAAA,EAChD;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,OAAO,QAAuB,UAAyB;AACrD,UAAI,CAAC,OAAQ;AACb,YAAM,kBAAkB,WAAW,OAAO;AAC1C,UAAI,sBAAsB;AACxB,yBAAiB,oBAAoB;AACrC,cAAM,sBAAsB,OAAO;AACnC,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AACA,UAAI,iBAAiB;AACnB,cAAM,eACJ,CAAC,CAAC,OAAO,qBACT,CAAC,CAAC,OAAO,oBACT,CAAC,CAAC,OAAO,2BACT,CAAC,CAAC,OAAO;AACX,YAAI,cAAc;AAChB,gBAAM,YAAY,OAAO;AAAA,YACvB;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,cAAI,CAAC,UAAW;AAAA,QAClB;AAAA,MACF;AACA,wBAAkB,IAAI;AACtB,uBAAiB,IAAI;AACrB,UAAI;AACF,cAAM,UAAmC,EAAE,kBAAkB,OAAO;AACpE,YAAI,SAAS,MAAM,KAAK,EAAE,QAAQ;AAChC,kBAAQ,WAAW,EAAE,eAAe,MAAM,KAAK,EAAE;AAAA,QACnD;AACA,cAAM,OAAO,MAAM,eAAe,OAAO;AACzC,cAAM,WAAY,KAAK,QAAQ,oBAAoB;AACnD,cAAM,wBACJ,KAAK,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,kBAAkB;AACrF,cAAM,WAAW,gBAAgB,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,KAAK;AACzE,cAAM,eACH,KAAK,QAAQ,gBACd,oBAAoB,UAAU,UAAU,SAAS,OAAO,gBAAgB,OAAO,oBAAoB,IAAI;AACzG,cAAM,gBACJ,qBAAqB,QAAQ,KAC5B,KAAK,QAAQ,gBACd,SACA,UAAU,gBACV;AACF;AAAA,UAAU,CAAC,SACT,OACI;AAAA,YACE,GAAG;AAAA,YACH,kBAAkB,UAAU;AAAA,YAC5B,cAAc,SAAS,gBAAgB,KAAK,eAAe,gBAAgB;AAAA,YAC3E,cAAc,kBAAkB,SAAS,KAAK,gBAAgB,OAAO;AAAA,YACrE,kBACE,yBAAyB,kBACrB,WACA,KAAK,oBAAoB;AAAA,YAC/B,mBAAmB,kBAAkB,OAAO,KAAK,qBAAqB;AAAA,YACtE,kBAAkB,kBAAkB,OAAO,KAAK,oBAAoB;AAAA,YACpE,yBAAyB,kBAAkB,OAAO,KAAK,2BAA2B;AAAA,YAClF,wBAAwB,kBAAkB,OAAO,KAAK,0BAA0B;AAAA,UAClF,IACA;AAAA,QACN;AACA,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,yBAAiB,OAAO;AACxB,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR,UAAE;AACA,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB,QAAQ,GAAG,cAAc;AAAA,EAC7C;AAEA,QAAM,+BAA+B,MAAM;AAAA,IACzC,OAAO,aAA+B;AACpC,UAAI,CAAC,OAAQ;AACb,UAAI,sBAAsB;AACxB,yBAAiB,oBAAoB;AACrC,cAAM,sBAAsB,OAAO;AACnC,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AACA,wBAAkB,IAAI;AACtB,uBAAiB,IAAI;AACrB,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,EAAE,kBAAkB,SAAS,CAAC;AAChE,cAAM,wBACJ,KAAK,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,kBAAkB;AACrF,cAAM,gBACH,wBAAyB,KAAK,QAAQ,oBAAoB,OAAQ;AACrE,cAAM,eAAe;AAAA,UACnB;AAAA,UACA,OAAO,gBAAgB,OAAO,oBAAoB;AAAA,QACpD;AACA,cAAM,gBACJ,qBAAqB,aAAa,MACjC,OAAO,KAAK,QAAQ,iBAAiB,WAAW,KAAK,OAAO,eAAe,OAAO,gBAAgB;AACrG;AAAA,UAAU,CAAC,SACT,OACI;AAAA,YACE,GAAG;AAAA,YACH,kBAAkB,iBAAiB;AAAA,YACnC,cAAc;AAAA,YACd,cAAc,iBAAiB;AAAA,UACjC,IACA;AAAA,QACN;AACA,cAAM,EAAE,yCAAyC,mBAAmB,GAAG,SAAS;AAAA,MAClF,SAAS,KAAK;AACZ,cAAM,UACJ,eAAe,SAAS,IAAI,UACxB,IAAI,UACJ,EAAE,sCAAsC,4BAA4B;AAC1E,yBAAiB,OAAO;AACxB,cAAM,SAAS,OAAO;AACtB,cAAM;AAAA,MACR,UAAE;AACA,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,QAAQ,GAAG,cAAc;AAAA,EAClD;AAEA,QAAM,uBAAuB,MAAM,YAAY,YAAY;AACzD,kBAAc,IAAI;AAClB,UAAM,OAAO,MAAM,QAA6B,+BAA+B;AAAA,MAC7E,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IAC/B,CAAC;AACD,QAAI,KAAK,MAAM,KAAK,QAAQ,QAAQ;AAClC,gBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,aAAa,SAAS,UAAU,KAAK,QAAQ,SAAS,KAAK,aAAa,aAAa,SAAS,UAAU,KAAK,QAAQ,SAAS,KAAK,YAAY,IAAI,IAAK;AAC/L,YAAM,EAAE,0CAA0C,uBAAuB,GAAG,SAAS;AAAA,IACvF,OAAO;AACL,YAAM,EAAE,8CAA8C,4BAA4B,GAAG,OAAO;AAAA,IAC9F;AACA,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,MAAM,CAAC,CAAC;AAEZ,QAAM,gBAAgB,MAAM,YAAY,YAAY;AAClD,QAAI,CAAC,UAAU,SAAS,QAAS;AACjC,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,GAAG,CAAC;AAAA,QAC7C;AAAA,QACA,EAAE,cAAc,EAAE,uCAAuC,0BAA0B,EAAE;AAAA,MACvF;AACA,YAAM,UAAU,KAAK,QAAQ,WAAW,OAAO;AAC/C,YAAM,EAAE,yCAAyC,2BAA2B,GAAG,SAAS;AACxF,aAAO,QAAQ,yBAAyB,OAAO,EAAE;AAAA,IACnD,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAC5C,YAAM,EAAE,uCAAuC,0BAA0B,GAAG,OAAO;AAAA,IACrF,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAE5B,QAAM,kBAAkB,MAAM,YAAY,YAAY;AACpD,QAAI,CAAC,UAAU,SAAS,QAAS;AACjC,eAAW,IAAI;AACf,QAAI;AACF,YAAM,eAAe,0BAA0B;AAAA,QAC7C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,aAAa,CAAC;AAAA,MAC3D,CAAC;AACD,YAAM,EAAE,6BAA6B,aAAa,GAAG,SAAS;AAC9D,kBAAY,KAAK;AAEjB,YAAM,UAAU,MAAM,oBAAoB,OAAO,IAAI,OAAO;AAC5D,UAAI,QAAS,WAAU,OAAO;AAAA,IAChC,SAAS,KAAK;AACZ,cAAQ,MAAM,qBAAqB,GAAG;AACtC,YAAM,EAAE,4BAA4B,uBAAuB,GAAG,OAAO;AAAA,IACvE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,qBAAqB,OAAO,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9D,QAAM,eAAe,MAAM,YAAY,YAAY;AACjD,QAAI,CAAC,OAAQ;AACb,UAAM,YAAY,OAAO;AAAA,MACvB,EAAE,wCAAwC,8CAA8C;AAAA,IAC1F;AACA,QAAI,CAAC,UAAW;AAChB,gBAAY,IAAI;AAChB,UAAM,WAAW,SAAS,UAAU,sBAAsB;AAC1D,UAAM,OAAO,MAAM,QAAQ,UAAU;AAAA,MACnC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,GAAG,CAAC;AAAA,IACxC,CAAC;AACD,QAAI,KAAK,IAAI;AACX,YAAM,EAAE,kCAAkC,mBAAmB,GAAG,SAAS;AACzE,YAAM,WAAW,SAAS,UAAU,0BAA0B;AAC9D,aAAO,KAAK,QAAQ;AAAA,IACtB,OAAO;AACL,YAAM,EAAE,uCAAuC,4BAA4B,GAAG,OAAO;AAAA,IACvF;AACA,gBAAY,KAAK;AAAA,EACnB,GAAG,CAAC,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAE5B,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,UAAM,SAA8B;AAAA,MAClC;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ,MACN;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,+CAA+C,iBAAiB;AAAA,YACzE,OAAO,QAAQ,oBAAoB;AAAA,YACnC,UAAW,QAAQ,0BAA0B;AAAA,YAC7C,YAAY,EAAE,gCAAgC,SAAS;AAAA,YACvD,SAAS;AAAA,YACT,SAAS;AAAA,YACT,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,aAAa,EAAE,qDAAqD,wBAAwB;AAAA,YAC5F,cAAc,EAAE,iDAAiD,gCAA2B;AAAA,YAC5F,mBAAmB,EAAE,+CAA+C,4BAA4B;AAAA,YAChG,cAAc,CAAC,OACb,EAAE,kDAAkD,oCAAoC,EAAE,GAAG,CAAC;AAAA,YAEhG,MAAM,oBAAC,SAAM,WAAU,iCAAgC;AAAA;AAAA,QACzD;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ,MACN;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,8CAA8C,gBAAgB;AAAA,YACvE,OAAO,QAAQ,mBAAmB;AAAA,YAClC,UAAW,QAAQ,yBAAyB;AAAA,YAC5C,YAAY,EAAE,gCAAgC,SAAS;AAAA,YACvD,SAAS;AAAA,YACT,SAAS;AAAA,YACT,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,aAAa,EAAE,oDAAoD,uBAAuB;AAAA,YAC1F,cAAc,EAAE,gDAAgD,+BAA0B;AAAA,YAC1F,mBAAmB,EAAE,8CAA8C,2BAA2B;AAAA,YAC9F,cAAc,CAAC,OACb,EAAE,iDAAiD,mCAAmC,EAAE,GAAG,CAAC;AAAA,YAE9F,MAAM,oBAAC,cAAW,WAAU,iCAAgC;AAAA;AAAA,QAC9D;AAAA,MAEJ;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,aAAO,KAAK;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,mDAAmD,mBAAmB;AAAA,QAC/E,YAAY,EAAE,gCAAgC,SAAS;AAAA,QACvD,aAAa,EAAE,yDAAyD,4BAA4B;AAAA,QACpG,OAAO,QAAQ,qBACX,IAAI,KAAK,OAAO,kBAAkB,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAC7D;AAAA,QACJ,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,eAAe,CAACA,YAAW;AACzB,gBAAM,EAAE,OAAO,WAAW,IAAIA;AAC9B,cAAI,SAAS,MAAM,QAAQ;AACzB,mBAAO,oBAAC,UAAK,WAAU,iCAAiC,cAAI,KAAK,KAAK,EAAE,mBAAmB,GAAE;AAAA,UAC/F;AACA,iBAAO,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA,QACrE;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,sCAAsC,oBAAoB;AAAA,QACnE,YAAY,EAAE,gCAAgC,SAAS;AAAA,QACvD,aAAa,EAAE,kDAAkD,wBAAwB;AAAA,QACzF,OAAO,QAAQ,qBAAqB;AAAA,QACpC,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,sCAAsC,oBAAoB;AAAA,QACnE,YAAY,EAAE,gCAAgC,SAAS;AAAA,QACvD,aAAa,EAAE,kDAAkD,qBAAqB;AAAA,QACtF,OAAO,QAAQ,qBAAqB;AAAA,QACpC,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,kCAAkC,SAAS;AAAA,QACpD,YAAY,EAAE,gCAAgC,SAAS;AAAA,QACvD,aAAa,EAAE,8CAA8C,aAAa;AAAA,QAC1E,OAAO,QAAQ,WAAW;AAAA,QAC1B,QAAQ;AAAA,QACR,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ,MACN,qBAAC,eAAY,OAAO,EAAE,qCAAqC,YAAY,GAAG,OAAK,MAC7E;AAAA,+BAAC,OAAE,WAAU,iCACV;AAAA,cAAE,kCAAkC,SAAS;AAAA,YAAE;AAAA,YAAG,QAAQ,aAAa;AAAA,aAC1E;AAAA,UACA,qBAAC,OAAE,WAAU,iCACV;AAAA,cAAE,kCAAkC,SAAS;AAAA,YAAE;AAAA,YAAG,QAAQ,aAAa;AAAA,aAC1E;AAAA,WACF;AAAA,MAEJ;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,eAQD;AAAA,IACH;AAAA,MACE,KAAK;AAAA,MACL,OAAO,EAAE,gCAAgC,eAAe;AAAA,MACxD,OAAO;AAAA,MACP,aAAa,EAAE,4CAA4C,WAAW;AAAA,MACtE,YAAY,EAAE,gCAAgC,SAAS;AAAA,MACvD,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO,EAAE,kCAAkC,SAAS;AAAA,MACpD,OAAO,QAAQ,aAAa;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO,EAAE,iCAAiC,QAAQ;AAAA,MAClD,OAAO,QAAQ,UAAU;AAAA,IAC3B;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO,EAAE,mCAAmC,UAAU;AAAA,MACtD,OAAO,QAAQ,gBAAgB;AAAA,MAC/B,oBAAoB;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,CAAC,EAAE,OAAO,WAAW,MAAgE;AACnF,YAAM,aAAa,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AAC9D,UAAI,CAAC,WAAW,QAAQ;AACtB,eAAO,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA,MACrE;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAM,UAAU,UAAU;AAAA,UAE1B;AAAA,gCAAC,QAAK,WAAU,WAAU,eAAW,MAAC;AAAA,YACtC,oBAAC,UAAK,WAAU,YAAY,sBAAW;AAAA;AAAA;AAAA,MACzC;AAAA,IAEJ;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,MAAM,QAAQ,OAAO,EAAE,MAAM,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC;AAC/E,QAAM,qBAAqB,MAAM,QAAQ,MAAM,yBAAyB,IAAI,SAAS,CAAC,IAAI,CAAC;AAC3F,QAAM,yBAAyB,MAAM,QAAQ,MAAM,yBAAyB,IAAI,YAAY,CAAC,IAAI,CAAC;AAClG,QAAM,EAAE,SAAS,mBAAmB,IAAI,oBAAoB,oBAAoB;AAAA,IAC9E,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,eAAe,MAAM;AAAA,IACzB,OACG,sBAAsB,CAAC,GACrB,OAAO,CAAC,YAAY,OAAO,WAAW,QAAQ,WAAW,KAAK,EAC9D,IAAI,CAAC,WAAW;AACf,YAAM,KAAK,OAAO,WAAW,WAAW,OAAO;AAC/C,YAAM,QAAQ,OAAO,WAAW,cAAc,OAAO,OAAO,SAAS;AACrE,YAAM,WAAW,OAAO,OAAO,WAAW,aAAa,WAAW,OAAO,UAAU,WAAW;AAC9F,YAAM,SAAS,MACb;AAAA,QAAC,OAAO,OAAO;AAAA,QAAd;AAAA,UACC,SAAS;AAAA,UACT,MAAM;AAAA,UACN,cAAc,CAAC,SAAS,UAAU,IAAiC;AAAA;AAAA,MACrE;AAEF,aAAO,EAAE,IAAI,OAAO,UAAU,OAAO;AAAA,IACvC,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,IAC3C,CAAC,oBAAoB,kBAAkB,QAAQ,SAAS;AAAA,EAC1D;AACA,QAAM,iBAAiB,MAAM,QAAQ,MAAM,IAAI,IAAI,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;AAEnH,QAAM,aAAa,MAAM;AAAA,IACvB,MAAM;AACJ,YAAM,OAA6C;AAAA,QACjD,EAAE,IAAI,YAAY,OAAO,EAAE,wCAAwC,UAAU,EAAE;AAAA,QAC/E,EAAE,IAAI,aAAa,OAAO,EAAE,yCAAyC,WAAW,EAAE;AAAA,QAClF,EAAE,IAAI,SAAS,OAAO,EAAE,qCAAqC,OAAO,EAAE;AAAA,MACxE;AACA,UAAI,SAAS,SAAS;AACpB,aAAK;AAAA,UACH,EAAE,IAAI,aAAa,OAAO,EAAE,yCAAyC,WAAW,EAAE;AAAA,UAClF,EAAE,IAAI,YAAY,OAAO,EAAE,wCAAwC,UAAU,EAAE;AAAA,QACjF;AAAA,MACF;AACA,WAAK,KAAK,EAAE,IAAI,eAAe,OAAO,EAAE,2CAA2C,aAAa,EAAE,CAAC;AACnG,mBAAa,QAAQ,CAAC,QAAQ;AAC5B,aAAK,KAAK,EAAE,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM,CAAC;AAAA,MAC5C,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,cAAc,MAAM,CAAC;AAAA,EACxB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,WAAW,KAAK,CAAC,QAAQ,IAAI,OAAO,SAAS,EAAG;AACpD,UAAM,cAAc,WAAW,CAAC,GAAG,MAAM;AACzC,QAAI,cAAc,aAAa;AAC7B,mBAAa,WAAW;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,CAAC;AAE1B,QAAM,mBAAmB,MAAM,QAAQ,MAAM,EAAE,qCAAqC,KAAK,GAAG,CAAC,CAAC,CAAC;AAE/F,QAAM,oBAAoB,MAAM;AAAA,IAC9B,OAAO;AAAA,MACL,MAAM,OAAO,EAAE,SAAS,MAAM;AAC5B,YAAI,CAAC,UAAU,CAAC,YAAY,OAAO,OAAO,SAAU,QAAO,CAAC;AAC5D,cAAMA,UAAS,IAAI,gBAAgB,EAAE,aAAa,MAAM,WAAW,SAAS,CAAC;AAC7E,cAAM,UAAU,MAAM;AAAA,UACpB,oBAAoBA,QAAO,SAAS,CAAC;AAAA,UACrC;AAAA,UACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,QACxF;AACA,cAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC/D,eAAO,MAAM,IAAI,iBAAiB;AAAA,MACpC;AAAA,MACA,QAAQ,OAAO,EAAE,UAAU,MAAM,gBAAgB,gBAAgB,MAAM;AACrE,YAAI,CAAC,UAAU,OAAO,OAAO,UAAU;AACrC,gBAAM,IAAI,MAAM,EAAE,sCAAsC,4BAA4B,CAAC;AAAA,QACvF;AACA,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU;AAAA,cACnB,aAAa;AAAA,cACb,WAAW;AAAA,cACX;AAAA,cACA,gBAAgB,kBAAkB;AAAA,cAClC,iBAAiB,mBAAmB;AAAA,YACtC,CAAC;AAAA,UACH;AAAA,UACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,QACxF;AACA,eAAO,SAAS,UAAU,CAAC;AAAA,MAC7B;AAAA,MACA,QAAQ,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,YAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,EAAE,sCAAsC,4BAA4B,CAAC;AAClG,cAAM,UAAmC,EAAE,GAAG;AAC9C,YAAI,MAAM,SAAS,OAAW,SAAQ,OAAO,MAAM;AACnD,YAAI,MAAM,mBAAmB,OAAW,SAAQ,iBAAiB,MAAM;AACvE,YAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,UAC9B;AAAA,UACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,QACxF;AAAA,MACF;AAAA,MACA,QAAQ,OAAO,EAAE,GAAG,MAAM;AACxB,YAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,EAAE,sCAAsC,4BAA4B,CAAC;AAClG,cAAM;AAAA,UACJ,uBAAuB,mBAAmB,EAAE,CAAC;AAAA,UAC7C;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAChD;AAAA,UACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,QACxF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClB;AAEA,QAAM,wBAAwB,MAAM;AAAA,IAClC,OAAO,SAAiB;AACtB,UAAI,CAAC,OAAQ;AACb,UAAI;AACF,cAAM,kBAAkB,SAAS;AAAA,UAC/B,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,gBAAQ,MAAM,2BAA2B,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC5B;AAEA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,OAAO;AAAA,MACL,OAAO,EAAE,+CAA+C,kBAAkB;AAAA,MAC1E,aAAa,EAAE,qDAAqD,wCAAwC;AAAA,MAC5G,aAAa,EAAE,uCAAuC,aAAa;AAAA,IACrE;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,4BAA4B,MAAM,YAAY,CAAC,WAAiC;AACpF,qBAAiB,MAAM;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM,YAAY,MAAM;AAClD,QAAI,CAAC,iBAAiB,cAAc,SAAU;AAC9C,kBAAc,QAAQ;AAAA,EACxB,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO;AAAA,MACL,OAAO;AAAA,QACL,OAAO,EAAE,4CAA4C,eAAe;AAAA,QACpE,aAAa,EAAE,kDAAkD,oDAAoD;AAAA,MACvH;AAAA,MACA,WAAW;AAAA,QACT,OAAO,EAAE,gDAAgD,mBAAmB;AAAA,QAC5E,aAAa;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,OAAO,EAAE,+CAA+C,kBAAkB;AAAA,QAC1E,aAAa,EAAE,qDAAqD,gCAAgC;AAAA,MACtG;AAAA,MACA,aAAa;AAAA,QACX,OAAO,EAAE,kDAAkD,qBAAqB;AAAA,QAChF,aAAa;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,mBAAmB,MAAM;AAC7B,UAAM,mBAAmB,eAAe,IAAI,SAAS;AACrD,QAAI,kBAAkB;AACpB,aAAO,iBAAiB;AAAA,IAC1B;AACA,QAAI,cAAc,YAAY;AAC5B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,OAAO;AAAA,UACjB,YAAY,EAAE,gCAAgC,SAAS;AAAA,UACvD,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,gBAAgB,kBAAkB;AAAA,UAClC,YAAY;AAAA,YACV,OAAO,kBAAkB;AAAA,YACzB,aAAa,kBAAkB;AAAA,YAC/B,aAAa,kBAAkB;AAAA,UACjC;AAAA,UACA,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,wBAAwB;AAAA,UACxB,yBAAyB;AAAA;AAAA,MAC3B;AAAA,IAEJ;AACA,QAAI,cAAc,aAAa;AAC7B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,YAAY,OAAO;AAAA,UACnB;AAAA,UACA,YAAY,OAAO,oBAAoB;AAAA,UACvC,mBAAmB,OAAO,qBAAqB;AAAA,UAC/C,kBAAkB,OAAO,oBAAoB;AAAA,UAC7C,yBAAyB,oBAAoB;AAAA,UAC7C,wBAAwB,mBAAmB;AAAA,UAC3C,cAAc;AAAA,UACd,WAAW,CAAC,UAAU,UAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM,IAAI,IAAK;AAAA;AAAA,MACjF;AAAA,IAEJ;AACA,QAAI,cAAc,SAAS;AACzB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,YAAY,OAAO;AAAA,UACnB;AAAA,UACA,cAAc,OAAO,gBAAgB;AAAA,UACrC,gBAAiB,QAAgB,kBAAmB,QAAgB,mBAAmB;AAAA,UACvF,UAAW,QAAgB,YAAa,QAAgB,aAAa;AAAA,UACrE,gBAAgB;AAAA,UAChB,eAAe,CAAC,UAAU,YAAY,MAAM,SAAS,CAAC;AAAA;AAAA,MACxD;AAAA,IAEJ;AACA,QAAI,cAAc,aAAa;AAC7B,UAAI,SAAS,SAAS;AACpB,cAAMG,eAAc,eAAe;AACnC,eACE;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA,aAAY;AAAA,YACnB,aAAaA,aAAY;AAAA;AAAA,QAC3B;AAAA,MAEJ;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAO;AAAA,UAChB,cAAc,OAAO,gBAAgB;AAAA,UACrC,gBAAiB,QAAgB,kBAAmB,QAAgB,mBAAmB;AAAA,UACvF,UAAW,QAAgB,YAAa,QAAgB,aAAa;AAAA,UACrE,yBAAyB,oBAAoB;AAAA,UAC7C,gBAAgB;AAAA,UAChB,cAAc;AAAA;AAAA,MAChB;AAAA,IAEJ;AACA,QAAI,cAAc,eAAe;AAC/B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,YAAY,OAAO;AAAA,UACnB;AAAA,UACA,cAAc,OAAO,gBAAgB;AAAA,UACrC,gBAAiB,QAAgB,kBAAmB,QAAgB,mBAAmB;AAAA,UACvF,UAAW,QAAgB,YAAa,QAAgB,aAAa;AAAA,UACrE,gBAAgB;AAAA,UAChB,cAAc;AAAA;AAAA,MAChB;AAAA,IAEJ;AACA,QAAI,cAAc,YAAY;AAC5B,UAAI,SAAS,SAAS;AACpB,cAAMA,eAAc,eAAe;AACnC,eACE;AAAA,UAAC;AAAA;AAAA,YACC,OAAOA,aAAY;AAAA,YACnB,aAAaA,aAAY;AAAA;AAAA,QAC3B;AAAA,MAEJ;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAO;AAAA,UAChB,cAAc,OAAO,gBAAgB;AAAA,UACrC,gBAAiB,QAAgB,kBAAmB,QAAgB,mBAAmB;AAAA,UACvF,UAAW,QAAgB,YAAa,QAAgB,aAAa;AAAA,UACrE,gBAAgB;AAAA,UAChB,kBAAkB,CAAC,aAAa,eAAe,SAAS,SAAS,CAAC;AAAA,UAClE,gBAAgB,CAAC,WACf;AAAA,YAAU,CAAC,SACT,OACI;AAAA,cACE,GAAG;AAAA,cACH,iBACE,QAAQ,mBAAmB,KAAK,mBAAmB;AAAA,cACrD,qBACE,QAAQ,uBAAuB,KAAK,uBAAuB;AAAA,cAC7D,mBACE,QAAQ,qBAAqB,KAAK,qBAAqB;AAAA,YAC3D,IACA;AAAA,UACN;AAAA;AAAA,MAEJ;AAAA,IAEJ;AACA,UAAM,cACJ,eAAe,SAAS,KACxB;AAAA,MACE,OAAO,EAAE,wCAAwC,2BAA2B;AAAA,MAC5E,aAAa;AAAA,IACf;AACF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,YAAY;AAAA,QACnB,aAAa,YAAY;AAAA;AAAA,IAC3B;AAAA,EAEJ;AAEA,QAAM,oBAAoB,MAAM,QAAQ,MAAM;AAC5C,UAAM,SAAkC,CAAC;AACzC,QAAI,QAAQ,gBAAgB,OAAO,OAAO,iBAAiB,YAAY,CAAC,MAAM,QAAQ,OAAO,YAAY,GAAG;AAC1G,aAAO,OAAO,QAAQ,OAAO,YAAuC;AAAA,IACtE;AACA,UAAM,YAAY,QAAQ;AAC1B,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,gBAAU,QAAQ,CAAC,UAAU;AAC3B,cAAM,MAAM,SAAS,OAAO,UAAU,YAAY,SAAS,QAAS,MAAc,MAAM;AACxF,cAAM,QAAQ,SAAS,OAAO,UAAU,YAAY,WAAW,QAAS,MAAc,QAAQ;AAC9F,YAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAG,QAAO,GAAG,IAAI;AAAA,MAC3D,CAAC;AAAA,IACH,WAAW,aAAa,OAAO,cAAc,UAAU;AACrD,aAAO,OAAO,QAAQ,SAAoC;AAAA,IAC5D;AACA,WAAO,wBAAwB,MAAM;AAAA,EACvC,GAAG,CAAC,QAAQ,cAAc,QAAQ,YAAY,CAAC;AAE/C,QAAM,2BAA2B,MAAM;AAAA,IACrC,OAAO,WAAoC;AACzC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,EAAE,sCAAsC,4BAA4B,CAAC;AAAA,MACvF;AACA,YAAM,gBAAgB,yBAAyB,QAAQ;AAAA,QACrD,WAAW,CAAC,UAAU,gCAAgC,KAAK;AAAA,QAC3D,QAAQ,CAAC,YAAY,CAAC,QAAQ,WAAW,KAAK;AAAA,MAChD,CAAC;AACD,UAAI,CAAC,OAAO,KAAK,aAAa,EAAE,QAAQ;AACtC,cAAM,EAAE,8BAA8B,qBAAqB,GAAG,SAAS;AACvE;AAAA,MACF;AACA,YAAM,WAAW,SAAS,UAAU,sBAAsB;AAC1D,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,IAAI,cAAc,cAAc,CAAC;AAAA,UACrE;AAAA,UACA,EAAE,cAAc,EAAE,sCAAsC,4BAA4B,EAAE;AAAA,QACxF;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,EAAE,SAAS,eAAe,YAAY,IAAI,+BAA+B,GAAG;AAClF,cAAM,eAAe,cACjB,OAAO,QAAQ,WAAW,EAAE,OAA+B,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAChF,gBAAM,UAAU,IAAI,WAAW,KAAK,IAAI,MAAM,MAAM,GAAG;AACvD,cAAI,OAAO,IAAI;AACf,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC,IACL;AACJ,cAAMC,SAAQ,IAAI,MAAM,iBAAiB,EAAE,sCAAsC,4BAA4B,CAAC;AAG9G,YAAI,gBAAgB,OAAO,KAAK,YAAY,EAAE,OAAQ,CAAAA,OAAM,cAAc;AAC1E,cAAMA;AAAA,MACR;AACA;AAAA,QAAU,CAAC,SACT,OACI;AAAA,UACE,GAAG;AAAA,UACH,cAAc;AAAA,UACd,cAAc;AAAA,QAChB,IACA;AAAA,MACN;AACA,YAAM,EAAE,8BAA8B,qBAAqB,GAAG,SAAS;AAAA,IACzE;AAAA,IACA,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClB;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO,UAAyC;AAC9C,YAAMJ,UAAS,IAAI,gBAAgB,EAAE,UAAU,MAAM,CAAC;AACtD,UAAI,MAAO,CAAAA,QAAO,IAAI,UAAU,KAAK;AACrC,YAAM,UAAU,MAAM;AAAA,QACpB,mBAAmBA,QAAO,SAAS,CAAC;AAAA,QACpC;AAAA,QACA,EAAE,cAAc,EAAE,yCAAyC,sBAAsB,EAAE;AAAA,MACrF;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC/D,aAAO,MACJ,IAAI,CAAC,SAAoC;AACxC,YAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,cAAM,MAAM;AACZ,cAAM,QACJ,OAAO,IAAI,OAAO,WACd,IAAI,KACJ,OAAO,IAAI,UAAU,WACnB,IAAI,QACJ;AACR,YAAI,CAAC,MAAO,QAAO;AACnB,cAAM,aACH,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,EAAE,UAAU,IAAI,MAAM,KAAK,KAC3E,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,KAAK,EAAE,UAAU,IAAI,KAAK,KAAK,KACzE;AACF,cAAM,QAAQ,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAC5F,eAAO,EAAE,IAAI,OAAO,OAAO,YAAY,MAAM;AAAA,MAC/C,CAAC,EACA,OAAO,CAAC,UAA8B,UAAU,IAAI;AAAA,IACzD;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,OAAO,UAAsC;AAC3C,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,QAAQ,QAAQ;AACnB,cAAM,IAAI,MAAM,EAAE,6CAA6C,uBAAuB,CAAC;AAAA,MACzF;AACA,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC;AAAA,QACzC;AAAA,QACA,EAAE,cAAc,EAAE,2CAA2C,uBAAuB,EAAE;AAAA,MACxF;AACA,YAAM,UAAU,SAAS,UAAU,CAAC;AACpC,YAAM,KACJ,OAAO,SAAS,OAAO,WACnB,QAAQ,KACR,OAAQ,SAAiB,UAAU,WAChC,QAAgB,QACjB;AACR,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,EAAE,2CAA2C,uBAAuB,CAAC;AAC9F,YAAM,QAAQ,OAAQ,SAAiB,UAAU,YAAa,QAAgB,MAAM,KAAK,EAAE,SACtF,QAAgB,MAAM,KAAK,IAC5B;AACJ,aAAO,EAAE,IAAI,OAAO,SAAS,MAAM;AAAA,IACrC;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO,EAAE,KAAK,MAA6B;AACzC,UAAI,CAAC,OAAQ;AACb,YAAM,WAAW,SAAS,UAAU,sBAAsB;AAC1D,YAAM,SAAS,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC5D,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,CAAC;AAAA,QACtD;AAAA,QACA,EAAE,cAAc,EAAE,2CAA2C,wBAAwB,EAAE;AAAA,MACzF;AACA,gBAAU,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,MAAM,KAAK,IAAI,IAAK;AAC3D,cAAQ,IAAI;AACZ,YAAM,EAAE,uCAAuC,eAAe,GAAG,SAAS;AAAA,IAC5E;AAAA,IACA,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClB;AAEA,MAAI,SAAS;AACX,WACE,oBAAC,QACC,8BAAC,YACC,8BAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,kCAAkC,wBAAmB;AAAA,QAC9D,WAAU;AAAA;AAAA,IACZ,GACF,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,oBAAC,QACC,8BAAC,YACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,QACE,qBAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,UAAO,MAAK,MAAK,SAAS,MAAM,YAAY,GAC1C,YAAE,gCAAgC,WAAW,GAChD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,OAAO,KAAK,iCAAiC;AAAA,cAE3D,YAAE,uCAAuC,uBAAuB;AAAA;AAAA,UACnE;AAAA,WACF;AAAA;AAAA,IAEJ,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,qBAAC,QACC;AAAA,yBAAC,YAAS,WAAU,aAClB;AAAA,2BAAC,SAAI,WAAU,sEACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,SAAS,UAAU,0BAA0B;AAAA,cACnD,WAAU;AAAA,cAEV;AAAA,oCAAC,UAAK,eAAW,MAAC,WAAU,kBAAiB,oBAAC;AAAA,gBAC9C,oBAAC,UAAK,WAAU,WAAW,YAAE,+BAA+B,mBAAmB,GAAE;AAAA;AAAA;AAAA,UACnF;AAAA,UACA,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,OAAE,WAAU,2CACV,mBAAS,UACN,EAAE,gCAAgC,aAAa,IAC/C,EAAE,gCAAgC,aAAa,GACrD;AAAA,YACA,oBAAC,SAAI,WAAU,qCACb;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,iCAAiC,iBAAiB;AAAA,gBAC3D,OAAO;AAAA,gBACP,YAAY,EAAE,sCAAsC,eAAe;AAAA,gBACnE,QAAQ,YAAY,MAAM,EAAE,mCAAmC,+BAA+B,GAAG,MAAM;AAAA,gBACvG,SAAQ;AAAA,gBACR,iBAAe;AAAA,gBACf,WAAS;AAAA,gBACT,kBAAiB;AAAA,gBACjB,oBAAmB;AAAA,gBACnB,eAAe,CAAC,EAAE,OAAO,cAAc,WAAW,MAChD,gBAAgB,aAAa,SAC3B,oBAAC,UAAK,WAAU,0DAA0D,wBAAa,IAEvF,oBAAC,UAAK,WAAU,yBAAyB,sBAAW;AAAA,gBAGxD,iBAAiB;AAAA,gBACjB,eACE,gBACE;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,SAAS,MAAM,KAAK,qBAAqB;AAAA,oBACzC,UAAU;AAAA,oBACV,WAAU;AAAA,oBAET;AAAA,mCAAa,oBAAC,WAAQ,WAAU,wBAAuB,IAAK,oBAAC,SAAM,WAAU,WAAU;AAAA,sBACxF,oBAAC,UAAK,WAAU,WAAW,YAAE,yCAAyC,iBAAiB,GAAE;AAAA;AAAA;AAAA,gBAC3F,IACE;AAAA;AAAA,YAER,GACF;AAAA,YACC,OAAO,SACN,qBAAC,SAAM,SAAQ,aAAY,WAAU,kCAClC;AAAA,6BAAe,OAAO,qBAAqB,cAAc,MAAM,SAAS,IAAI;AAAA,cAC7E,oBAAC,UAAK,WAAU,kCACb,yBAAe,QACZ,sBAAsB,cAAc,OAAO,kDAAkD,IAC7F,oBAAC,UAAK,WAAU,uCAAsC,GAC5D;AAAA,cACA,oBAAC,UAAM,yBAAe,SAAS,OAAO,QAAO;AAAA,eAC/C,IACE;AAAA,aACN;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA,mBAAS,UACR;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,MAAM,KAAK,cAAc;AAAA,cAClC,UAAU;AAAA,cAET;AAAA,6BAAa,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,gBACjE,EAAE,yCAAyC,kBAAkB;AAAA;AAAA;AAAA,UAChE,IACE;AAAA,UACH,SAAS,UACR;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,MAAM,YAAY,IAAI;AAAA,cAC/B,UAAU,CAAC,gBAAgB;AAAA,cAE1B;AAAA,0BAAU,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,gBAC9D,EAAE,4BAA4B,kBAAkB;AAAA;AAAA;AAAA,UACnD,IACE;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,KAAK,aAAa;AAAA,cACjC,UAAU;AAAA,cACV,WAAU;AAAA,cAET;AAAA,2BAAW,oBAAC,WAAQ,WAAU,wBAAuB,IAAK,oBAAC,UAAO,WAAU,WAAU,eAAW,MAAC;AAAA,gBAClG,EAAE,iCAAiC,QAAQ;AAAA;AAAA;AAAA,UAC9C;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,4BAAC,SAAI,WAAU,iBACb;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,mCAAmC,UAAU;AAAA,YACtD,YAAY,OAAO,oBAAoB;AAAA,YACvC;AAAA,YACA,eAAe,gBAAgB;AAAA,YAC/B;AAAA,YACA,WAAW;AAAA,YACX;AAAA,YACA,iBAAiB;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,YACR,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,cAAc;AAAA,YACd,cAAc;AAAA;AAAA,QAChB,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,EAAE,+BAA+B,MAAM;AAAA,YAC9C,OACE,QAAQ,WACJ,IAAI,KAAK,OAAO,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IACnD,QAAQ,YACN,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IACpD;AAAA,YAER,YAAY,EAAE,gCAAgC,SAAS;AAAA,YACvD,QAAQ;AAAA,YACR,WAAU;AAAA,YACV,iBAAe;AAAA,YACf,oBAAmB;AAAA,YACnB,WAAW,EAAE,6CAA6C;AAAA,YAC1D,eAAe,CAAC,EAAE,OAAO,WAAW,MAClC,SAAS,MAAM,SACb,oBAAC,UAAK,WAAU,iCACb,cAAI,KAAK,KAAK,EAAE,mBAAmB,GACtC,IAEA,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA;AAAA,UArB5D;AAAA,QAwBN;AAAA,SACF;AAAA,MAEA,oBAAC,SAAI,WAAU,6BACZ,uBAAa,IAAI,CAAC,SAAS;AAC1B,YAAI,KAAK,QAAQ,SAAS;AACxB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,aAAa,KAAK;AAAA,cAClB,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,cAC1E,QAAQ;AAAA,cACR,eAAe;AAAA,cACf,UAAU;AAAA;AAAA,YAPL,KAAK;AAAA,UAQZ;AAAA,QAEJ;AACA,YAAI,KAAK,QAAQ,WAAW;AAC1B,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK;AAAA,cACZ,OAAO,QAAQ,aAAa;AAAA,cAC5B,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,cAC1E,SAAS;AAAA,cACT,SAAS;AAAA,cACT,eAAe;AAAA,cACf,QAAQ;AAAA,cACR,WAAW;AAAA;AAAA,YARN,KAAK;AAAA,UASZ;AAAA,QAEJ;AACA,YAAI,KAAK,QAAQ,UAAU;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,cAC1E,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,eAAe;AAAA,cACf,QAAQ;AAAA,cACR,YAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,cACX,eAAe;AAAA;AAAA,YAXV,KAAK;AAAA,UAYZ;AAAA,QAEJ;AACA,YAAI,KAAK,QAAQ,QAAQ;AACvB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,cAC1E,QAAQ,YAAY,MAAM,EAAE,mCAAmC,gCAAgC,GAAG,MAAM;AAAA,cACxG,WAAU;AAAA,cACV,iBAAe;AAAA,cACf,oBAAoB,KAAK;AAAA,cACzB,eAAe,CAAC,EAAE,OAAO,WAAW,MAClC,SAAS,MAAM,SACb,oBAAC,UAAK,WAAU,2BAA2B,iBAAM,IAEjD,oBAAC,UAAK,WAAU,iCAAiC,sBAAW;AAAA;AAAA,YAZ3D,KAAK;AAAA,UAeZ;AAAA,QAEJ;AACA,YAAI,KAAK,QAAQ,YAAY;AAC3B,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK;AAAA,cACZ,OAAO,KAAK;AAAA,cACZ,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,cAC1E,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,cAAc,MAAM,iBAAiB,IAAI;AAAA,cACzC,QAAQ;AAAA,cACR,UAAU,MAAM;AACd,oBAAI,qBAAqB;AACvB,wBAAM,qBAAqB,OAAO;AAAA,gBACpC;AAAA,cACF;AAAA,cACA,QAAQ,OAAO,SAAS;AACtB,iCAAiB,IAAI;AACrB,oBAAI;AACF,wBAAM,qBAAqB,IAAI;AAAA,gBACjC,SAAS,KAAK;AACZ,wBAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU,EAAE,sCAAsC,4BAA4B;AACxI,mCAAiB,OAAO;AACxB,wBAAM;AAAA,gBACR;AAAA,cACF;AAAA;AAAA,YAvBK,KAAK;AAAA,UAwBZ;AAAA,QAEJ;AACA,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,KAAK;AAAA,YACZ,OAAO,KAAK;AAAA,YACZ,YAAY,KAAK,cAAc,EAAE,gCAAgC,SAAS;AAAA,YAC1E,aAAa,KAAK;AAAA,YAClB,QAAQ,YAAY,MAAM,EAAE,mCAAmC,gCAAgC,GAAG,MAAM;AAAA,YACxG,WAAW,KAAK,SAAS,UAAU,UAAU;AAAA,YAC7C,iBAAe;AAAA,YACf,oBAAoB,KAAK;AAAA,YACzB,eAAe,CAACA,YACd,KAAK,QAAQ,UACT,mBAAmBA,OAAM,IACzBA,QAAO,SAASA,QAAO,MAAM,SAC3B,oBAAC,UAAK,WAAU,yBAAyB,UAAAA,QAAO,OAAM,IACtD,oBAAC,UAAK,WAAU,iCAAiC,UAAAA,QAAO,YAAW;AAAA;AAAA,UAdtE,KAAK;AAAA,QAgBZ;AAAA,MAEJ,CAAC,GACH;AAAA,MAEA,qBAAC,SACC;AAAA,6BAAC,SAAI,WAAU,+DACb;AAAA,8BAAC,SAAI,WAAU,qCACZ,qBAAW,IAAI,CAAC,QACf;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,gBACA,cAAc,IAAI,KACd,2CACA;AAAA,cACN;AAAA,cACA,SAAS,MAAM,aAAa,IAAI,EAAE;AAAA,cAEjC,cAAI;AAAA;AAAA,YAVA,IAAI;AAAA,UAWX,CACD,GACH;AAAA,UACC,gBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,cAAc;AAAA,cAEvB;AAAA,8BAAc,QAAQ,oBAAC,QAAK,WAAU,gBAAe;AAAA,gBACrD,cAAc;AAAA;AAAA;AAAA,UACjB,IACE;AAAA,WACN;AAAA,QACC,iBAAiB;AAAA,SACpB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,uCAAuC,QAAQ;AAAA,UACxD,UAAU,OAAO,gBAAgB;AAAA,UACjC,OAAO;AAAA;AAAA,MACT;AAAA,MAEA,qBAAC,SAAI,WAAU,aAAY,KAAK,kBAC9B;AAAA,4BAAC,OAAE,WAAU,yBAAyB,YAAE,kCAAkC,SAAS,GAAE;AAAA,QACrF,oBAAC,uBAAoB,QAAQ,cAAc;AAAA,QAC3C;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,cAAc,CAAC,SAAS,UAAU,IAAiC;AAAA;AAAA,QACrE;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,qCAAqC,aAAa;AAAA,YAC3D,WAAW,CAAC,SAAS,UAAU,EAAE,MAAM,cAAc,EAAE,MAAM,WAAW;AAAA,YACxE,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACV;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,+BAA+B,MAAM;AAAA,YAC9C;AAAA,YACA,UAAU;AAAA,YACV,cAAc;AAAA,YACd,SAAO;AAAA,YACP,aAAa;AAAA,YACb;AAAA,YACA,QAAQ,CAAC,EAAE,KAAK,MAAM,eAAe,EAAE,KAAK,CAAC;AAAA,YAC7C,QAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,OACF;AAAA,IAEA,oBAAC,UAAO,MAAM,UAAU,cAAc,aACpC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAM,eAAe;AACrB,wBAAY,KAAK;AACjB;AAAA,UACF;AACA,cAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAC7D,kBAAM,eAAe;AACrB,gBAAI,CAAC,QAAS,MAAK,gBAAgB;AAAA,UACrC;AAAA,QACF;AAAA,QAEA;AAAA,+BAAC,gBACC;AAAA,gCAAC,eAAa,YAAE,2BAA2B,wBAAwB,GAAE;AAAA,YACrE,qBAAC,qBACE;AAAA,gBAAE,iCAAiC,wBAAwB;AAAA,cAAE;AAAA,cAAE,gBAAgB,EAAE,6BAA6B,UAAU;AAAA,eAC3H;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,WAAM,WAAU,uBAAuB,YAAE,kCAAkC,kBAAkB,GAAE;AAAA,YAChG;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,gBAAgB,OAAO,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,gBAC7D,UAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACA,qBAAC,gBACC;AAAA,gCAAC,UAAO,SAAQ,aAAY,SAAS,MAAM,YAAY,KAAK,GAAG,UAAU,SACtE,YAAE,4BAA4B,QAAQ,GACzC;AAAA,YACA,qBAAC,UAAO,SAAS,MAAM,KAAK,gBAAgB,GAAG,UAAU,WAAW,CAAC,cAClE;AAAA,wBAAU,oBAAC,WAAQ,WAAU,6BAA4B,IAAK;AAAA,cAC9D,EAAE,4BAA4B,YAAY;AAAA,eAC7C;AAAA,aACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;",
6
6
  "names": ["normalizedValue", "params", "kind", "item", "placeholder", "error"]
7
7
  }