@open-mercato/ui 0.6.6-develop.6338.1.c32cd17821 → 0.6.6-develop.6343.1.8120f84f30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/backend/CrudForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { z } from 'zod'\nimport { useRouter } from 'next/navigation'\nimport {\n DndContext,\n closestCenter,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type Activators,\n} from '@dnd-kit/core'\nimport type { KeyboardSensorOptions } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy, useSortable, arrayMove } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { DataLoader } from '../primitives/DataLoader'\nimport { Checkbox } from '../primitives/checkbox'\nimport { Input } from '../primitives/input'\nimport { PasswordInput } from '../primitives/password-input'\nimport { Textarea } from '../primitives/textarea'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../primitives/select'\nimport { flash } from './FlashMessages'\nimport { FormHeader } from './forms/FormHeader'\nimport { FormFooter } from './forms/FormFooter'\nimport { Button } from '../primitives/button'\nimport { IconButton } from '../primitives/icon-button'\nimport {\n Check,\n Settings,\n Layers,\n Tag,\n Sparkles,\n Package,\n Shirt,\n Grid,\n ShoppingBag,\n ShoppingCart,\n Store,\n Users,\n Briefcase,\n Building,\n BookOpen,\n Bookmark,\n Camera,\n Car,\n Clock,\n Cloud,\n Compass,\n CreditCard,\n Database,\n Flame,\n Gift,\n Globe,\n Heart,\n Info,\n Key,\n Map as MapIcon,\n Palette,\n Shield,\n Star,\n Truck,\n Zap,\n Coins,\n} from 'lucide-react'\nimport { loadGeneratedFieldRegistrations } from './fields/registry'\nimport type { CustomFieldDefDto, CustomFieldDefinitionsPayload, CustomFieldsetDto } from './utils/customFieldDefs'\nimport { isDefVisible } from './utils/customFieldDefs'\nimport { buildFormFieldsFromCustomFields, buildFormFieldFromCustomFieldDef } from './utils/customFieldForms'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { TagsInput } from './inputs/TagsInput'\nimport { ComboboxInput } from './inputs/ComboboxInput'\nimport { format } from 'date-fns/format'\nimport { parseISO } from 'date-fns/parseISO'\nimport type { Locale } from 'date-fns/locale'\nimport { DateTimePicker } from './inputs/DateTimePicker'\nimport { TimePicker } from './inputs/TimePicker'\nimport { DatePicker } from './inputs/DatePicker'\nimport { mapCrudServerErrorToFormErrors, parseServerMessage } from './utils/serverErrors'\nimport { withScopedApiRequestHeaders } from './utils/apiCall'\nimport { buildOptimisticLockHeader, extractOptimisticLockConflict } from './utils/optimisticLock'\nimport { surfaceRecordConflict } from './conflicts'\nimport type { CustomFieldDefLike } from '@open-mercato/shared/modules/entities/validation'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../primitives/dialog'\nimport { FieldDefinitionsManager, type FieldDefinitionsManagerHandle } from './custom-fields/FieldDefinitionsManager'\nimport { useConfirmDialog } from './confirm-dialog'\nimport { useInjectionSpotEvents, InjectionSpot, useInjectionWidgets } from './injection/InjectionSpot'\nimport { dispatchBackendMutationError } from './injection/mutationEvents'\nimport { VersionHistoryAction } from './version-history/VersionHistoryAction'\nimport { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useInjectionDataWidgets } from './injection/useInjectionDataWidgets'\nimport { CollapsibleGroup, type CollapsibleGroupHandle } from './crud/CollapsibleGroup'\nimport { SortableGroupHandleProvider, type SortableGroupHandleProps } from './crud/SortableGroupHandle'\nimport { useGroupOrder } from './crud/useGroupOrder'\nimport { InjectedField } from './injection/InjectedField'\nimport type { InjectionFieldDefinition, FieldContext } from '@open-mercato/shared/modules/widgets/injection'\nimport { evaluateInjectedVisibility } from './injection/visibility-utils'\nimport { ComponentReplacementHandles } from '@open-mercato/shared/modules/widgets/component-registry'\nimport { RichEditor, type RichEditorLabels } from '../primitives/rich-editor'\nimport MarkdownField from './inputs/MarkdownField'\n\n// Stable empty options array to avoid creating a new [] every render\nconst EMPTY_OPTIONS: CrudFieldOption[] = []\n// Sentinel for the optional-Select clear affordance. Radix Select forbids\n// empty-string item values, so we use a stable non-empty token that maps to\n// `undefined` in the change handler.\nconst SELECT_CLEAR_SENTINEL = '__crudform_select_clear__'\nconst FOCUSABLE_SELECTOR =\n '[data-crud-focus-target], input:not([type=\"hidden\"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\nconst CRUDFORM_EXTENDED_EVENTS_ENABLED = parseBooleanWithDefault(\n process.env.NEXT_PUBLIC_OM_CRUDFORM_EXTENDED_EVENTS_ENABLED,\n true,\n)\n\nfunction evaluateFieldVisibility(\n visibleWhen: { field: string; equals: string | number | boolean } | undefined,\n values: Record<string, unknown>,\n): boolean {\n if (!visibleWhen) return true\n return values[visibleWhen.field] === visibleWhen.equals\n}\n\nfunction isFormControlTarget(target: EventTarget | null): boolean {\n if (!target || typeof (target as Element).tagName !== 'string') return false\n const el = target as HTMLElement\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction resolveActivatorEventTarget(event: React.SyntheticEvent | Event): EventTarget | null {\n const native = (event as React.SyntheticEvent).nativeEvent\n if (native && typeof (native as Event).target !== 'undefined') return (native as Event).target\n return (event as Event).target ?? null\n}\n\nclass GuardedKeyboardSensor extends KeyboardSensor {\n static activators: Activators<KeyboardSensorOptions> = KeyboardSensor.activators.map((activator) => ({\n eventName: activator.eventName,\n handler: (event, options, context) => {\n if (isFormControlTarget(resolveActivatorEventTarget(event))) return false\n return activator.handler(event, options, context)\n },\n }))\n}\n\nfunction resolveInternalNavigationTarget(target: string | URL | null | undefined): string | null {\n if (typeof window === 'undefined' || target == null) return null\n try {\n const url = target instanceof URL ? target : new URL(target, window.location.origin)\n if (url.origin !== window.location.origin) return null\n const currentPath = `${window.location.pathname}${window.location.search}`\n const nextPath = `${url.pathname}${url.search}`\n if (nextPath === currentPath) return null\n return `${url.pathname}${url.search}${url.hash}`\n } catch {\n return null\n }\n}\n\nfunction buildResolvedEntityIdsKey(entityId?: string, entityIds?: string[]): string {\n const dedup = new Set<string>()\n const list: string[] = []\n\n if (Array.isArray(entityIds) && entityIds.length) {\n entityIds.forEach((id) => {\n const trimmed = typeof id === 'string' ? id.trim() : ''\n if (!trimmed || dedup.has(trimmed)) return\n dedup.add(trimmed)\n list.push(trimmed)\n })\n } else if (typeof entityId === 'string' && entityId.trim().length > 0) {\n list.push(entityId.trim())\n }\n\n return list.join('\\0')\n}\n\nexport type CrudFieldBase = {\n id: string\n label: string\n placeholder?: string\n description?: React.ReactNode // inline field-level help\n required?: boolean\n /**\n * Simple conditional visibility for base fields.\n * When not satisfied, the field is not rendered and is excluded from blur validation.\n */\n visibleWhen?: { field: string; equals: string | number | boolean }\n layout?: 'full' | 'half' | 'third'\n disabled?: boolean\n readOnly?: boolean\n defaultValue?: unknown\n}\n\nexport type CrudFieldOption = { value: string; label: string }\n\nexport type CrudBuiltinField = CrudFieldBase & {\n type:\n | 'text'\n | 'password'\n | 'textarea'\n | 'checkbox'\n | 'select'\n | 'number'\n | 'date'\n | 'datepicker'\n | 'datetime-local'\n | 'datetime'\n | 'time'\n | 'tags'\n | 'richtext'\n | 'relation'\n | 'combobox'\n placeholder?: string\n options?: CrudFieldOption[]\n multiple?: boolean\n listbox?: boolean\n // for relation/select style fields; if provided, options are loaded on mount\n loadOptions?: (query?: string) => Promise<CrudFieldOption[]>\n // when type === 'richtext', choose editor implementation\n editor?: 'simple' | 'uiw' | 'html'\n // for text fields; provides datalist suggestions while allowing free-text input\n suggestions?: string[]\n // for combobox fields; allow custom values or restrict to suggestions only\n allowCustomValues?: boolean\n // for combobox fields; hydrate the option map up front so a pre-selected value\n // (typically an FK whose row is not on the first page of `loadOptions`) renders\n // its label without requiring the user to focus the field\n seedOptions?: CrudFieldOption[]\n // for combobox fields; resolve a pre-selected value to its display label when it\n // is not covered by `options`/`seedOptions`/`loadOptions` results (may be async)\n resolveLabel?: (value: string) => string | Promise<string>\n // for text/textarea fields; HTML maxLength + (textarea only) char counter when showCount=true\n maxLength?: number\n // for textarea fields; show character counter (requires maxLength)\n showCount?: boolean\n // for textarea fields; min height in rows\n rows?: number\n // for datetime/time fields\n minuteStep?: number\n minDate?: Date\n maxDate?: Date\n displayFormat?: string\n closeOnSelect?: boolean\n locale?: Locale\n}\n\nexport type CrudCustomFieldRenderProps = {\n id: string\n value: unknown\n error?: string\n autoFocus?: boolean\n disabled?: boolean\n values?: Record<string, unknown>\n setValue: (value: unknown) => void\n // Optional helper to update other form values from within a custom field\n setFormValue?: (id: string, value: unknown) => void\n // Optional context for advanced custom inputs\n entityId?: string\n recordId?: string\n}\n\nexport type CrudCustomField = CrudFieldBase & {\n type: 'custom'\n component: (props: CrudCustomFieldRenderProps) => React.ReactNode\n}\n\nexport type CrudField = CrudBuiltinField | CrudCustomField\n\ntype CrudFormValues<TValues extends Record<string, unknown>> = Partial<TValues> & Record<string, unknown>\n\nexport type CrudFormSubmitContext = {\n submitter?: {\n id?: string\n name?: string\n value?: string\n dataset: Record<string, string>\n }\n}\n\nexport type CrudFormProps<TValues extends Record<string, unknown>> = {\n schema?: z.ZodType<TValues>\n fields: CrudField[]\n initialValues?: Partial<TValues>\n /**\n * When true, suppresses the form's mount-time autofocus entirely.\n * Hosts can keep this enabled while async record data is still loading, then\n * flip it off once the initial values are ready to let the first field gain focus.\n */\n disableInitialFocus?: boolean\n submitLabel?: string\n submitIcon?: React.ComponentType<{ className?: string }>\n formId?: string\n customFieldsLoadingMessage?: string\n cancelHref?: string\n successRedirect?: string\n deleteRedirect?: string\n onSubmit?: (values: TValues, context?: CrudFormSubmitContext) => Promise<void> | void\n onDelete?: () => Promise<void> | void\n // When true, shows Delete button whenever onDelete is provided, even without an id\n deleteVisible?: boolean\n /**\n * OSS opt-in optimistic locking (spec: .ai/specs/implemented/2026-05-25-oss-optimistic-locking.md).\n *\n * When set to a non-empty ISO-8601 string (typically `record.updatedAt`\n * from the API response), the form auto-injects the\n * `x-om-ext-optimistic-lock-expected-updated-at` extension header on\n * every PUT / PATCH / DELETE issued through the underlying `onSubmit` /\n * `onDelete` callbacks (via `withScopedApiRequestHeaders`). When the\n * server-side guard is opted in for the resource and the timestamp is\n * stale, the API responds with a structured 409 conflict body.\n *\n * Strictly additive: when the prop is absent / null / empty, the form\n * behaves exactly as before (no header injected).\n */\n optimisticLockUpdatedAt?: string | null\n /**\n * Opt out of optimistic locking entirely for this form. When `true`, the\n * extension header is never attached, regardless of `optimisticLockUpdatedAt`\n * or the value auto-derived from `initialValues.updatedAt`. Use for forms\n * whose locking is owned elsewhere (e.g. sales document sub-resources guarded\n * at the command layer against the parent aggregate) or for entities without\n * an `updated_at` column.\n */\n disableOptimisticLock?: boolean\n // Legacy field-only grid toggle. Use `groups` for advanced layout.\n twoColumn?: boolean\n title?: string\n backHref?: string\n // Optional extra action buttons rendered next to Delete/Cancel/Save\n // Useful for custom links like \"Show Records\" etc.\n extraActions?: React.ReactNode\n /** When provided, shows a Version History clock icon in the header that opens a side panel. */\n versionHistory?: {\n resourceKind: string\n resourceId: string\n canUndoRedo?: boolean\n autoCheckAcl?: boolean\n }\n // When provided, CrudForm will fetch custom field definitions and append\n // form-editable custom fields automatically to the provided `fields`.\n entityId?: string\n entityIds?: string[]\n // Optional grouped layout rendered in two responsive columns (1 on mobile).\n groups?: CrudFormGroup[]\n // Loading state for the entire form (e.g., when loading record data)\n isLoading?: boolean\n loadingMessage?: string\n // User-defined entity mode: all fields are custom, use bare keys (no cf_)\n customEntity?: boolean\n // Embedded mode hides outer chrome; useful for inline sections\n embedded?: boolean\n // Hide the footer action bar (Save/Cancel/Delete) when embedding in a custom layout\n hideFooterActions?: boolean\n /**\n * Opt-in: track dirty state even when `embedded` is true, AND enable the form's built-in\n * navigation protection (beforeunload, link-click intercept, pushState/replaceState/popstate).\n *\n * Default: false \u2014 preserves pre-existing behavior where embedded forms do not maintain\n * internal unsaved-changes state and leave navigation guarding to the parent page.\n *\n * When enabled, the parent may also subscribe to dirty transitions via `onDirtyChange` to\n * mirror the state in its own UI (disabled save button, header indicators, etc.).\n */\n trackDirtyWhenEmbedded?: boolean\n onDirtyChange?: (dirty: boolean) => void\n // Optional custom content injected between the header actions and the form body\n contentHeader?: React.ReactNode\n readOnly?: boolean\n readOnlyOverlay?: React.ReactNode\n // Optional mapping of entityId -> form value key storing the selected fieldset code\n customFieldsetBindings?: Record<string, { valueKey: string }>\n // Optional injection spot ID for widget injection\n injectionSpotId?: string\n replacementHandle?: string\n // Enable collapsible group headers with localStorage persistence.\n // Pass `true` to enable with auto-generated pageType, or `{ pageType }` for explicit key.\n collapsibleGroups?: boolean | { pageType: string; chevronPosition?: 'left' | 'right' }\n /**\n * Enable drag-and-drop reordering of groups with localStorage persistence.\n * NOTE: Only column-1 groups are sortable. Column-2 (sidebar) groups are fixed\n * by design and always render in their declared order.\n */\n sortableGroups?: boolean | { pageType: string }\n // Lets the host page allow specific internal navigation targets to bypass\n // the unsaved-changes guard (e.g. navigating between sub-pages of the same record).\n // The function receives the resolved internal target (`pathname + search + hash`).\n shouldBypassUnsavedChangesGuard?: (target: string) => boolean\n}\n\n// Group-level custom component context\nexport type CrudFormGroupComponentProps = {\n values: Record<string, unknown>\n setValue: (id: string, v: unknown) => void\n errors: Record<string, string>\n /**\n * Field ids that active injection widgets declare as required (e.g. the SEO\n * helper). Custom group components that render their own labels can use this\n * to show a required marker that appears/disappears with the widget.\n */\n requiredFieldIds?: ReadonlySet<string>\n}\n\n// Special group kind for automatic Custom Fields section\nexport type CrudFormGroup = {\n id: string\n title?: string\n column?: 1 | 2\n description?: string\n // Either list field ids, inline field configs, or mix of both\n fields?: (CrudField | string)[]\n // Inject a custom component into the group card\n component?: (ctx: CrudFormGroupComponentProps) => React.ReactNode\n // When kind === 'customFields', the group renders form-editable custom fields\n kind?: 'customFields'\n // When true, render component output inline without wrapping group chrome\n bare?: boolean\n}\n\nfunction readByDotPath(source: Record<string, unknown> | undefined, path: string): unknown {\n if (!source || !path) return undefined\n if (Object.prototype.hasOwnProperty.call(source, path)) return source[path]\n const segments = path.split('.').filter(Boolean)\n let current: unknown = source\n for (const segment of segments) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\n// Keys that would mutate the prototype chain if used as dot-path segments.\n// Guard against them so a declared field id such as `__proto__.polluted` can\n// never reach into Object.prototype (prototype-pollution hardening).\nconst PROTO_POLLUTING_KEYS = new Set(['__proto__', 'prototype', 'constructor'])\n\nfunction isProtoPollutingKey(key: string): boolean {\n return PROTO_POLLUTING_KEYS.has(key)\n}\n\nfunction writeByDotPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const segments = path.split('.').filter(Boolean)\n if (segments.length === 0) return\n if (segments.some(isProtoPollutingKey)) return\n let current: Record<string, unknown> = target\n for (let index = 0; index < segments.length - 1; index++) {\n const segment = segments[index]\n const existing = current[segment]\n const isSafeObject =\n !!existing &&\n typeof existing === 'object' &&\n !Array.isArray(existing) &&\n (Object.getPrototypeOf(existing) === Object.prototype || Object.getPrototypeOf(existing) === null)\n\n if (!isSafeObject) {\n const created = Object.create(null) as Record<string, unknown>\n current[segment] = created\n current = created\n } else {\n current = existing as Record<string, unknown>\n }\n }\n const finalSegment = segments[segments.length - 1]\n if (isProtoPollutingKey(finalSegment)) return\n current[finalSegment] = value\n}\n\n// Collapse flat dot-path keys (e.g. `metadata.category`) declared as base form\n// fields into the nested object the schema expects (`{ metadata: { category } }`).\n// The flat keys are preserved alongside the nested projection so that forms whose\n// schema declares the flat keys directly keep working \u2014 CrudForm's non-strict\n// schema.safeParse retains whichever representation the schema declares and strips\n// the other. See issue #2503 (\"Latent framework gap\").\nfunction collapseDotPathFields(\n source: Record<string, unknown>,\n dotPathFieldIds: ReadonlySet<string>,\n): Record<string, unknown> {\n if (!dotPathFieldIds.size) return source\n let result: Record<string, unknown> | null = null\n for (const fieldId of dotPathFieldIds) {\n if (!Object.prototype.hasOwnProperty.call(source, fieldId)) continue\n if (!result) result = { ...source }\n writeByDotPath(result, fieldId, source[fieldId])\n }\n return result ?? source\n}\n\nfunction readInitialCustomFieldValue(\n source: Record<string, unknown> | undefined,\n key: string,\n): unknown {\n if (!source || !key) return undefined\n const candidates = [`cf_${key}`, `cf:${key}`, key]\n for (const candidate of candidates) {\n if (Object.prototype.hasOwnProperty.call(source, candidate)) {\n return source[candidate]\n }\n }\n return undefined\n}\n\nfunction readRenderedFieldValue(\n source: Record<string, unknown>,\n fieldId: string,\n): unknown {\n if (Object.prototype.hasOwnProperty.call(source, fieldId)) {\n return source[fieldId]\n }\n if (fieldId.startsWith('cf_')) {\n return readInitialCustomFieldValue(source, fieldId.slice(3))\n }\n if (fieldId.startsWith('cf:')) {\n return readInitialCustomFieldValue(source, fieldId.slice(3))\n }\n return undefined\n}\n\nfunction serializeIssuePath(path: ReadonlyArray<string | number | symbol>): string | null {\n if (!Array.isArray(path) || path.length === 0) return null\n const segments = path\n .map((segment) => {\n if (typeof segment === 'string' || typeof segment === 'number') {\n const normalized = String(segment).trim()\n return normalized.length > 0 ? normalized : null\n }\n return null\n })\n .filter((segment): segment is string => segment !== null)\n return segments.length > 0 ? segments.join('.') : null\n}\n\nfunction normalizeDirtySnapshotValue(value: unknown): unknown {\n if (value === undefined || value === null || value === '') return undefined\n if (Array.isArray(value)) {\n const normalized = value\n .map((entry) => normalizeDirtySnapshotValue(entry))\n .filter((entry) => entry !== undefined)\n return normalized.length ? normalized : undefined\n }\n if (typeof value !== 'object') return value\n\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) return value\n\n const normalized: Record<string, unknown> = {}\n const record = value as Record<string, unknown>\n for (const key of Object.keys(record).sort()) {\n const nextValue = normalizeDirtySnapshotValue(record[key])\n if (nextValue !== undefined) normalized[key] = nextValue\n }\n return Object.keys(normalized).length ? normalized : undefined\n}\n\nfunction createDirtySnapshot(source: Record<string, unknown>): string {\n return JSON.stringify(normalizeDirtySnapshotValue(source) ?? {})\n}\n\nfunction createDirtyValueSnapshot(value: unknown): string {\n return JSON.stringify(normalizeDirtySnapshotValue(value) ?? null)\n}\n\nconst FIELDSET_ICON_COMPONENTS: Record<string, React.ComponentType<{ className?: string }>> = {\n layers: Layers,\n tag: Tag,\n sparkles: Sparkles,\n package: Package,\n shirt: Shirt,\n grid: Grid,\n shoppingBag: ShoppingBag,\n shoppingCart: ShoppingCart,\n store: Store,\n users: Users,\n briefcase: Briefcase,\n building: Building,\n bookOpen: BookOpen,\n bookmark: Bookmark,\n camera: Camera,\n car: Car,\n clock: Clock,\n cloud: Cloud,\n compass: Compass,\n creditCard: CreditCard,\n database: Database,\n flame: Flame,\n gift: Gift,\n globe: Globe,\n heart: Heart,\n key: Key,\n map: MapIcon,\n palette: Palette,\n shield: Shield,\n star: Star,\n truck: Truck,\n zap: Zap,\n coins: Coins,\n}\n\ntype CustomFieldGroupLayout = {\n code: string | null\n label?: string\n hint?: string\n fields: CrudField[]\n}\n\ntype CustomFieldSectionLayout = {\n entityId: string\n fieldsetCode: string | null\n fieldset?: CustomFieldsetDto\n title: string\n description?: string\n groups: CustomFieldGroupLayout[]\n}\n\ntype CustomFieldEntityLayout = {\n entityId: string\n sections: CustomFieldSectionLayout[]\n availableFieldsets: CustomFieldsetDto[]\n singleFieldsetPerRecord: boolean\n hasFieldsets: boolean\n activeFieldset: string | null\n}\n\nclass FieldDefinitionsManagerErrorBoundary extends React.Component<\n { children: React.ReactNode; onClose: () => void; unavailableMessage: string },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode; onClose: () => void; unavailableMessage: string }) {\n super(props)\n this.state = { hasError: false }\n }\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 p-6 text-sm text-muted-foreground\">\n <p>{this.props.unavailableMessage}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={this.props.onClose}>\n Close\n </Button>\n </div>\n )\n }\n return this.props.children\n }\n}\n\nfunction SortableGroupItem({ id, children, disabled }: { id: string; children: React.ReactNode; disabled?: boolean }) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id, disabled })\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n position: 'relative' as const,\n }\n const handleProps = React.useMemo<SortableGroupHandleProps>(() => ({\n ref: setActivatorNodeRef,\n attributes: attributes as unknown as Record<string, unknown>,\n listeners: listeners as unknown as Record<string, unknown> | undefined,\n isDragging,\n disabled: !!disabled,\n }), [setActivatorNodeRef, attributes, listeners, isDragging, disabled])\n return (\n <div ref={setNodeRef} style={style}>\n <SortableGroupHandleProvider value={handleProps}>{children}</SortableGroupHandleProvider>\n </div>\n )\n}\n\nexport function CrudForm<TValues extends Record<string, unknown>>({\n schema,\n fields,\n initialValues,\n disableInitialFocus = false,\n submitLabel,\n submitIcon,\n formId: providedFormId,\n customFieldsLoadingMessage,\n cancelHref,\n successRedirect,\n deleteRedirect,\n onSubmit,\n onDelete,\n deleteVisible,\n optimisticLockUpdatedAt,\n disableOptimisticLock = false,\n twoColumn = false,\n title,\n backHref,\n entityId,\n entityIds,\n groups,\n isLoading = false,\n loadingMessage,\n customEntity = false,\n embedded = false,\n hideFooterActions = false,\n trackDirtyWhenEmbedded = false,\n onDirtyChange,\n extraActions,\n versionHistory,\n contentHeader,\n readOnly = false,\n readOnlyOverlay,\n customFieldsetBindings,\n injectionSpotId,\n replacementHandle,\n collapsibleGroups,\n sortableGroups,\n shouldBypassUnsavedChangesGuard,\n}: CrudFormProps<TValues>) {\n // Ensure module field components are registered (client-side)\n React.useEffect(() => { loadGeneratedFieldRegistrations().catch(() => {}) }, [])\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const t = useT()\n const resolvedSubmitLabel = submitLabel ?? t('ui.forms.actions.save')\n const resolvedLoadingMessage = loadingMessage ?? t('ui.forms.loading')\n const resolvedCustomFieldsLoadingMessage = customFieldsLoadingMessage ?? resolvedLoadingMessage\n const cancelLabel = t('ui.forms.actions.cancel')\n const deleteLabel = t('ui.forms.actions.delete')\n const savingLabel = t('ui.forms.status.saving')\n const backLabel = t('ui.navigation.back')\n const customFieldsLabel = t('entities.customFields.title')\n const fieldsetSelectorLabel = t('entities.customFields.fieldsetSelectorLabel', 'Fieldset')\n const emptyFieldsetMessage = t('entities.customFields.emptyFieldset', 'No fields defined for this fieldset.')\n const defaultFieldsetLabel = t('entities.customFields.defaultFieldset', 'Default')\n const manageFieldsetLabel = t('entities.customFields.manageFieldset', 'Manage fields')\n const fieldsetDialogTitle = t('entities.customFields.manageDialogTitle', 'Edit custom fields')\n const fieldsetDialogUnavailable = t('entities.customFields.manageDialogUnavailable', 'Field definitions page is unavailable.')\n const hasVersionHistory = Boolean(versionHistory?.resourceKind)\n const deleteConfirmMessage = hasVersionHistory\n ? t('ui.forms.confirmDeleteWithUndo', 'Delete this record? You can restore it using version history.')\n : t('ui.forms.confirmDelete')\n const deleteSuccessMessage = t('ui.forms.flash.deleteSuccess')\n const deleteErrorMessage = t('ui.forms.flash.deleteError')\n const saveErrorMessage = t('ui.forms.flash.saveError')\n const internalFormId = React.useId()\n const formId = providedFormId ?? internalFormId\n const formReadOnly = Boolean(readOnly)\n const [values, setValues] = React.useState<CrudFormValues<TValues>>(\n () => ({ ...(initialValues ?? {}) } as CrudFormValues<TValues>)\n )\n const valuesRef = React.useRef(values)\n const [errors, setErrors] = React.useState<Record<string, string>>({})\n const [pending, setPending] = React.useState(false)\n // Synchronous guard against re-entrant submit/delete invocations (e.g. rapid\n // double-clicks of \"Save\" while validation and network IO are still running).\n // React state is async, so `pending` cannot block a click that fires before\n // the next render; a ref flips on the first call and rejects duplicates.\n const submittingRef = React.useRef(false)\n const deletingRef = React.useRef(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const [dynamicOptions, setDynamicOptions] = React.useState<Record<string, CrudFieldOption[]>>({})\n const [cfDefinitions, setCfDefinitions] = React.useState<CustomFieldDefDto[]>([])\n const [cfMetadata, setCfMetadata] = React.useState<CustomFieldDefinitionsPayload | null>(null)\n const [cfFieldsetSelections, setCfFieldsetSelections] = React.useState<Record<string, string | null>>({})\n const [isLoadingCustomFields, setIsLoadingCustomFields] = React.useState(false)\n const [customFieldDefsVersion, setCustomFieldDefsVersion] = React.useState(0)\n const [fieldsetEditorTarget, setFieldsetEditorTarget] = React.useState<{ entityId: string; fieldsetCode: string | null; view: 'entity' | 'fieldset' } | null>(null)\n const [isInDialog, setIsInDialog] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n\n // Collapsible groups support\n const collapsibleGroupsEnabled = Boolean(collapsibleGroups)\n const collapsiblePageType = typeof collapsibleGroups === 'object' ? collapsibleGroups.pageType : formId\n const collapsibleChevronPosition = typeof collapsibleGroups === 'object' ? collapsibleGroups.chevronPosition : undefined\n const groupCollapseRefs = React.useRef(new Map<string, CollapsibleGroupHandle>())\n\n // Sortable groups support\n const sortableGroupsEnabled = Boolean(sortableGroups)\n const sortablePageType = typeof sortableGroups === 'object' ? sortableGroups.pageType : formId\n const fieldsetManagerRef = React.useRef<FieldDefinitionsManagerHandle | null>(null)\n const resolvedEntityIdsKey = React.useMemo(() => buildResolvedEntityIdsKey(entityId, entityIds), [entityId, entityIds])\n const resolvedEntityIds = React.useMemo(\n () => (resolvedEntityIdsKey ? resolvedEntityIdsKey.split('\\0') : []),\n [resolvedEntityIdsKey],\n )\n const primaryEntityId = resolvedEntityIds.length ? resolvedEntityIds[0] : null\n\n // Injection spot events for widget lifecycle management\n const resolvedInjectionSpotId = React.useMemo(() => {\n if (injectionSpotId) return injectionSpotId\n if (resolvedEntityIds.length) {\n const normalized = resolvedEntityIds[0].replace(/[:]+/g, '.')\n return `crud-form:${normalized}`\n }\n return undefined\n }, [injectionSpotId, resolvedEntityIds])\n const resolvedReplacementHandle = React.useMemo(() => {\n if (replacementHandle) return replacementHandle\n if (resolvedEntityIds.length) return ComponentReplacementHandles.crudForm(resolvedEntityIds[0].replace(/[:]+/g, '.'))\n return ComponentReplacementHandles.crudForm('unknown')\n }, [replacementHandle, resolvedEntityIds])\n const headerInjectionSpotId = resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:header` : undefined\n \n const recordId = React.useMemo(() => {\n const raw = values.id\n if (typeof raw === 'string') return raw\n if (typeof raw === 'number') return String(raw)\n return undefined\n }, [values])\n const fallbackRecordId = recordId || (\n versionHistory?.resourceId === undefined || versionHistory.resourceId === null\n ? undefined\n : String(versionHistory.resourceId).trim() || undefined\n )\n\n const operation = recordId ? 'update' : 'create'\n\n // Resolve the optimistic-lock version used to build the extension header.\n // Explicit `optimisticLockUpdatedAt` (including `null`) always wins. When the\n // prop is absent, auto-derive from the loaded record's `updatedAt`/`updated_at`\n // so every edit CrudForm enforces optimistic locking by default without\n // per-form wiring. Presence of a loaded `updatedAt` \u2014 NOT the create/update\n // heuristic \u2014 drives this: some edit pages keep the record id outside form\n // values (so `operation` reads as `create`), while a genuine create has no\n // `updatedAt` in `initialValues`. Even a \"duplicate\"-style create that carries\n // one is harmless \u2014 the server ignores the header on inserts (no candidate id).\n // `disableOptimisticLock` always wins; an explicit prop (incl. `null`) wins next.\n const resolvedOptimisticLockUpdatedAt = React.useMemo<string | null | undefined>(() => {\n if (disableOptimisticLock) return null\n if (optimisticLockUpdatedAt !== undefined) return optimisticLockUpdatedAt\n const source = initialValues as Record<string, unknown> | undefined\n const camel = source?.updatedAt\n if (typeof camel === 'string' && camel.length > 0) return camel\n const snake = source?.updated_at\n if (typeof snake === 'string' && snake.length > 0) return snake\n return null\n }, [disableOptimisticLock, optimisticLockUpdatedAt, initialValues])\n\n const injectionContext = React.useMemo(() => ({\n formId,\n entityId: primaryEntityId,\n resourceKind: versionHistory?.resourceKind,\n resourceId: recordId ?? versionHistory?.resourceId,\n recordId: fallbackRecordId,\n isLoading,\n pending,\n operation,\n }), [formId, primaryEntityId, versionHistory?.resourceKind, versionHistory?.resourceId, recordId, fallbackRecordId, isLoading, pending, operation])\n const injectionContextRef = React.useRef(injectionContext)\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n React.useEffect(() => {\n valuesRef.current = values\n }, [values])\n\n const isDirtyRef = React.useRef(false)\n const navigationPromptBypassRef = React.useRef(false)\n const navigationConfirmPendingRef = React.useRef(false)\n const submitNavigationBypassRef = React.useRef(false)\n const submitNavigationBypassTimeoutRef = React.useRef<number | null>(null)\n const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false)\n const popStateRollbackRef = React.useRef(false)\n const shouldBypassUnsavedChangesGuardRef = React.useRef(shouldBypassUnsavedChangesGuard)\n React.useEffect(() => {\n shouldBypassUnsavedChangesGuardRef.current = shouldBypassUnsavedChangesGuard\n }, [shouldBypassUnsavedChangesGuard])\n\n React.useEffect(() => {\n // Preserve pre-existing behavior: embedded forms do not track dirty state by default.\n // Opt-in via `trackDirtyWhenEmbedded` when the parent actually needs the callback.\n if (embedded && !trackDirtyWhenEmbedded) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const snapshot = dirtyBaselineSnapshotRef.current\n if (!snapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const currentSnapshot = createDirtySnapshot(values as Record<string, unknown>)\n const dirty = currentSnapshot !== snapshot\n isDirtyRef.current = dirty\n setHasUnsavedChanges(dirty)\n }, [embedded, trackDirtyWhenEmbedded, values])\n\n React.useEffect(() => {\n onDirtyChange?.(hasUnsavedChanges)\n }, [hasUnsavedChanges, onDirtyChange])\n\n const allowNextNavigation = React.useCallback(() => {\n navigationPromptBypassRef.current = true\n if (typeof window !== 'undefined') {\n window.setTimeout(() => {\n navigationPromptBypassRef.current = false\n }, 0)\n }\n }, [])\n\n const clearSubmitNavigationBypass = React.useCallback(() => {\n submitNavigationBypassRef.current = false\n if (typeof window !== 'undefined' && submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n submitNavigationBypassTimeoutRef.current = null\n }\n }, [])\n\n const keepSubmitNavigationBypassAlive = React.useCallback(() => {\n if (typeof window === 'undefined') return\n submitNavigationBypassRef.current = true\n if (submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n }\n submitNavigationBypassTimeoutRef.current = window.setTimeout(() => {\n submitNavigationBypassRef.current = false\n submitNavigationBypassTimeoutRef.current = null\n }, 1500)\n }, [])\n\n React.useEffect(() => {\n return () => {\n clearSubmitNavigationBypass()\n }\n }, [clearSubmitNavigationBypass])\n\n const clearDirtyState = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n const source = snapshotSource ?? (valuesRef.current as Record<string, unknown>)\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(source)\n dirtyBaselineValuesRef.current = { ...source }\n userEditedFieldIdsRef.current.clear()\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n }, [])\n\n const confirmUnsavedChanges = React.useCallback(async (): Promise<boolean> => {\n if (!isDirtyRef.current || typeof window === 'undefined') return true\n if (navigationPromptBypassRef.current || submitNavigationBypassRef.current) return true\n if (navigationConfirmPendingRef.current) return false\n navigationConfirmPendingRef.current = true\n try {\n const confirmed = await confirm({\n title: t('ui.forms.confirmUnsavedChanges', 'You have unsaved changes. Are you sure you want to leave?'),\n })\n if (confirmed) allowNextNavigation()\n return confirmed\n } finally {\n navigationConfirmPendingRef.current = false\n }\n }, [allowNextNavigation, confirm, t])\n\n React.useEffect(() => {\n // Navigation protection runs when the form is tracking dirty state.\n // Embedded hosts must opt in via `trackDirtyWhenEmbedded` so parent pages that manage\n // their own protection (or have none by design) keep their pre-existing behavior.\n if ((embedded && !trackDirtyWhenEmbedded) || !hasUnsavedChanges) return\n const beforeUnloadHandler = (event: BeforeUnloadEvent) => {\n if (!isDirtyRef.current || submitNavigationBypassRef.current) return\n event.preventDefault()\n event.returnValue = ''\n }\n window.addEventListener('beforeunload', beforeUnloadHandler)\n\n const clickHandler = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (!isDirtyRef.current) return\n const anchor = (event.target as HTMLElement)?.closest?.('a[href]') as HTMLAnchorElement | null\n if (!anchor) return\n const href = anchor.getAttribute('href')\n if (!href || href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:')) return\n if (anchor.target === '_blank' || event.metaKey || event.ctrlKey || event.shiftKey) return\n const target = resolveInternalNavigationTarget(href)\n if (!target) return\n if (shouldBypassUnsavedChangesGuardRef.current?.(target)) return\n const baselineSnapshot = dirtyBaselineSnapshotRef.current\n if (baselineSnapshot && createDirtySnapshot(valuesRef.current as Record<string, unknown>) === baselineSnapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n event.preventDefault()\n event.stopPropagation()\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n router.push(target)\n })\n }\n document.addEventListener('click', clickHandler, true)\n\n const originalPushState = window.history.pushState.bind(window.history)\n const originalReplaceState = window.history.replaceState.bind(window.history)\n\n const createHistoryInterceptor = (original: History['pushState']): History['pushState'] =>\n ((data: unknown, unused: string, url?: string | URL | null) => {\n const target = resolveInternalNavigationTarget(url ?? null)\n if (!target || navigationPromptBypassRef.current || submitNavigationBypassRef.current) {\n return original(data, unused, url)\n }\n if (!isDirtyRef.current) {\n return original(data, unused, url)\n }\n if (shouldBypassUnsavedChangesGuardRef.current?.(target)) {\n return original(data, unused, url)\n }\n const baselineSnapshot = dirtyBaselineSnapshotRef.current\n if (baselineSnapshot && createDirtySnapshot(valuesRef.current as Record<string, unknown>) === baselineSnapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return original(data, unused, url)\n }\n if (navigationConfirmPendingRef.current) {\n return undefined\n }\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n original(data, unused, url)\n })\n return undefined\n }) as History['pushState']\n\n const popStateHandler = () => {\n if (popStateRollbackRef.current) {\n popStateRollbackRef.current = false\n return\n }\n if (!isDirtyRef.current || navigationPromptBypassRef.current || submitNavigationBypassRef.current) return\n popStateRollbackRef.current = true\n window.history.go(1)\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n allowNextNavigation()\n window.history.back()\n })\n }\n\n window.history.pushState = createHistoryInterceptor(originalPushState)\n window.history.replaceState = createHistoryInterceptor(originalReplaceState)\n window.addEventListener('popstate', popStateHandler)\n\n return () => {\n window.removeEventListener('beforeunload', beforeUnloadHandler)\n document.removeEventListener('click', clickHandler, true)\n window.removeEventListener('popstate', popStateHandler)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [allowNextNavigation, clearDirtyState, confirmUnsavedChanges, embedded, hasUnsavedChanges, router, trackDirtyWhenEmbedded])\n\n const { widgets: injectionWidgets } = useInjectionWidgets(resolvedInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const { widgets: injectedFieldWidgets } = useInjectionDataWidgets(\n resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:fields` : '__disabled__:fields'\n )\n \n const { triggerEvent: triggerInjectionEvent } = useInjectionSpotEvents(resolvedInjectionSpotId ?? '', injectionWidgets)\n const extendedInjectionEventsEnabled = CRUDFORM_EXTENDED_EVENTS_ENABLED && Boolean(resolvedInjectionSpotId)\n\n // Fields that active injection widgets declare as required (e.g. the SEO helper\n // enforcing a description). The host renders a visual required marker for these;\n // enforcement stays in the widget's own onBeforeSave validation.\n const widgetRequiredFieldIds = React.useMemo(() => {\n const ids = new Set<string>()\n for (const widget of injectionWidgets ?? []) {\n const metadata = widget.module?.metadata\n if (!metadata || metadata.enabled === false) continue\n for (const fieldId of metadata.requiredFields ?? []) ids.add(fieldId)\n }\n return ids\n }, [injectionWidgets])\n\n const transformValidationErrors = React.useCallback(\n async (fieldErrors: Record<string, string>): Promise<Record<string, string>> => {\n if (!extendedInjectionEventsEnabled || !Object.keys(fieldErrors).length) return fieldErrors\n try {\n const result = await triggerInjectionEvent(\n 'transformValidation',\n fieldErrors as unknown as TValues,\n injectionContextRef.current,\n { originalData: valuesRef.current as TValues },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) return fieldErrors\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([key, value]) => [key, String(value)]),\n )\n } catch (err) {\n console.error('[CrudForm] Error in transformValidation:', err)\n return fieldErrors\n }\n },\n [extendedInjectionEventsEnabled, triggerInjectionEvent],\n )\n\n const translateValidationMessage = React.useCallback(\n (message: string | null | undefined): string => {\n if (typeof message !== 'string') return ''\n const trimmed = message.trim()\n if (!trimmed) return ''\n return t(trimmed, trimmed)\n },\n [t],\n )\n\n const translateValidationErrors = React.useCallback(\n (fieldErrors: Record<string, string>): Record<string, string> =>\n Object.fromEntries(\n Object.entries(fieldErrors).map(([fieldId, message]) => [fieldId, translateValidationMessage(message)]),\n ),\n [translateValidationMessage],\n )\n\n const mapDefsForValidation = React.useCallback(\n (definitions: CustomFieldDefDto[]): CustomFieldDefLike[] =>\n definitions.map((definition) => ({\n key: definition.key,\n kind: definition.kind,\n configJson: {\n validation: Array.isArray(definition.validation) ? definition.validation : [],\n },\n })),\n [],\n )\n\n const canNavigateTo = React.useCallback(\n async (target: string): Promise<boolean> => {\n if (!extendedInjectionEventsEnabled) return true\n try {\n const result = await triggerInjectionEvent(\n 'onBeforeNavigate',\n valuesRef.current as TValues,\n injectionContextRef.current,\n { target },\n )\n if (!result.ok) {\n flash(result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return false\n }\n return true\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return false\n }\n },\n [extendedInjectionEventsEnabled, t, triggerInjectionEvent],\n )\n\n const navigateWithGuard = React.useCallback(\n async (target: string) => {\n if (!target) return\n const allowed = await canNavigateTo(target)\n if (allowed) {\n allowNextNavigation()\n router.push(target)\n }\n },\n [allowNextNavigation, canNavigateTo, router],\n )\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof window === 'undefined') return\n const handleEvent = (event: Event) => {\n const customEvent = event as CustomEvent<unknown>\n void triggerInjectionEvent('onAppEvent', valuesRef.current as TValues, injectionContextRef.current, {\n appEvent: customEvent.detail,\n }).catch((err) => {\n console.error('[CrudForm] Error in onAppEvent:', err)\n })\n }\n window.addEventListener('om:event', handleEvent as EventListener)\n return () => {\n window.removeEventListener('om:event', handleEvent as EventListener)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof document === 'undefined') return\n const emitVisibility = () => {\n void triggerInjectionEvent('onVisibilityChange', valuesRef.current as TValues, injectionContextRef.current, {\n visible: document.visibilityState === 'visible',\n }).catch((err) => {\n console.error('[CrudForm] Error in onVisibilityChange:', err)\n })\n }\n document.addEventListener('visibilitychange', emitVisibility)\n emitVisibility()\n return () => {\n document.removeEventListener('visibilitychange', emitVisibility)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled) return\n const root = rootRef.current\n if (!root || typeof window === 'undefined') return\n const handleClickCapture = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n const targetElement = event.target instanceof Element ? event.target : null\n const linkElement = targetElement?.closest('a[href]')\n if (!(linkElement instanceof HTMLAnchorElement)) return\n if (!root.contains(linkElement)) return\n if (linkElement.target && linkElement.target !== '_self') return\n const rawHref = linkElement.getAttribute('href')\n if (!rawHref || rawHref.startsWith('#')) return\n let target = rawHref\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://')) {\n try {\n const parsed = new URL(rawHref)\n if (parsed.origin !== window.location.origin) return\n target = `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return\n }\n } else if (!rawHref.startsWith('/')) {\n return\n }\n event.preventDefault()\n void navigateWithGuard(target)\n }\n root.addEventListener('click', handleClickCapture, true)\n return () => {\n root.removeEventListener('click', handleClickCapture, true)\n }\n }, [extendedInjectionEventsEnabled, navigateWithGuard])\n \n React.useEffect(() => {\n const root = rootRef.current\n if (!root) return\n setIsInDialog(Boolean(root.closest('[data-dialog-content]')))\n }, [])\n const dialogFooterClass = isInDialog\n ? 'sticky bottom-0 left-0 right-0 z-20 -mx-6 px-6 bg-card border-t border-border/70 py-2 sm:-mx-6 sm:px-6'\n : ''\n // No bottom padding on the dialog form. The previous `pb-20` left an 80px gap below\n // the sticky footer in every dialog whose content fit the viewport (the form sized to\n // content + 80px with the footer as its last child) \u2014 visible as empty white space at\n // the bottom of Quick deal, Add stage, Activity composer, etc. The sticky footer\n // handles the overflow case on its own: when content scrolls, the footer stays pinned\n // to the dialog's bottom and the user can scroll fields above it.\n const dialogFormPadding = ''\n\n const buildCustomFieldsManageHref = React.useCallback(\n (targetEntityId: string | null) => {\n if (!targetEntityId) return null\n try {\n const encoded = encodeURIComponent(targetEntityId)\n return customEntity ? `/backend/entities/user/${encoded}` : `/backend/entities/system/${encoded}`\n } catch {\n return null\n }\n },\n [customEntity],\n )\n\n const refreshCustomFieldDefinitions = React.useCallback(() => {\n setCustomFieldDefsVersion((prev) => prev + 1)\n }, [])\n\n // Unified delete handler with confirmation\n const handleDelete = React.useCallback(async () => {\n if (!onDelete) return\n if (deletingRef.current) return\n deletingRef.current = true\n const deletePayload = values as TValues\n try {\n const confirmed = await confirm({\n title: deleteConfirmMessage,\n variant: 'destructive',\n })\n if (!confirmed) return\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeDelete', deletePayload, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n setPending(true)\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n const optimisticLockHeader = buildOptimisticLockHeader(resolvedOptimisticLockUpdatedAt)\n const mergedDeleteHeaders = {\n ...(injectionRequestHeaders ?? {}),\n ...optimisticLockHeader,\n }\n if (Object.keys(mergedDeleteHeaders).length > 0) {\n await withScopedApiRequestHeaders(mergedDeleteHeaders, async () => {\n await onDelete()\n })\n } else {\n await onDelete()\n }\n\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterDelete:', err)\n }\n }\n try { flash(deleteSuccessMessage, 'success') } catch {}\n // Redirect if requested by caller\n if (typeof deleteRedirect === 'string' && deleteRedirect) {\n await navigateWithGuard(deleteRedirect)\n }\n } catch (err) {\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDeleteError', deletePayload, injectionContext, { error: err })\n } catch (hookError) {\n console.error('[CrudForm] Error in onDeleteError:', hookError)\n }\n }\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const optimisticLockConflict = extractOptimisticLockConflict(err)\n if (optimisticLockConflict) {\n // Surface on the unified, persistent conflict bar instead of a toast.\n try { surfaceRecordConflict(err, t) } catch {}\n } else {\n const message = err instanceof Error && err.message ? err.message : deleteErrorMessage\n try { flash(message, 'error') } catch {}\n }\n } finally {\n deletingRef.current = false\n setPending(false)\n }\n }, [\n confirm,\n deleteConfirmMessage,\n deleteErrorMessage,\n deleteRedirect,\n deleteSuccessMessage,\n formId,\n injectionContext,\n onDelete,\n resolvedInjectionSpotId,\n navigateWithGuard,\n t,\n transformValidationErrors,\n triggerInjectionEvent,\n values,\n ])\n \n // Determine whether this form is creating a new record (no `id` yet)\n const isNewRecord = React.useMemo(() => {\n const rawId = values.id\n if (rawId === undefined || rawId === null) return true\n return typeof rawId === 'string' ? rawId.trim().length === 0 : false\n }, [values])\n const showDelete = Boolean(onDelete) && (typeof deleteVisible === 'boolean' ? deleteVisible : !isNewRecord)\n const versionHistoryEnabled = Boolean(versionHistory?.resourceId && String(versionHistory.resourceId).trim().length > 0)\n const versionHistoryAction = (\n <VersionHistoryAction\n config={versionHistoryEnabled ? versionHistory! : null}\n t={t}\n canUndoRedo={versionHistory?.canUndoRedo}\n autoCheckAcl={versionHistory?.autoCheckAcl}\n />\n )\n const headerInjectionAction = headerInjectionSpotId ? (\n <InjectionSpot\n spotId={headerInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ) : null\n const headerExtraActions = versionHistoryEnabled || headerInjectionAction || extraActions ? (\n <>\n {versionHistoryEnabled ? versionHistoryAction : null}\n {headerInjectionAction}\n {extraActions}\n </>\n ) : undefined\n\n // Auto-append custom fields for this entityId\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n if (!resolvedEntityIds.length) { \n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n return \n }\n \n setIsLoadingCustomFields(true)\n try {\n const mod = await import('./utils/customFieldForms')\n const { definitions, metadata } = await mod.fetchCustomFieldFormStructure(resolvedEntityIds, undefined, { bareIds: customEntity })\n if (!cancelled) {\n setCfDefinitions(definitions)\n setCfMetadata(metadata)\n setCfFieldsetSelections((prev) => {\n const next: Record<string, string | null> = {}\n let changed = false\n resolvedEntityIds.forEach((entityId) => {\n const existing = prev[entityId]\n const fieldsets = metadata.fieldsetsByEntity?.[entityId] ?? []\n const defaultSelection = fieldsets[0]?.code ?? null\n const value = existing !== undefined ? existing : defaultSelection\n next[entityId] = value\n if (existing !== value) changed = true\n })\n if (Object.keys(prev).length !== Object.keys(next).length) changed = true\n return changed ? next : prev\n })\n setIsLoadingCustomFields(false)\n }\n } catch {\n if (!cancelled) {\n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n }\n }\n }\n load()\n return () => { cancelled = true }\n }, [resolvedEntityIds, customEntity, customFieldDefsVersion])\n\n React.useEffect(() => {\n if (!customFieldsetBindings) return\n setCfFieldsetSelections((prev) => {\n let changed = false\n const next = { ...prev }\n resolvedEntityIds.forEach((entityId) => {\n const binding = customFieldsetBindings[entityId]\n if (!binding) return\n const raw = values[binding.valueKey]\n if (typeof raw === 'string' && raw.trim().length > 0) {\n const normalized = raw.trim()\n if (next[entityId] !== normalized) {\n next[entityId] = normalized\n changed = true\n }\n }\n })\n return changed ? next : prev\n })\n }, [customFieldsetBindings, resolvedEntityIds, values])\n\n const fieldsetsByEntity = cfMetadata?.fieldsetsByEntity ?? {}\n const entitySettings = cfMetadata?.entitySettings ?? {}\n\n const { cfFields, customFieldLayout } = React.useMemo(() => {\n if (!cfDefinitions.length) return { cfFields: [], customFieldLayout: [] as CustomFieldEntityLayout[] }\n const aggregated: CrudField[] = []\n const layout: CustomFieldEntityLayout[] = []\n const defsByEntity = new globalThis.Map<string, CustomFieldDefDto[]>()\n cfDefinitions.forEach((def) => {\n const entityId = typeof def.entityId === 'string' && def.entityId.trim().length\n ? def.entityId.trim()\n : resolvedEntityIds[0]\n if (!entityId) return\n const bucket = defsByEntity.get(entityId) ?? []\n bucket.push(def)\n defsByEntity.set(entityId, bucket)\n })\n\n const buildSection = (\n entityId: string,\n fieldsetCode: string | null,\n defList: CustomFieldDefDto[],\n fieldset?: CustomFieldsetDto,\n ): CustomFieldSectionLayout | null => {\n if (!defList.length) return null\n const groupsMap = new globalThis.Map<string, CustomFieldGroupLayout>()\n const order: string[] = []\n const fieldsetGroupMap = new globalThis.Map<string, { title?: string; hint?: string; code: string }>()\n if (Array.isArray(fieldset?.groups)) {\n fieldset.groups.forEach((group) => {\n if (!group?.code) return\n fieldsetGroupMap.set(group.code, { code: group.code, title: group.title, hint: group.hint })\n })\n }\n const sortedDefs = [...defList]\n .filter((definition) => isDefVisible(definition, 'form'))\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n const ensureBucket = (code: string | null, def: CustomFieldDefDto): CustomFieldGroupLayout => {\n const key = code ?? '__default__'\n let bucket = groupsMap.get(key)\n if (!bucket) {\n const fallbackMeta = code ? fieldsetGroupMap.get(code) : undefined\n const directMeta = code ? def.group : undefined\n const label =\n code === null\n ? undefined\n : directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || code\n const hint = directMeta?.hint || fallbackMeta?.hint\n bucket = { code, label, hint, fields: [] }\n groupsMap.set(key, bucket)\n order.push(key)\n } else if (code && !bucket.label) {\n const fallbackMeta = fieldsetGroupMap.get(code)\n const directMeta = def.group ?? undefined\n bucket.label = directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || bucket.label\n bucket.hint = directMeta?.hint || fallbackMeta?.hint || bucket.hint\n }\n return bucket\n }\n sortedDefs.forEach((definition) => {\n const field = buildFormFieldFromCustomFieldDef(definition, { bareIds: customEntity })\n if (!field) return\n aggregated.push(field)\n const bucket = ensureBucket(definition.group?.code ?? null, definition)\n bucket.fields.push(field)\n })\n const groups = order\n .map((key) => groupsMap.get(key)!)\n .filter((group) => group.fields.length > 0)\n if (!groups.length) return null\n return {\n entityId,\n fieldsetCode,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups,\n }\n }\n\n const entityIds = resolvedEntityIds.length ? resolvedEntityIds : Array.from(defsByEntity.keys())\n entityIds.forEach((entityId) => {\n const defsForEntity = defsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) return\n const availableFieldsets = fieldsetsByEntity[entityId] ?? []\n const hasFieldsets = availableFieldsets.length > 0\n const singleFieldsetPerRecord =\n entitySettings[entityId]?.singleFieldsetPerRecord !== false\n const defsByFieldset = new globalThis.Map<string | null, CustomFieldDefDto[]>()\n defsForEntity.forEach((def) => {\n const memberships = Array.isArray(def.fieldsets)\n ? def.fieldsets\n .filter((entry): entry is string => typeof entry === 'string')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : []\n if (memberships.length > 0) {\n memberships.forEach((code) => {\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n return\n }\n const code = typeof def.fieldset === 'string' && def.fieldset.trim().length > 0 ? def.fieldset.trim() : null\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n const sections: CustomFieldSectionLayout[] = []\n\n const createEmptySection = (code: string | null): CustomFieldSectionLayout => {\n const fieldset = code ? availableFieldsets.find((fs) => fs.code === code) : undefined\n return {\n entityId,\n fieldsetCode: code,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups: [],\n }\n }\n\n if (!hasFieldsets) {\n const fallbackDefs =\n defsByFieldset.get(null) ?? Array.from(defsByFieldset.values()).flat()\n const section = buildSection(entityId, null, fallbackDefs, undefined)\n if (section) sections.push(section)\n } else if (singleFieldsetPerRecord) {\n const availableCodes = availableFieldsets.map((fs) => fs.code)\n const activeFieldset =\n cfFieldsetSelections[entityId] && availableCodes.includes(cfFieldsetSelections[entityId]!)\n ? cfFieldsetSelections[entityId]\n : availableFieldsets[0]?.code ?? null\n const targetDefs = activeFieldset ? defsByFieldset.get(activeFieldset) ?? [] : defsByFieldset.get(null) ?? []\n const targetSection = activeFieldset\n ? buildSection(\n entityId,\n activeFieldset,\n targetDefs,\n availableFieldsets.find((fs) => fs.code === activeFieldset),\n )\n : buildSection(entityId, null, targetDefs, undefined)\n if (targetSection) {\n sections.push(targetSection)\n } else if (activeFieldset) {\n sections.push(createEmptySection(activeFieldset))\n }\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length && activeFieldset) {\n const generalSection = buildSection(entityId, null, unassigned, undefined)\n if (generalSection) sections.push(generalSection)\n }\n } else {\n availableFieldsets.forEach((fieldset) => {\n const list = defsByFieldset.get(fieldset.code) ?? []\n const section = buildSection(entityId, fieldset.code, list, fieldset)\n if (section) sections.push(section)\n })\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length) {\n const section = buildSection(entityId, null, unassigned, undefined)\n if (section) sections.push(section)\n }\n }\n\n if (!sections.length && hasFieldsets) {\n const fallbackCode = availableFieldsets[0]?.code ?? null\n sections.push(createEmptySection(fallbackCode))\n }\n\n layout.push({\n entityId,\n sections,\n availableFieldsets,\n singleFieldsetPerRecord,\n hasFieldsets,\n activeFieldset: cfFieldsetSelections[entityId] ?? availableFieldsets[0]?.code ?? null,\n })\n })\n\n return { cfFields: aggregated, customFieldLayout: layout }\n }, [\n cfDefinitions,\n cfFieldsetSelections,\n customEntity,\n customFieldsLabel,\n entitySettings,\n fieldsetsByEntity,\n resolvedEntityIds,\n ])\n\n const injectedFieldDefinitions = React.useMemo<InjectionFieldDefinition[]>(() => {\n const definitions: InjectionFieldDefinition[] = []\n for (const widget of injectedFieldWidgets) {\n if (!('fields' in widget)) continue\n for (const field of widget.fields ?? []) {\n definitions.push(field as InjectionFieldDefinition)\n }\n }\n return definitions\n }, [injectedFieldWidgets])\n\n const injectedFieldContext = React.useMemo<FieldContext>(() => {\n const recordValues = values as Record<string, unknown>\n const organizationId = typeof recordValues.organizationId === 'string' ? recordValues.organizationId : null\n const tenantId = typeof recordValues.tenantId === 'string' ? recordValues.tenantId : null\n const userId = typeof recordValues.userId === 'string' ? recordValues.userId : null\n return {\n organizationId,\n tenantId,\n userId,\n record: recordValues,\n }\n }, [values])\n\n const hiddenBaseFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n const recordValues = values as Record<string, unknown>\n for (const field of fields) {\n if (!evaluateFieldVisibility(field.visibleWhen, recordValues)) {\n hidden.add(field.id)\n }\n }\n return hidden\n }, [fields, values])\n\n const hiddenInjectedFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n for (const definition of injectedFieldDefinitions) {\n if (!evaluateInjectedVisibility(definition.visibleWhen, values as Record<string, unknown>, injectedFieldContext)) {\n hidden.add(definition.id)\n }\n }\n return hidden\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n const injectedFieldIdSet = React.useMemo(\n () => new Set(injectedFieldDefinitions.map((definition) => definition.id)),\n [injectedFieldDefinitions],\n )\n\n const injectedCrudFields = React.useMemo<CrudField[]>(() => {\n return injectedFieldDefinitions.map((definition) => ({\n id: definition.id,\n label: definition.label,\n type: 'custom',\n readOnly: definition.readOnly,\n component: ({ value, setValue, values: formValues }) => (\n <InjectedField\n field={definition}\n value={value}\n onChange={(_, nextValue) => setValue(nextValue)}\n context={injectedFieldContext}\n formData={(formValues ?? values) as Record<string, unknown>}\n />\n ),\n }))\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n\n const allFields = React.useMemo(() => {\n const base = [...fields, ...injectedCrudFields]\n\n if (groups) {\n const provided = new Set(base.map(f => f.id))\n for (const group of groups) {\n if (!group.fields) continue\n for (const entry of group.fields) {\n if (typeof entry === 'string') continue\n if (!provided.has(entry.id)) {\n provided.add(entry.id)\n base.push(entry)\n }\n }\n }\n }\n if (!cfFields.length) return base\n const provided = new Set(base.map(f => f.id))\n const extras = cfFields.filter(f => !provided.has(f.id))\n return [...base, ...extras]\n }, [fields, injectedCrudFields, cfFields, groups])\n\n const fieldById = React.useMemo(() => {\n return new globalThis.Map(allFields.map((f) => [f.id, f]))\n }, [allFields])\n\n // Declared base fields whose id is a dot-path (e.g. `metadata.category`).\n // Injected and custom (cf) fields already get dot-path/cf-path hydration and\n // are excluded here so their dedicated handling is preserved. CrudForm hydrates\n // these flat keys from nested initial values on load and projects them back into\n // nested objects before schema.safeParse on submit. See issue #2503.\n const dotPathBaseFieldIds = React.useMemo(() => {\n const ids = new Set<string>()\n const cfFieldIds = new Set(cfFields.map((field) => field.id))\n for (const field of allFields) {\n const fieldId = field.id\n if (!fieldId.includes('.')) continue\n if (injectedFieldIdSet.has(fieldId)) continue\n if (fieldId.startsWith('cf_') || fieldId.startsWith('cf:')) continue\n if (cfFieldIds.has(fieldId)) continue\n ids.add(fieldId)\n }\n return ids\n }, [allFields, injectedFieldIdSet, cfFields])\n\n const validateFieldOnBlur = React.useCallback(async (\n fieldId: string,\n sourceValues?: CrudFormValues<TValues>,\n ) => {\n if (formReadOnly) return\n const field = fieldById.get(fieldId)\n if (!field || field.disabled) return\n if (hiddenBaseFieldIds.has(fieldId) || hiddenInjectedFieldIds.has(fieldId)) return\n\n const nextValues = sourceValues ?? valuesRef.current\n const nextFieldErrors: Record<string, string> = {}\n const requiredMessage = t('ui.forms.errors.required')\n const value = nextValues[fieldId]\n const isArray = Array.isArray(value)\n const isString = typeof value === 'string'\n const empty =\n value === undefined ||\n value === null ||\n (isString && value.trim() === '') ||\n (isArray && value.length === 0) ||\n (field.type === 'checkbox' && value !== true)\n\n if (field.required && empty) {\n nextFieldErrors[fieldId] = requiredMessage\n }\n\n const customFieldKey = customEntity\n ? cfDefinitions.some((definition) => definition.key === fieldId)\n ? fieldId\n : null\n : fieldId.startsWith('cf_')\n ? fieldId.replace(/^cf_/, '')\n : null\n\n if (!Object.keys(nextFieldErrors).length && customFieldKey) {\n const defsForField = cfDefinitions.filter((definition) => definition.key === customFieldKey)\n if (defsForField.length) {\n try {\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n const validationResult = validateValuesAgainstDefs(\n { [customFieldKey]: value },\n mapDefsForValidation(defsForField),\n )\n if (!validationResult.ok) {\n const normalizedFieldErrors = customEntity\n ? Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [\n key.replace(/^cf_/, ''),\n String(message),\n ]),\n )\n : Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [key, String(message)]),\n )\n const transformedErrors = await transformValidationErrors(normalizedFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n } catch {\n // ignore client-side custom field validation if helper is unavailable\n }\n }\n }\n\n if (!Object.keys(nextFieldErrors).length && schema) {\n const widgetValues = { ...(nextValues as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n const result = schema.safeParse(collapseDotPathFields(coreValues, dotPathBaseFieldIds))\n if (!result.success) {\n const schemaFieldErrors: Record<string, string> = {}\n result.error.issues.forEach((issue) => {\n const path = serializeIssuePath(issue.path)\n if (!path) return\n if (\n path === fieldId ||\n path.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${path}.`)\n ) {\n schemaFieldErrors[path] = issue.message\n }\n })\n if (Object.keys(schemaFieldErrors).length) {\n const transformedErrors = await transformValidationErrors(schemaFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n }\n }\n\n setErrors((prev) => {\n const next = Object.fromEntries(\n Object.entries(prev).filter(([existingFieldId]) => !(\n existingFieldId === fieldId ||\n existingFieldId.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${existingFieldId}.`)\n )),\n )\n for (const [key, message] of Object.entries(nextFieldErrors)) {\n next[key] = message\n }\n const same =\n Object.keys(next).length === Object.keys(prev).length &&\n Object.entries(next).every(([key, message]) => prev[key] === message)\n return same ? prev : next\n })\n }, [\n cfDefinitions,\n customEntity,\n dotPathBaseFieldIds,\n fieldById,\n formReadOnly,\n hiddenBaseFieldIds,\n hiddenInjectedFieldIds,\n injectedFieldIdSet,\n mapDefsForValidation,\n schema,\n t,\n transformValidationErrors,\n translateValidationErrors,\n ])\n\n const allFieldsRef = React.useRef(allFields)\n allFieldsRef.current = allFields\n\n const dynamicOptionLoaderKey = React.useMemo(() => {\n return allFields\n .filter(f => f.type !== 'custom' && typeof (f as CrudBuiltinField).loadOptions === 'function')\n .map(f => f.id)\n .join('\\0')\n }, [allFields])\n\n const injectionGroupCards = React.useMemo<CrudFormGroup[]>(() => {\n if (!injectionWidgets || injectionWidgets.length === 0) return []\n const pairs = injectionWidgets\n .filter((widget) => (widget.placement?.kind ?? 'stack') === 'group')\n .map((widget) => {\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const group: CrudFormGroup = {\n id: `widget:${widget.widgetId}`,\n title: widget.placement?.groupLabel ?? widget.module.metadata.title,\n description: widget.placement?.groupDescription ?? widget.module.metadata.description,\n column: widget.placement?.column === 2 ? 2 : 1,\n component: () => (\n <widget.module.Widget\n context={injectionContext}\n data={values as unknown as CrudFormValues<TValues>}\n onDataChange={(next) => setValues(next as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ),\n }\n return { group, priority }\n })\n pairs.sort((a, b) => b.priority - a.priority)\n return pairs.map((p) => p.group)\n }, [injectionWidgets, injectionContext, pending, setValues, values])\n \n const groupsWithInjectedFields = React.useMemo(() => {\n if (!groups || groups.length === 0 || injectedFieldDefinitions.length === 0) return groups\n const cloned = groups.map((group) => ({ ...group, fields: [...(group.fields ?? [])] }))\n const fallbackIndex = cloned.length - 1\n for (const definition of injectedFieldDefinitions) {\n const targetIndex = cloned.findIndex((group) => group.id === definition.group)\n const index = targetIndex >= 0 ? targetIndex : fallbackIndex\n if (targetIndex < 0 && process.env.NODE_ENV !== 'production') {\n console.warn(`[CrudForm] Injected field \"${definition.id}\" targets group \"${definition.group}\" which does not exist. Appended to last group.`)\n }\n if (index < 0) continue\n const fieldEntries = cloned[index].fields ?? []\n if (!fieldEntries.some((entry) => typeof entry === 'string' && entry === definition.id)) {\n fieldEntries.push(definition.id)\n }\n cloned[index].fields = fieldEntries\n }\n return cloned\n }, [groups, injectedFieldDefinitions])\n\n const shouldAutoGroup = (!groupsWithInjectedFields || groupsWithInjectedFields.length === 0) && injectionGroupCards.length > 0\n const resolvedGroupsForLayout = React.useMemo(() => {\n const baseGroups = groupsWithInjectedFields && groupsWithInjectedFields.length ? groupsWithInjectedFields : []\n const autoGroup = shouldAutoGroup ? [{ id: '__auto-fields__', fields: allFields }] as CrudFormGroup[] : []\n return [...(baseGroups.length ? baseGroups : autoGroup), ...injectionGroupCards]\n }, [allFields, groupsWithInjectedFields, injectionGroupCards, shouldAutoGroup])\n const useGroupedLayout = resolvedGroupsForLayout.length > 0\n\n // Sortable group order\n const defaultGroupIds = React.useMemo(() => resolvedGroupsForLayout.map((g) => g.id), [resolvedGroupsForLayout])\n const { orderedIds: sortedGroupIds, reorder: reorderGroups } = useGroupOrder(\n sortablePageType,\n defaultGroupIds,\n )\n const sortableSensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(GuardedKeyboardSensor),\n )\n const handleGroupDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = sortedGroupIds.indexOf(String(active.id))\n const newIndex = sortedGroupIds.indexOf(String(over.id))\n if (oldIndex !== -1 && newIndex !== -1) reorderGroups(oldIndex, newIndex)\n }, [sortedGroupIds, reorderGroups])\n\n // Auto-expand collapsed groups that contain validation errors\n React.useEffect(() => {\n if (!collapsibleGroupsEnabled || Object.keys(errors).length === 0) return\n const errorFieldIds = new Set(Object.keys(errors))\n for (const g of resolvedGroupsForLayout) {\n const groupFieldIds = (g.fields ?? []).map((f) => (typeof f === 'string' ? f : f.id))\n const hasError = groupFieldIds.some((id) => errorFieldIds.has(id))\n if (hasError) {\n groupCollapseRefs.current.get(g.id)?.expand()\n }\n }\n }, [errors, collapsibleGroupsEnabled, resolvedGroupsForLayout])\n\n const stackedInjectionWidgets = React.useMemo(\n () => (injectionWidgets ?? []).filter((widget) => (widget.placement?.kind ?? 'stack') === 'stack'),\n [injectionWidgets],\n )\n\n const placedCustomFieldIds = React.useMemo(() => {\n const placed = new Set<string>()\n for (const other of (groups ?? [])) {\n if (other.kind === 'customFields' || !other.fields) continue\n for (const entry of other.fields) {\n if (typeof entry === 'string') placed.add(entry)\n else if (entry && typeof (entry as CrudField).id === 'string') placed.add((entry as CrudField).id)\n }\n }\n return placed\n }, [groups])\n\n const resolveGroupFields = React.useCallback((g: CrudFormGroup): CrudField[] => {\n if (g.kind === 'customFields') {\n return cfFields.filter((f) => !placedCustomFieldIds.has(f.id))\n }\n\n const src = g.fields || []\n const result: CrudField[] = []\n\n for (const item of src) {\n if (typeof item === 'string') {\n const found = fieldById.get(item)\n if (found) result.push(found)\n } else if (item) {\n result.push(item as CrudField)\n }\n }\n\n return result\n }, [cfFields, fieldById, placedCustomFieldIds])\n\n const customFieldsManageHref = React.useMemo(() => buildCustomFieldsManageHref(primaryEntityId), [buildCustomFieldsManageHref, primaryEntityId])\n\n const customFieldsEmptyState = React.useMemo(() => {\n const text = t('entities.customFields.empty')\n const action = t('entities.customFields.addFirst')\n return (\n <div className=\"rounded-md border border-dashed border-muted-foreground/50 bg-muted/30 px-3 py-4 text-sm text-muted-foreground\">\n <span>{text} </span>\n {customFieldsManageHref ? (\n <Link href={customFieldsManageHref} className=\"font-medium text-primary hover:underline\">\n {action}\n </Link>\n ) : (\n <span className=\"font-medium text-foreground\">{action}</span>\n )}\n </div>\n )\n }, [customFieldsManageHref, t])\n\n const firstFieldId = React.useMemo(() => {\n if (useGroupedLayout) {\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const scan = (list: CrudFormGroup[]) => {\n for (const group of list) {\n const resolved = resolveGroupFields(group)\n for (const field of resolved) {\n if (field?.id && !field.disabled) return field.id\n }\n }\n return null as string | null\n }\n\n const fromCol1 = scan(col1)\n if (fromCol1) return fromCol1\n const fromCol2 = scan(col2)\n if (fromCol2) return fromCol2\n }\n\n for (const field of allFields) {\n if (field?.id && !field.disabled) return field.id\n }\n return null\n }, [allFields, resolveGroupFields, resolvedGroupsForLayout, useGroupedLayout])\n\n const requestSubmit = React.useCallback(() => {\n if (formReadOnly) return\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId) as HTMLFormElement | null\n form?.requestSubmit()\n }, [formId, formReadOnly])\n\n const lastFocusedFieldRef = React.useRef<string | null>(null)\n const lastErrorFieldRef = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (disableInitialFocus || isLoading || isLoadingCustomFields || formReadOnly) {\n lastFocusedFieldRef.current = null\n return\n }\n\n if (!firstFieldId) return\n if (lastFocusedFieldRef.current === firstFieldId) return\n\n const run = () => {\n const form = document.getElementById(formId)\n if (!form) return\n\n // Do not steal focus if the user is already interacting with any element inside the form\n const active = typeof document !== 'undefined' ? (document.activeElement as HTMLElement | null) : null\n if (active && form.contains(active)) {\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${firstFieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n\n if (target && typeof target.focus === 'function') {\n target.focus({ preventScroll: true })\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastFocusedFieldRef.current = firstFieldId\n }\n }\n\n const frame =\n typeof window.requestAnimationFrame === 'function'\n ? window.requestAnimationFrame(run)\n : window.setTimeout(run, 0)\n\n return () => {\n if (typeof window === 'undefined') return\n if (typeof window.cancelAnimationFrame === 'function') {\n window.cancelAnimationFrame(frame as number)\n } else {\n window.clearTimeout(frame as number)\n }\n }\n }, [disableInitialFocus, firstFieldId, formId, formReadOnly, isLoading, isLoadingCustomFields])\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n const entries = Object.entries(errors)\n if (!entries.length) {\n lastErrorFieldRef.current = null\n return\n }\n const [fieldId] = entries[0]\n if (!fieldId || lastErrorFieldRef.current === fieldId) return\n\n const form = document.getElementById(formId)\n if (!form) return\n\n // Don't steal focus if the user is already typing inside the form. The auto-focus\n // is meant for \"submit failed, jump to first invalid field\" \u2014 not for \"user is\n // editing one error field and our focus jumps to a different remaining error\n // each keystroke as the errors object shrinks\". Keystrokes would otherwise land\n // in the wrong input.\n const active = document.activeElement\n if (active instanceof HTMLElement && form.contains(active)) {\n lastErrorFieldRef.current = fieldId\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(`[name=\"${fieldId}\"]`) ??\n container ??\n null\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastErrorFieldRef.current = fieldId\n }\n }, [errors, formId])\n\n // When an injection widget blocks save (e.g. the SEO helper), the blocking\n // reason is easy to miss if the relevant field or the widget panel is off-screen.\n // Deliberately scroll to the first field-mapped error, falling back to the\n // injection widget region when the widget only returns a message.\n const scrollToInjectionBlockedTarget = React.useCallback(\n (fieldErrors?: Record<string, string>) => {\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId)\n if (!form) return\n let target: HTMLElement | null = null\n for (const fieldId of fieldErrors ? Object.keys(fieldErrors) : []) {\n const fieldContainer = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n if (fieldContainer) {\n target = fieldContainer\n break\n }\n }\n if (!target) {\n target = form.querySelector<HTMLElement>('[data-crud-injection-region]')\n }\n if (target && typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n },\n [formId],\n )\n\n const updateEditedFieldMarker = React.useCallback((\n id: string,\n nextValue: unknown,\n baselineSource: Record<string, unknown> | undefined = dirtyBaselineValuesRef.current,\n ) => {\n if (\n baselineSource &&\n createDirtyValueSnapshot(baselineSource[id]) === createDirtyValueSnapshot(nextValue)\n ) {\n userEditedFieldIdsRef.current.delete(id)\n return\n }\n userEditedFieldIdsRef.current.add(id)\n }, [])\n\n const setValue = React.useCallback((id: string, nextValue: unknown) => {\n let nextData: CrudFormValues<TValues> | null = null\n let nextDirty: boolean | null = null\n const currentValue = (valuesRef.current as Record<string, unknown>)[id]\n if (!Object.is(currentValue, nextValue)) {\n updateEditedFieldMarker(id, nextValue)\n }\n setValues((prev) => {\n if (Object.is(prev[id], nextValue)) return prev\n const baselineSource = dirtyBaselineValuesRef.current ?? (prev as Record<string, unknown>)\n updateEditedFieldMarker(id, nextValue, baselineSource)\n nextData = { ...prev, [id]: nextValue } as CrudFormValues<TValues>\n valuesRef.current = nextData\n if (!(embedded && !trackDirtyWhenEmbedded)) {\n const baseline = dirtyBaselineSnapshotRef.current ?? createDirtySnapshot(prev as Record<string, unknown>)\n dirtyBaselineSnapshotRef.current = baseline\n dirtyBaselineValuesRef.current = baselineSource\n nextDirty = createDirtySnapshot(nextData as Record<string, unknown>) !== baseline\n }\n return nextData\n })\n if (nextDirty !== null) {\n isDirtyRef.current = nextDirty\n setHasUnsavedChanges(nextDirty)\n }\n const clearedMessages: string[] = []\n setErrors((prev) => {\n if (!Object.keys(prev).length) return prev\n let changed = false\n const nextEntries = Object.entries(prev).filter(([fieldId, message]) => {\n const shouldClear =\n fieldId === id ||\n fieldId.startsWith(`${id}.`) ||\n id.startsWith(`${fieldId}.`)\n if (shouldClear) {\n changed = true\n clearedMessages.push(message)\n }\n return !shouldClear\n })\n return changed ? Object.fromEntries(nextEntries) : prev\n })\n if (clearedMessages.length) {\n const highlightedMessage = t('ui.forms.errors.highlighted')\n const translatedMessages = new Set(\n clearedMessages\n .map((message) => translateValidationMessage(message))\n .filter((message) => message.trim().length > 0),\n )\n setFormError((prev) => {\n if (!prev) return prev\n const normalized = prev.trim()\n if (!normalized) return null\n if (normalized === highlightedMessage || translatedMessages.has(normalized)) {\n return null\n }\n return prev\n })\n }\n if (!nextData || !extendedInjectionEventsEnabled) return\n void triggerInjectionEvent('onFieldChange', nextData as TValues, injectionContextRef.current, {\n fieldId: id,\n fieldValue: nextValue,\n }).then((result) => {\n if (!result.ok) return\n const change = result.fieldChange\n if (!change) return\n const updates: Record<string, unknown> = { ...(change.sideEffects ?? {}) }\n if (change.value !== undefined) {\n updates[id] = change.value\n }\n if (Object.keys(updates).length > 0) {\n setValues((prev) => {\n let changed = false\n const next = { ...prev } as Record<string, unknown>\n for (const [key, value] of Object.entries(updates)) {\n if (Object.is(next[key], value)) continue\n next[key] = value\n changed = true\n }\n return changed ? (next as CrudFormValues<TValues>) : prev\n })\n }\n for (const message of change.messages ?? []) {\n flash(message.text, message.severity)\n }\n }).catch((err) => {\n console.error('[CrudForm] Error in onFieldChange:', err)\n })\n }, [embedded, extendedInjectionEventsEnabled, flash, t, trackDirtyWhenEmbedded, translateValidationMessage, triggerInjectionEvent, updateEditedFieldMarker])\n\n const onBlurRequest = React.useCallback((fieldId: string) => {\n void validateFieldOnBlur(fieldId)\n }, [validateFieldOnBlur])\n\n const handleFieldsetSelectionChange = React.useCallback(\n (entityId: string, nextCode: string | null) => {\n setCfFieldsetSelections((prev) => ({ ...prev, [entityId]: nextCode }))\n const bindingKey = customFieldsetBindings?.[entityId]?.valueKey\n if (bindingKey) {\n setValue(bindingKey, nextCode ?? undefined)\n }\n },\n [customFieldsetBindings, setValue],\n )\n\n const handleOpenFieldsetEditor = React.useCallback(\n (entityId: string, fieldsetCode: string | null, view: 'entity' | 'fieldset' = 'entity') => {\n const href = buildCustomFieldsManageHref(entityId)\n if (!href) return\n setFieldsetEditorTarget({ entityId, fieldsetCode, view })\n },\n [buildCustomFieldsManageHref],\n )\n\n const appliedInitialValuesSnapshotRef = React.useRef<string | undefined>(undefined)\n const dirtyBaselineSnapshotRef = React.useRef<string | undefined>(undefined)\n const dirtyBaselineValuesRef = React.useRef<Record<string, unknown> | undefined>(undefined)\n const userEditedFieldIdsRef = React.useRef<Set<string>>(new Set())\n React.useLayoutEffect(() => {\n if (!initialValues) return\n const snapshot = JSON.stringify({\n initialValues,\n injectedFieldIds: injectedFieldDefinitions.map((definition) => definition.id),\n customFieldMappings: cfDefinitions.map((definition) => definition.key),\n dotPathBaseFieldIds: Array.from(dotPathBaseFieldIds),\n })\n if (appliedInitialValuesSnapshotRef.current === snapshot) return\n appliedInitialValuesSnapshotRef.current = snapshot\n const initialRecord = initialValues as Record<string, unknown>\n let mergedValues: CrudFormValues<TValues> | null = null\n // Whether the user already has unsaved edits relative to the load-time baseline,\n // computed from `prev` (React's latest committed values) \u2014 NOT from isDirtyRef or\n // valuesRef, which are both updated in post-render effects and therefore still\n // hold stale values when this layout effect runs in the SAME render that async\n // custom-field / injected-field definitions arrive. That lag was the residual\n // race that let the baseline absorb an in-progress edit under load.\n let hadUnsavedEdits = false\n setValues((prev) => {\n const priorBaseline = dirtyBaselineSnapshotRef.current\n const editedFieldIds = userEditedFieldIdsRef.current\n hadUnsavedEdits =\n editedFieldIds.size > 0 ||\n priorBaseline !== undefined &&\n createDirtySnapshot(prev as Record<string, unknown>) !== priorBaseline\n const merged = { ...prev } as CrudFormValues<TValues>\n const mergedRecord = merged as Record<string, unknown>\n for (const [key, value] of Object.entries(initialValues as Record<string, unknown>)) {\n if (editedFieldIds.has(key)) continue\n mergedRecord[key] = value\n }\n for (const definition of injectedFieldDefinitions) {\n if (merged[definition.id] !== undefined) continue\n const extracted = readByDotPath(initialRecord, definition.id)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[definition.id] = extracted\n }\n }\n for (const definition of cfDefinitions) {\n const targetId = customEntity ? definition.key : `cf_${definition.key}`\n if (!targetId || merged[targetId] !== undefined) continue\n const extracted = readInitialCustomFieldValue(initialRecord, definition.key)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[targetId] = extracted\n }\n }\n for (const fieldId of dotPathBaseFieldIds) {\n if (merged[fieldId] !== undefined) continue\n const extracted = readByDotPath(initialRecord, fieldId)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[fieldId] = extracted\n }\n }\n mergedValues = merged\n return mergedValues\n })\n if (mergedValues && !hadUnsavedEdits) {\n // Do not absorb an in-progress edit into the pristine baseline. This effect\n // re-runs whenever the snapshot changes \u2014 which includes custom-field\n // definitions and injected fields loading ASYNCHRONOUSLY after mount. If the\n // user has already started editing by the time they arrive, recomputing the\n // baseline from the current (merged) values would set the baseline equal to\n // the edited values, silently clearing dirty (header Save disables, the edit\n // looks pristine) and discarding the unsaved change. Re-establish the baseline\n // only when there are no pending edits; while dirty, keep the load-time\n // baseline so the edit stays dirty until save/discard. Root cause of the flaky\n // optimistic-lock stale-edit conflicts (#2055 / TC-LOCK-OSS-015 / TC-LOCK-OSS-029).\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(mergedValues as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(mergedValues as Record<string, unknown>) }\n }\n if (!extendedInjectionEventsEnabled || !mergedValues) return\n let cancelled = false\n const run = async () => {\n try {\n const result = await triggerInjectionEvent(\n 'transformDisplayData',\n mergedValues as TValues,\n injectionContextRef.current,\n )\n const transformed = result.data\n if (cancelled || !transformed) return\n // As above: never re-apply transformed display data over an in-progress\n // edit \u2014 it would overwrite the user's unsaved changes and reset dirty.\n if (isDirtyRef.current) return\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(transformed as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(transformed as Record<string, unknown>) }\n setValues(transformed as CrudFormValues<TValues>)\n } catch (err) {\n console.error('[CrudForm] Error in transformDisplayData:', err)\n }\n }\n void run()\n return () => {\n cancelled = true\n }\n }, [\n cfDefinitions,\n customEntity,\n dotPathBaseFieldIds,\n extendedInjectionEventsEnabled,\n initialValues,\n injectedFieldDefinitions,\n triggerInjectionEvent,\n ])\n\n // Apply custom field defaults on create flows (one-time, ref-guarded).\n // Mode is determined from the host-provided initialValues prop, not from\n // the reactive values.id (which lags on async-loading edit pages).\n // We also wait for isLoading to settle so async edit pages that start with\n // initialValues={} don't get mis-detected as create flows.\n const cfDefaultsAppliedRef = React.useRef(false)\n const initialValuesHasId = React.useMemo(() => {\n if (!initialValues) return false\n const raw = (initialValues as Record<string, unknown>).id\n return raw !== undefined && raw !== null && raw !== ''\n }, [initialValues])\n\n React.useEffect(() => {\n // Do not fire while the host is still loading the record\n if (isLoading) return\n // Edit flow: initialValues contains an id \u2014 never apply defaults\n if (initialValuesHasId) return\n // Wait until custom field definitions have loaded\n if (!cfDefinitions.length) return\n // One-shot guard: do not reapply if already done\n if (cfDefaultsAppliedRef.current) return\n cfDefaultsAppliedRef.current = true\n\n const defaults: Record<string, unknown> = {}\n const prefix = customEntity ? '' : 'cf_'\n for (const def of cfDefinitions) {\n if (def.defaultValue === undefined || def.defaultValue === null) continue\n const fieldId = `${prefix}${def.key}`\n defaults[fieldId] = def.defaultValue\n }\n\n if (Object.keys(defaults).length === 0) return\n\n let mergedValues: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n const merged = { ...prev } as CrudFormValues<TValues>\n let applied = false\n for (const [fieldId, defaultVal] of Object.entries(defaults)) {\n // Skip if a value already exists (from initialValues or user input)\n if (merged[fieldId] !== undefined) continue\n ;(merged as Record<string, unknown>)[fieldId] = defaultVal\n applied = true\n }\n if (!applied) return prev\n mergedValues = merged\n return mergedValues\n })\n\n // Update the dirty baseline so the form doesn't appear dirty from defaults\n if (mergedValues) {\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(mergedValues as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(mergedValues as Record<string, unknown>) }\n }\n }, [isLoading, initialValuesHasId, cfDefinitions, customEntity])\n\n const markFormAsClean = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n clearDirtyState(snapshotSource)\n }, [clearDirtyState])\n\n const buildFieldsetEditorHref = React.useCallback(\n (includeViewParam: boolean) => {\n if (!fieldsetEditorTarget) return null\n const base = buildCustomFieldsManageHref(fieldsetEditorTarget.entityId)\n if (!base) return null\n const params: string[] = []\n if (fieldsetEditorTarget.fieldsetCode) {\n params.push(`fieldset=${encodeURIComponent(fieldsetEditorTarget.fieldsetCode)}`)\n }\n if (includeViewParam && fieldsetEditorTarget.view === 'fieldset') {\n params.push('view=fieldset')\n }\n if (!params.length) return base\n const connector = base.includes('?') ? '&' : '?'\n return `${base}${connector}${params.join('&')}`\n },\n [buildCustomFieldsManageHref, fieldsetEditorTarget],\n )\n\n const fieldsetEditorFullHref = React.useMemo(() => buildFieldsetEditorHref(false), [buildFieldsetEditorHref])\n\n const handleFieldsetDialogSave = React.useCallback(() => {\n if (!fieldsetManagerRef.current) return\n void fieldsetManagerRef.current.submit()\n }, [])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (formReadOnly) return\n if (submittingRef.current) return\n submittingRef.current = true\n try {\n setFormError(null)\n setErrors({})\n\n const requiredMessage = t('ui.forms.errors.required')\n const highlightedMessage = t('ui.forms.errors.highlighted')\n\n // Make sure inputs that commit on blur flush their local state before submit.\n try {\n if (typeof document !== 'undefined') {\n const activeElement = document.activeElement\n if (activeElement instanceof HTMLElement) {\n activeElement.blur()\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n }\n }\n } catch {\n // ignore focus cleanup errors\n }\n\n // Basic required-field validation when no zod schema is provided\n const requiredErrors: Record<string, string> = {}\n for (const field of allFields) {\n if (!field.required) continue\n if (field.disabled) continue\n if (hiddenBaseFieldIds.has(field.id) || hiddenInjectedFieldIds.has(field.id)) continue\n const v = values[field.id]\n const isArray = Array.isArray(v)\n const isString = typeof v === 'string'\n const empty =\n v === undefined ||\n v === null ||\n (isString && v.trim() === '') ||\n (isArray && v.length === 0) ||\n (field.type === 'checkbox' && v !== true)\n if (empty) requiredErrors[field.id] = requiredMessage\n }\n if (Object.keys(requiredErrors).length) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Required field errors prevented submit', requiredErrors)\n }\n const transformedErrors = await transformValidationErrors(requiredErrors)\n setErrors(transformedErrors)\n flash(highlightedMessage, 'error')\n return\n }\n\n // Custom fields validation via definitions (rules)\n if (resolvedEntityIds.length) {\n try {\n const defs = cfDefinitions.length\n ? cfDefinitions\n : await import('./utils/customFieldDefs').then((mod) => mod.fetchCustomFieldDefs(resolvedEntityIds))\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n // Build values keyed by def.key for validation\n const cfValues: Record<string, unknown> = {}\n if (customEntity) {\n for (const def of defs) {\n if (Object.prototype.hasOwnProperty.call(values, def.key)) {\n cfValues[def.key] = values[def.key]\n }\n }\n } else {\n for (const [k, v] of Object.entries(values)) {\n if (k.startsWith('cf_')) cfValues[k.replace(/^cf_/, '')] = v\n }\n }\n const defsForValidation = mapDefsForValidation(defs)\n const result = validateValuesAgainstDefs(cfValues, defsForValidation)\n if (!result.ok) {\n if (customEntity) {\n const mapped: Record<string, string> = {}\n for (const [ek, ev] of Object.entries(result.fieldErrors)) mapped[ek.replace(/^cf_/, '')] = String(ev)\n const transformedErrors = await transformValidationErrors(mapped)\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n } else {\n const transformedErrors = await transformValidationErrors(\n Object.fromEntries(\n Object.entries(result.fieldErrors).map(([key, value]) => [key, String(value)]),\n ),\n )\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n }\n flash(highlightedMessage, 'error')\n return\n }\n } catch {\n // ignore validation errors if helper not available\n }\n }\n\n const widgetValues = { ...(valuesRef.current as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n if (customEntity) {\n const allowedKeys = new Set(cfDefinitions.map((definition) => definition.key).filter(Boolean))\n for (const key of Object.keys(coreValues)) {\n if (!allowedKeys.has(key)) delete coreValues[key]\n }\n }\n\n let parsedValues: TValues\n if (schema) {\n const res = schema.safeParse(collapseDotPathFields(coreValues, dotPathBaseFieldIds))\n if (!res.success) {\n const fieldErrors: Record<string, string> = {}\n res.error.issues.forEach((issue) => {\n const path = serializeIssuePath(issue.path)\n if (path) fieldErrors[path] = issue.message\n })\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Schema validation failed', res.error.issues)\n }\n const transformedErrors = await transformValidationErrors(fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n flash(highlightedMessage, 'error')\n return\n }\n parsedValues = res.data\n } else {\n parsedValues = coreValues as TValues\n }\n let submitValues = widgetValues as TValues\n let coreSubmitValues = parsedValues\n if (extendedInjectionEventsEnabled) {\n try {\n const result = await triggerInjectionEvent('transformFormData', submitValues, injectionContext)\n if (result.data) {\n submitValues = result.data as TValues\n const projectedCoreValues = { ...(result.data as Record<string, unknown>) }\n for (const injectedId of injectedFieldIdSet) {\n delete projectedCoreValues[injectedId]\n }\n if (customEntity) {\n const allowedKeys = new Set(cfDefinitions.map((definition) => definition.key).filter(Boolean))\n for (const key of Object.keys(projectedCoreValues)) {\n if (!allowedKeys.has(key)) delete projectedCoreValues[key]\n }\n }\n coreSubmitValues = schema\n ? schema.parse(collapseDotPathFields(projectedCoreValues, dotPathBaseFieldIds))\n : (projectedCoreValues as TValues)\n if (result.applyToForm) {\n setValues(result.data as CrudFormValues<TValues>)\n }\n }\n } catch (err) {\n console.error('[CrudForm] Error in transformFormData:', err)\n }\n }\n\n // Trigger onBeforeSave event for injection widgets\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeSave', submitValues, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n scrollToInjectionBlockedTarget(result.fieldErrors)\n setPending(false)\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n\n setPending(true)\n\n const nativeSubmitter = 'nativeEvent' in e ? (e.nativeEvent as SubmitEvent).submitter : null\n const submitContext: CrudFormSubmitContext | undefined =\n nativeSubmitter instanceof HTMLElement\n ? {\n submitter: {\n id: nativeSubmitter.id || undefined,\n name:\n 'name' in nativeSubmitter && typeof nativeSubmitter.name === 'string' && nativeSubmitter.name.trim().length > 0\n ? nativeSubmitter.name\n : undefined,\n value:\n 'value' in nativeSubmitter && typeof nativeSubmitter.value === 'string' && nativeSubmitter.value.trim().length > 0\n ? nativeSubmitter.value\n : undefined,\n dataset: Object.fromEntries(\n Object.entries(nativeSubmitter.dataset).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n ),\n },\n }\n : undefined\n \n // Trigger onSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n \n try {\n submitNavigationBypassRef.current = true\n const optimisticLockHeader = buildOptimisticLockHeader(resolvedOptimisticLockUpdatedAt)\n const mergedSubmitHeaders = {\n ...(injectionRequestHeaders ?? {}),\n ...optimisticLockHeader,\n }\n if (Object.keys(mergedSubmitHeaders).length > 0) {\n await withScopedApiRequestHeaders(mergedSubmitHeaders, async () => {\n await onSubmit?.(coreSubmitValues, submitContext)\n })\n } else {\n await onSubmit?.(coreSubmitValues, submitContext)\n }\n \n // Trigger onAfterSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterSave:', err)\n }\n }\n\n markFormAsClean(valuesRef.current as Record<string, unknown>)\n keepSubmitNavigationBypassAlive()\n if (successRedirect) await navigateWithGuard(successRedirect)\n } catch (err: unknown) {\n clearSubmitNavigationBypass()\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const { message: helperMessage, fieldErrors: serverFieldErrors } = mapCrudServerErrorToFormErrors(err, { customEntity })\n const combinedFieldErrors = serverFieldErrors ?? {}\n const hasFieldErrors = Object.keys(combinedFieldErrors).length > 0\n const firstFieldMessage = hasFieldErrors\n ? (() => {\n const firstKey = Object.keys(combinedFieldErrors)[0]\n if (!firstKey) return null\n const value = combinedFieldErrors[firstKey]\n if (typeof value !== 'string' || !value.trim().length) return null\n return translateValidationMessage(value)\n })()\n : null\n if (hasFieldErrors) {\n const transformedErrors = await transformValidationErrors(combinedFieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Submission failed with field errors', transformedErrors)\n }\n }\n\n const optimisticLockConflict = extractOptimisticLockConflict(err)\n let displayMessage = optimisticLockConflict\n ? t('ui.forms.flash.recordModified', 'This record was modified by someone else. Refresh and try again.')\n : typeof helperMessage === 'string' && helperMessage.trim() ? helperMessage.trim() : ''\n if (hasFieldErrors) {\n const lowered = displayMessage.toLowerCase()\n const highlightedLower = highlightedMessage.toLowerCase()\n if (!displayMessage || lowered === 'invalid input' || lowered === highlightedLower) {\n displayMessage = firstFieldMessage ?? highlightedMessage\n }\n }\n if (!displayMessage && err instanceof Error && typeof err.message === 'string' && err.message.trim()) {\n displayMessage = err.message.trim()\n }\n if (!displayMessage) {\n displayMessage = hasFieldErrors ? highlightedMessage : saveErrorMessage\n }\n displayMessage = parseServerMessage(displayMessage)\n if (optimisticLockConflict) {\n // Primary surface for the conflict is the persistent, error-styled\n // RecordConflictBanner (unified across all forms). Keep the inline\n // form error too, but suppress the redundant transient toast.\n try { surfaceRecordConflict(err, t) } catch {}\n } else if (!hasFieldErrors) {\n flash(displayMessage, 'error')\n }\n setFormError(displayMessage)\n } finally {\n setPending(false)\n }\n } finally {\n submittingRef.current = false\n }\n }\n\n // Tracks the last loader function observed per field id so we can invalidate cached\n // options when callers rebuild loaders that capture different state (e.g. a tenant id).\n const dynamicOptionLoadersRef = React.useRef<\n Map<string, ((query?: string) => Promise<CrudFieldOption[]>) | undefined>\n >(new Map())\n\n // Stable key prevents infinite re-render loop (see #814) \u2014 do not depend on allFields directly.\n React.useEffect(() => {\n let cancelled = false\n const loadAll = async () => {\n const loaders = allFieldsRef.current\n .filter(\n (f): f is CrudBuiltinField & { loadOptions: NonNullable<CrudBuiltinField['loadOptions']> } =>\n f.type !== 'custom' && typeof f.loadOptions === 'function'\n )\n .map(async (f) => {\n try {\n dynamicOptionLoadersRef.current.set(f.id, f.loadOptions)\n const opts = await f.loadOptions()\n if (!cancelled) setDynamicOptions((prev) => ({ ...prev, [f.id]: opts }))\n } catch {\n // ignore\n }\n })\n await Promise.all(loaders)\n }\n loadAll()\n return () => {\n cancelled = true\n }\n }, [dynamicOptionLoaderKey])\n\n const loadFieldOptions = React.useCallback(async (field: CrudField, query?: string): Promise<CrudFieldOption[]> => {\n if (!('type' in field) || field.type === 'custom') return EMPTY_OPTIONS\n const builtin = field as CrudBuiltinField\n const loader = builtin.loadOptions\n if (typeof loader === 'function') {\n const previousLoader = dynamicOptionLoadersRef.current.get(field.id)\n const loaderChanged = previousLoader !== loader\n dynamicOptionLoadersRef.current.set(field.id, loader)\n if (\n query === undefined &&\n !loaderChanged &&\n Array.isArray(dynamicOptions[field.id])\n ) {\n return dynamicOptions[field.id]\n }\n try {\n const fetched = await loader(query)\n if (query === undefined) {\n setDynamicOptions((prev) => ({\n ...prev,\n [field.id]: fetched,\n }))\n }\n return fetched\n } catch {\n return builtin.options ?? EMPTY_OPTIONS\n }\n }\n return dynamicOptions[field.id] || builtin.options || EMPTY_OPTIONS\n }, [dynamicOptions])\n\n const fieldOptionsById = React.useMemo(() => {\n const map = new globalThis.Map<string, CrudFieldOption[]>()\n for (const f of allFields) {\n if (!('type' in f) || f.type === 'custom') continue\n const builtin = f as CrudBuiltinField\n const staticOptions = builtin.options ?? EMPTY_OPTIONS\n const dynamic = dynamicOptions[f.id]\n if (dynamic && dynamic.length) {\n const merged: CrudFieldOption[] = []\n const seen = new Set<string>()\n for (const opt of staticOptions) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n for (const opt of dynamic) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n map.set(f.id, merged)\n } else if (staticOptions.length) {\n map.set(f.id, staticOptions)\n } else if (dynamic) {\n map.set(f.id, dynamic)\n }\n }\n return map\n }, [allFields, dynamicOptions])\n\n // no auto-focus; let the browser/user manage focus\n\n const usesResponsiveLayout = allFields.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const grid = twoColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : usesResponsiveLayout\n ? 'grid grid-cols-1 gap-4 md:grid-cols-6'\n : 'grid grid-cols-1 gap-4'\n\n // Helper to render a list of field configs\n const resolveLayoutClass = (layout?: CrudFieldBase['layout']) => {\n switch (layout) {\n case 'half':\n return 'md:col-span-3'\n case 'third':\n return 'md:col-span-2'\n default:\n return 'md:col-span-6'\n }\n }\n\n const renderFields = (fieldList: CrudField[]) => {\n const usesResponsive = fieldList.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const gridClass = usesResponsive ? 'grid grid-cols-1 gap-4 md:grid-cols-6' : 'grid grid-cols-1 gap-4'\n return (\n <div className={gridClass}>\n {fieldList.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsive ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={readRenderedFieldValue(values as Record<string, unknown>, f.id)}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n onBlurRequest={onBlurRequest}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!disableInitialFocus && !formReadOnly && Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n markRequired={widgetRequiredFieldIds.has(f.id)}\n />\n )\n })}\n </div>\n )\n }\n\n const renderCustomFieldsContent = React.useCallback((): React.ReactNode[] => {\n if (!customFieldLayout.length) {\n return [\n <div key=\"custom-fields-empty\" className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n ]\n }\n\n const nodes: React.ReactNode[] = []\n const multipleEntities = customFieldLayout.length > 1\n\n customFieldLayout.forEach((entityLayout) => {\n const manageHref = buildCustomFieldsManageHref(entityLayout.entityId)\n const showSelector =\n entityLayout.hasFieldsets &&\n entityLayout.singleFieldsetPerRecord &&\n entityLayout.availableFieldsets.length > 0\n\n if (multipleEntities) {\n nodes.push(\n <div\n key={`custom-fields-entity-${entityLayout.entityId}`}\n className=\"px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {entityLayout.entityId}\n </div>,\n )\n }\n\n if (showSelector) {\n nodes.push(\n <div key={`custom-fields-selector-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <label className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {fieldsetSelectorLabel}\n </label>\n <Select\n value={entityLayout.activeFieldset || undefined}\n onValueChange={(value) =>\n handleFieldsetSelectionChange(\n entityLayout.entityId,\n value || null,\n )}\n >\n <SelectTrigger className=\"w-auto min-w-[10rem]\">\n <SelectValue placeholder={defaultFieldsetLabel} />\n </SelectTrigger>\n <SelectContent>\n {entityLayout.availableFieldsets.map((fs) => (\n <SelectItem key={fs.code} value={fs.code}>\n {fs.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() =>\n handleOpenFieldsetEditor(entityLayout.entityId, entityLayout.activeFieldset ?? null, 'fieldset')}\n disabled={!manageHref}\n title={manageFieldsetLabel}\n >\n <Settings className=\"size-4\" />\n </IconButton>\n </div>\n </div>,\n )\n }\n\n if (entityLayout.sections.length) {\n entityLayout.sections.forEach((section) => {\n const FieldsetIcon = section.fieldset?.icon\n ? FIELDSET_ICON_COMPONENTS[section.fieldset.icon]\n : null\n const sectionKey = `${entityLayout.entityId}:${section.fieldsetCode ?? 'default'}`\n const manageDisabled = !manageHref\n nodes.push(\n <div key={sectionKey} className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n {FieldsetIcon ? (\n <FieldsetIcon className=\"size-5 text-muted-foreground\" />\n ) : null}\n <div>\n <div className=\"text-sm font-medium\">{section.title}</div>\n {section.description ? (\n <div className=\"text-xs text-muted-foreground\">\n {section.description}\n </div>\n ) : null}\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"muted\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => handleOpenFieldsetEditor(entityLayout.entityId, section.fieldsetCode, 'fieldset')}\n disabled={manageDisabled}\n >\n <Settings className=\"size-4\" />\n {manageFieldsetLabel}\n </Button>\n </div>\n {section.groups.map((group) => {\n const groupKey = `${section.fieldsetCode ?? 'default'}:${group.code ?? 'default'}`\n const visibleFields = placedCustomFieldIds.size > 0\n ? group.fields.filter((f) => !placedCustomFieldIds.has(f.id))\n : group.fields\n if (!visibleFields.length) return null\n return (\n <div key={groupKey} className=\"space-y-2\">\n {group.label ? (\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n ) : null}\n {renderFields(visibleFields)}\n </div>\n )\n })}\n {!section.groups.length ? (\n <div className=\"text-xs text-muted-foreground\">{emptyFieldsetMessage}</div>\n ) : null}\n </div>,\n )\n })\n } else {\n nodes.push(\n <div key={`custom-fields-empty-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n )\n }\n })\n\n return nodes\n }, [\n buildCustomFieldsManageHref,\n customFieldLayout,\n customFieldsEmptyState,\n defaultFieldsetLabel,\n emptyFieldsetMessage,\n fieldsetSelectorLabel,\n handleFieldsetSelectionChange,\n handleOpenFieldsetEditor,\n manageFieldsetLabel,\n placedCustomFieldIds,\n renderFields,\n ])\n\n const fieldsetManagerDialog = (\n <Dialog open={fieldsetEditorTarget !== null} onOpenChange={(open) => { if (!open) setFieldsetEditorTarget(null) }}>\n <DialogContent\n className=\"max-w-5xl w-full\"\n aria-describedby={undefined}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleFieldsetDialogSave()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{fieldsetDialogTitle}</DialogTitle>\n </DialogHeader>\n {fieldsetEditorTarget ? (\n <FieldDefinitionsManagerErrorBoundary\n onClose={() => setFieldsetEditorTarget(null)}\n unavailableMessage={fieldsetDialogUnavailable}\n >\n <FieldDefinitionsManager\n ref={fieldsetManagerRef}\n entityId={fieldsetEditorTarget.entityId}\n initialFieldset={fieldsetEditorTarget.fieldsetCode}\n fullEditorHref={fieldsetEditorFullHref ?? undefined}\n onSaved={refreshCustomFieldDefinitions}\n onClose={() => setFieldsetEditorTarget(null)}\n />\n </FieldDefinitionsManagerErrorBoundary>\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground px-4 text-center\">\n {fieldsetDialogUnavailable}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n\n const handleReadOnlyFocusCapture = React.useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n const target = event.target\n if (target instanceof HTMLElement) target.blur()\n }, [formReadOnly])\n\n const handleReadOnlyKeyDownCapture = React.useCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n event.preventDefault()\n }, [formReadOnly])\n\n const wrapFormBody = React.useCallback((children: React.ReactNode, className?: string) => {\n if (!formReadOnly) return children\n return (\n <div\n className={cn('relative', className)}\n onFocusCapture={handleReadOnlyFocusCapture}\n onKeyDownCapture={handleReadOnlyKeyDownCapture}\n >\n <div className=\"pointer-events-none select-none opacity-70\">\n {children}\n </div>\n <div className=\"absolute inset-0 z-10 flex items-start justify-center rounded-lg bg-background/80 p-4 backdrop-blur-[1px] sm:p-6\">\n {readOnlyOverlay ?? <div className=\"rounded-xl border border-border/70 bg-background/95 px-4 py-3 shadow-sm\" />}\n </div>\n </div>\n )\n }, [formReadOnly, handleReadOnlyFocusCapture, handleReadOnlyKeyDownCapture, readOnlyOverlay])\n\n // If groups are provided, render the two-column grouped layout\n if (useGroupedLayout) {\n\n // Sort groups by user-preferred order when sortable is enabled\n const sortedGroups = sortableGroupsEnabled\n ? [...resolvedGroupsForLayout].sort((a, b) => {\n const ai = sortedGroupIds.indexOf(a.id)\n const bi = sortedGroupIds.indexOf(b.id)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n : resolvedGroupsForLayout\n\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n for (const g of sortedGroups) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n const col1Ids = col1.map((g) => g.id)\n\n const renderGroupedCards = (items: CrudFormGroup[]) => {\n const nodes: React.ReactNode[] = []\n for (const g of items) {\n const isCustomFieldsGroup = g.kind === 'customFields'\n if (isCustomFieldsGroup) {\n if (isLoadingCustomFields) {\n const loadingContent = (\n <div key={`${g.id}-loading`} className=\"rounded-lg border bg-card p-4\">\n <DataLoader\n isLoading\n loadingMessage={resolvedCustomFieldsLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n <div />\n </DataLoader>\n </div>\n )\n if (collapsibleGroupsEnabled && g.title) {\n nodes.push(\n <CollapsibleGroup\n key={`${g.id}-loading-collapsible`}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n chevronPosition={collapsibleChevronPosition}\n >\n {loadingContent}\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(loadingContent)\n }\n continue\n }\n\n const customFieldsInnerNodes: React.ReactNode[] = []\n if (g.component) {\n customFieldsInnerNodes.push(\n <div key={`${g.id}-component`} className=\"rounded-lg border bg-card px-4 py-3\">\n {g.component({ values, setValue, errors, requiredFieldIds: widgetRequiredFieldIds })}\n </div>,\n )\n }\n const renderedSections = renderCustomFieldsContent()\n if (renderedSections.length) customFieldsInnerNodes.push(...renderedSections)\n\n if (collapsibleGroupsEnabled && g.title) {\n const customFieldCount = customFieldLayout.reduce(\n (sum, entity) => sum + entity.sections.reduce(\n (sSum, section) => sSum + section.groups.reduce(\n (gSum, group) => gSum + group.fields.length, 0,\n ), 0,\n ), 0,\n )\n const customFieldErrors = customFieldLayout.reduce(\n (sum, entity) => sum + entity.sections.reduce(\n (sSum, section) => sSum + section.groups.reduce(\n (gSum, group) => gSum + group.fields.filter((f) => errors[f.id]).length, 0,\n ), 0,\n ), 0,\n )\n nodes.push(\n <CollapsibleGroup\n key={g.id}\n ref={(handle) => {\n if (handle) groupCollapseRefs.current.set(g.id, handle)\n else groupCollapseRefs.current.delete(g.id)\n }}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n errorCount={customFieldErrors}\n fieldCount={customFieldCount}\n chevronPosition={collapsibleChevronPosition}\n >\n <div className=\"space-y-3\">\n {customFieldsInnerNodes}\n </div>\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(...customFieldsInnerNodes)\n }\n continue\n }\n\n const componentNode = g.component ? g.component({ values, setValue, errors, requiredFieldIds: widgetRequiredFieldIds }) : null\n if (g.bare) {\n if (componentNode) {\n nodes.push(<React.Fragment key={g.id}>{componentNode}</React.Fragment>)\n }\n continue\n }\n const groupFields = resolveGroupFields(g)\n const groupFieldIds = (g.fields ?? []).map((f) => (typeof f === 'string' ? f : f.id))\n const groupErrorCount = groupFieldIds.filter((id) => errors[id]).length\n\n const groupContent = (\n <>\n {g.description ? <div className=\"text-xs text-muted-foreground\">{t(g.description, g.description)}</div> : null}\n {componentNode ? (\n <div>{componentNode}</div>\n ) : null}\n <DataLoader\n isLoading={false}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n {groupFields.length > 0 ? renderFields(groupFields) : <div className=\"min-h-[1px]\" />}\n </DataLoader>\n </>\n )\n\n if (collapsibleGroupsEnabled && g.title) {\n nodes.push(\n <CollapsibleGroup\n key={g.id}\n ref={(handle) => {\n if (handle) groupCollapseRefs.current.set(g.id, handle)\n else groupCollapseRefs.current.delete(g.id)\n }}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n errorCount={groupErrorCount}\n fieldCount={groupFields.length}\n chevronPosition={collapsibleChevronPosition}\n >\n <div className=\"space-y-3\">\n {groupContent}\n </div>\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(\n <div key={g.id} className=\"rounded-lg border bg-card px-4 py-3 space-y-3\">\n {g.title ? (\n <div className=\"text-sm font-medium\">{t(g.title, g.title)}</div>\n ) : null}\n {groupContent}\n </div>,\n )\n }\n }\n return nodes\n }\n\n const col1Nodes = renderGroupedCards(col1)\n const col2Content = renderGroupedCards(col2)\n\n // Wrap col1 nodes in sortable items when enabled\n const col1Content = sortableGroupsEnabled\n ? col1Nodes.map((node, i) => (\n <SortableGroupItem key={col1[i]?.id ?? i} id={col1[i]?.id ?? String(i)}>\n {node}\n </SortableGroupItem>\n ))\n : col1Nodes\n const hasSecondaryColumn = col2Content.length > 0\n\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n {wrapFormBody(\n <form id={formId} onSubmit={handleSubmit} className={`space-y-4 ${dialogFormPadding}`}>\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending || formReadOnly}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div\n className={hasSecondaryColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : 'grid grid-cols-1 gap-4'}\n >\n {sortableGroupsEnabled ? (\n <DndContext sensors={sortableSensors} collisionDetection={closestCenter} onDragEnd={handleGroupDragEnd}>\n <SortableContext items={col1Ids} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">{col1Content}</div>\n </SortableContext>\n </DndContext>\n ) : (\n <div className=\"space-y-3\">{col1Content}</div>\n )}\n {hasSecondaryColumn ? <div className=\"space-y-3\" data-crud-injection-region>{col2Content}</div> : null}\n </div>\n {formError && !Object.keys(errors).length ? <div className=\"text-sm text-status-error-text\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon }\n }}\n />\n )}\n </form>,\n )}\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n }\n\n // Default single-card layout (compatible with previous API)\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n {wrapFormBody(\n <div>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={`${embedded ? 'space-y-4' : 'rounded-lg border bg-card p-4 space-y-4'} ${dialogFormPadding}`}\n >\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending || formReadOnly}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div className={grid}>\n {allFields.map((f) => {\n if (hiddenBaseFieldIds.has(f.id) || hiddenInjectedFieldIds.has(f.id)) return null\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsiveLayout ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n onBlurRequest={onBlurRequest}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!disableInitialFocus && !formReadOnly && Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n markRequired={widgetRequiredFieldIds.has(f.id)}\n />\n )\n })}\n </div>\n {formError && !Object.keys(errors).length ? <div className=\"text-sm text-status-error-text\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n )}\n </form>\n </div>,\n )}\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction RelationSelect({\n value,\n onChange,\n options,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n options: CrudFieldOption[]\n placeholder?: string\n autoFocus?: boolean\n}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [query, options])\n\n return (\n <div className=\"space-y-1\">\n <Input\n ref={inputRef}\n placeholder={placeholder || t('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"max-h-40 overflow-auto rounded border\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full justify-start rounded-none font-normal\"\n onClick={() => onChange('')}\n >\n \u2014\n </Button>\n {filtered.map((opt) => (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n className={`w-full justify-start rounded-none font-normal ${\n value === opt.value ? 'bg-muted' : ''\n }`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </Button>\n ))}\n </div>\n </div>\n )\n}\n// Local-buffer text input to avoid focus loss when parent re-renders\nfunction TextInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n disabled,\n suggestions,\n inputType = 'text',\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n disabled?: boolean\n suggestions?: string[]\n inputType?: 'text' | 'password'\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const userTypingRef = React.useRef(false)\n const datalistId = React.useId()\n const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\n\n React.useEffect(() => {\n // Sync from props whenever the input is unfocused or the user hasn't typed yet.\n if (!isFocusedRef.current || !userTypingRef.current) {\n setLocal(value)\n }\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.value\n userTypingRef.current = true\n setLocal(next)\n onChange(next)\n }, [disabled, onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, disabled, onSubmit])\n\n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n userTypingRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n\n if (inputType === 'password') {\n return (\n <PasswordInput\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )\n }\n return (\n <>\n <Input\n type={inputType}\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n list={suggestions && suggestions.length > 0 ? datalistId : undefined}\n />\n {suggestions && suggestions.length > 0 && (\n <datalist id={datalistId}>\n {suggestions.map((suggestion) => (\n <option key={suggestion} value={suggestion} />\n ))}\n </datalist>\n )}\n </>\n )\n}\n\n// Local-buffer number input to avoid focus loss when parent re-renders\nfunction NumberInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n}: {\n value: number | string | null | undefined\n onChange: (v: number | undefined) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n}) {\n const serializedValue = value !== undefined && value !== null ? String(value) : ''\n const [local, setLocal] = React.useState<string>(serializedValue)\n const isFocusedRef = React.useRef(false)\n const commitIfChanged = React.useCallback(() => {\n if (local === serializedValue) return\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n }, [local, onChange, serializedValue])\n \n React.useEffect(() => {\n // Only sync from props when not focused to avoid caret jumps\n if (!isFocusedRef.current) {\n setLocal(serializedValue)\n }\n }, [serializedValue])\n \n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value\n setLocal(next)\n const numValue = next === '' ? undefined : Number(next)\n onChange(numValue)\n }, [onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, onSubmit])\n \n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n \n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n \n return (\n <Input\n type=\"number\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Local-buffer textarea to avoid form-wide re-renders while typing\nfunction TextAreaInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n maxLength,\n showCount,\n rows,\n disabled,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n maxLength?: number\n showCount?: boolean\n rows?: number\n disabled?: boolean\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\n\n React.useEffect(() => {\n if (!isFocusedRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value\n setLocal(next)\n onChange(next)\n }, [onChange])\n\n const handleFocus = React.useCallback(() => { isFocusedRef.current = true }, [])\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n\n return (\n <Textarea\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n maxLength={maxLength}\n showCount={showCount}\n rows={rows}\n disabled={disabled}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Markdown editor \u2014 WYSIWYG MDXEditor (Lexical) wired to the CrudForm value/onChange contract.\ntype MDProps = { value?: string; onChange: (md: string) => void }\n\nconst MarkdownEditor = React.memo(function MarkdownEditor({ value = '', onChange }: MDProps) {\n return <MarkdownField value={value} onChange={onChange} />\n}, (prev, next) => prev.value === next.value)\n\n// HTML Rich Text editor wrapper for the CrudForm builtin `editor: 'html'`.\n// Maps the existing `ui.forms.richtext.*` i18n keys onto the `RichEditor`\n// `labels` contract and pins the `standard` toolbar variant \u2014 heading\n// dropdown + B/I/U + lists + link, matching the legacy behaviour plus\n// the Figma `164611:20259` heading selector.\ntype HtmlRichEditorFieldProps = { value?: string; onChange: (html: string) => void }\nconst HtmlRichEditorField = React.memo(function HtmlRichEditorField({ value = '', onChange }: HtmlRichEditorFieldProps) {\n const t = useT()\n const labels = React.useMemo<Partial<RichEditorLabels>>(() => ({\n bold: t('ui.forms.richtext.bold'),\n italic: t('ui.forms.richtext.italic'),\n underline: t('ui.forms.richtext.underline'),\n unorderedList: t('ui.forms.richtext.list'),\n orderedList: t('ui.forms.richtext.orderedList', 'Numbered list'),\n heading: t('ui.forms.richtext.heading', 'Heading'),\n heading1: t('ui.forms.richtext.heading1', 'Heading 1'),\n heading2: t('ui.forms.richtext.heading2', 'Heading 2'),\n heading3: t('ui.forms.richtext.heading3'),\n paragraph: t('ui.forms.richtext.paragraph', 'Paragraph'),\n link: t('ui.forms.richtext.link'),\n linkUrlPrompt: t('ui.forms.richtext.linkUrlPrompt'),\n placeholder: t('ui.forms.richtext.placeholder'),\n comment: t('ui.forms.richtext.comment', 'Add comment'),\n mention: t('ui.forms.richtext.mention', 'Mention'),\n more: t('ui.forms.richtext.more', 'More'),\n }), [t])\n return <RichEditor value={value} onChange={onChange} variant=\"full\" labels={labels} />\n}, (prev, next) => prev.value === next.value)\n\n// Very simple markdown editor with Bold/Italic/Underline + shortcuts.\ntype SimpleMDProps = { value?: string; onChange: (md: string) => void }\nconst SimpleMarkdownEditor = React.memo(function SimpleMarkdownEditor({ value = '', onChange }: SimpleMDProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const markdownPlaceholder = t('ui.forms.richtext.placeholder')\n const sampleText = t('ui.forms.richtext.sampleText')\n const taRef = React.useRef<HTMLTextAreaElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const wrap = (before: string, after: string = before) => {\n const el = taRef.current\n if (!el) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n const sel = value.slice(start, end) || sampleText\n const next = value.slice(0, start) + before + sel + after + value.slice(end)\n onChange(next)\n queueMicrotask(() => {\n const caret = start + before.length + sel.length + after.length\n el.focus()\n el.setSelectionRange(caret, caret)\n })\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const key = e.key.toLowerCase()\n if (key === 'b') { e.preventDefault(); wrap('**') }\n if (key === 'i') { e.preventDefault(); wrap('_') }\n if (key === 'u') { e.preventDefault(); wrap('__') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('**')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('_')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('__')}>{underlineLabel}</Button>\n </div>\n <textarea\n ref={taRef}\n className=\"w-full min-h-[100px] sm:min-h-[160px] resize-y px-2 py-2 font-mono text-sm outline-none\"\n spellCheck={false}\n value={local}\n onChange={(e) => { typingRef.current = true; setLocal(e.target.value) }}\n onBlur={() => { if (typingRef.current) { typingRef.current = false; onChange(local) } }}\n onKeyDown={onKeyDown}\n placeholder={markdownPlaceholder}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\ntype FieldControlProps = {\n field: CrudField\n value: unknown\n error?: string\n options: CrudFieldOption[]\n setValue: (id: string, v: unknown) => void\n onBlurRequest: (fieldId: string) => void\n values: Record<string, unknown>\n loadFieldOptions: (field: CrudField, query?: string) => Promise<CrudFieldOption[]>\n autoFocus: boolean\n onSubmitRequest: () => void\n wrapperClassName?: string\n entityIdForField?: string\n recordId?: string\n markRequired?: boolean\n}\n\nfunction supportsWrapperBlurValidation(field: CrudField): boolean {\n return (\n field.type === 'text' ||\n field.type === 'password' ||\n field.type === 'textarea' ||\n field.type === 'checkbox' ||\n field.type === 'select' ||\n field.type === 'number'\n )\n}\n\ntype ListboxMultiSelectProps = {\n options: CrudFieldOption[]\n placeholder?: string\n value: string[]\n onChange: (vals: string[]) => void\n autoFocus?: boolean\n}\n\nconst ListboxMultiSelect = React.memo(function ListboxMultiSelect({\n options,\n placeholder,\n value,\n onChange,\n autoFocus,\n}: ListboxMultiSelectProps) {\n const t = useT()\n const searchPlaceholder = placeholder || t('ui.forms.listbox.searchPlaceholder')\n const noMatchesLabel = t('ui.forms.listbox.noMatches')\n const [query, setQuery] = React.useState('')\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [options, query])\n const toggle = React.useCallback(\n (val: string) => {\n const set = new Set(value)\n if (set.has(val)) set.delete(val)\n else set.add(val)\n onChange(Array.from(set))\n },\n [value, onChange]\n )\n return (\n <div className=\"w-full\">\n <Input\n className=\"mb-2\"\n size=\"sm\"\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filtered.map((opt) => {\n const isSel = value.includes(opt.value)\n return (\n <Button\n key={opt.value}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggle(opt.value)}\n className={`w-full justify-start rounded-none font-normal px-3 py-2 ${isSel ? 'bg-muted' : ''}`}\n >\n <span className=\"inline-flex items-center gap-2\">\n {/* Decorative selection indicator \u2014 NOT an interactive Checkbox.\n The enclosing Button owns the click; a real Radix Checkbox here\n nests a <button> inside a <button> (hydration error) and its\n Presence/ref lifecycle drives an infinite update loop when the\n listbox renders selected values. A plain span mirrors the DS\n checkbox look without any of that. */}\n <span\n aria-hidden=\"true\"\n className={`inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border transition-colors ${\n isSel\n ? 'border-accent-indigo bg-accent-indigo text-accent-indigo-foreground'\n : 'border-input bg-background'\n }`}\n >\n {isSel ? <Check className=\"size-3.5\" aria-hidden=\"true\" /> : null}\n </span>\n <span>{opt.label}</span>\n </span>\n </Button>\n )\n })}\n {!filtered.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">{noMatchesLabel}</div>\n ) : null}\n </div>\n </div>\n )\n})\n\nconst FieldControl = React.memo(function FieldControlImpl({\n field,\n value,\n error,\n options,\n setValue,\n onBlurRequest,\n values,\n loadFieldOptions,\n autoFocus,\n onSubmitRequest,\n wrapperClassName,\n entityIdForField,\n recordId,\n markRequired,\n}: FieldControlProps) {\n const t = useT()\n const fieldSetValue = React.useCallback(\n (nextValue: unknown) => setValue(field.id, nextValue),\n [setValue, field.id]\n )\n const setFormValue = React.useCallback(\n (targetId: string, nextValue: unknown) => setValue(targetId, nextValue),\n [setValue],\n )\n const builtin = field.type === 'custom' ? null : field\n const hasLoader = typeof builtin?.loadOptions === 'function'\n const disabled = Boolean(field.disabled)\n const readOnly = Boolean(field.readOnly)\n const autoFocusField = autoFocus && !disabled\n\n React.useEffect(() => {\n if (!hasLoader || field.type === 'custom') return\n loadFieldOptions(field).catch(() => {})\n }, [field, hasLoader, loadFieldOptions])\n\n const placeholder = builtin?.placeholder\n const rootClassName = wrapperClassName ? `space-y-1 ${wrapperClassName}` : 'space-y-1'\n const validateOnWrapperBlur = supportsWrapperBlurValidation(field)\n const singleSelectValue = Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n const singleSelectOptionsKey = React.useMemo(\n () => options.map((opt) => `${opt.value}:${opt.label}`).join('\\0'),\n [options],\n )\n const singleSelectLabel = singleSelectValue\n ? options.find((option) => option.value === singleSelectValue)?.label\n : undefined\n\n return (\n <div\n className={rootClassName}\n data-crud-field-id={field.id}\n onBlur={validateOnWrapperBlur\n ? (event) => {\n const nextFocused = event.relatedTarget\n if (nextFocused instanceof Node && event.currentTarget.contains(nextFocused)) return\n onBlurRequest(field.id)\n }\n : undefined}\n >\n {field.type !== 'checkbox' && field.label.trim().length > 0 ? (\n <label className=\"block text-sm font-medium\">\n {field.label}\n {field.required || markRequired ? <span className=\"text-status-error-text\"> *</span> : null}\n </label>\n ) : null}\n {field.type === 'text' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n suggestions={field.type === 'text' ? field.suggestions : undefined}\n />\n )}\n {field.type === 'password' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n inputType=\"password\"\n />\n )}\n {field.type === 'number' && (\n <NumberInput\n value={typeof value === 'number' || typeof value === 'string' ? value : null}\n placeholder={placeholder}\n onChange={fieldSetValue}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n />\n )}\n {field.type === 'date' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime-local' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, \"yyyy-MM-dd'T'HH:mm\") : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datepicker' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? date.toISOString() : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'time' && (\n <TimePicker\n value={typeof value === 'string' ? value : null}\n onChange={(time) => setValue(field.id, time ?? undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n />\n )}\n {field.type === 'textarea' && (\n <TextAreaInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n maxLength={builtin?.maxLength}\n showCount={builtin?.showCount}\n rows={builtin?.rows}\n disabled={disabled}\n />\n )}\n {field.type === 'richtext' && builtin?.editor === 'simple' && (\n <SimpleMarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && builtin?.editor === 'html' && (\n <HtmlRichEditorField value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && (!builtin?.editor || (builtin.editor !== 'simple' && builtin.editor !== 'html')) && (\n <MarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'tags' && (\n <TagsInput\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suppressInitialSuggestionsOnFocus={autoFocusField}\n suggestions={options.map((opt) => ({ value: opt.value, label: opt.label }))}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n />\n )}\n {field.type === 'combobox' && (\n <ComboboxInput\n value={typeof value === 'string' ? value : String(value ?? '')}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={\n builtin?.suggestions\n ? builtin.suggestions\n : options.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n seedOptions={\n builtin?.seedOptions\n ? builtin.seedOptions.map((opt) => ({ value: opt.value, label: opt.label }))\n : undefined\n }\n resolveLabel={builtin?.resolveLabel}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n allowCustomValues={builtin?.allowCustomValues ?? true}\n clearable={!field.required}\n disabled={disabled}\n />\n )}\n {field.type === 'checkbox' && (\n <label className=\"inline-flex items-center gap-2 cursor-pointer\">\n <Checkbox\n checked={value === true}\n onCheckedChange={(next) => setValue(field.id, next === true)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )}\n {field.type === 'select' && !builtin?.multiple && (\n <Select\n key={`${field.id}:${singleSelectValue}:${singleSelectOptionsKey}`}\n // Radix Select MUST be either always-controlled or always-uncontrolled.\n // Passing `value={undefined}` on first render and a string later trips\n // React's \"uncontrolled \u2192 controlled\" warning and breaks Radix's\n // internal state (dropdown flashes / selections no-op). Use empty\n // string for \"no selection\" instead \u2014 Radix treats it the same as\n // undefined for matching SelectItems but keeps the prop type stable.\n value={singleSelectValue}\n onValueChange={(next) => {\n // Custom field clears must be explicit nulls; normal optional\n // fields keep the existing undefined clear semantics.\n if (!next || next === SELECT_CLEAR_SENTINEL) {\n const isCustomField = field.id.startsWith('cf_') || field.id.startsWith('cf:')\n setValue(field.id, isCustomField ? null : undefined)\n return\n }\n setValue(field.id, next)\n }}\n disabled={disabled}\n >\n <SelectTrigger data-crud-focus-target=\"\">\n <SelectValue placeholder={t('ui.forms.select.emptyOption', '\u2014')}>\n {singleSelectLabel}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {!field.required && value != null && value !== '' && (\n <SelectItem value={SELECT_CLEAR_SENTINEL}>\n {t('ui.forms.select.clearOption', '\u2014 Clear \u2014')}\n </SelectItem>\n )}\n {options\n .filter((opt) => opt.value !== '')\n .map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox === true && (\n <ListboxMultiSelect\n options={options}\n placeholder={placeholder}\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(vals) => setValue(field.id, vals)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox !== true && (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((opt) => {\n const arr = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n const checked = arr.includes(opt.value)\n return (\n <label key={opt.value} className=\"inline-flex items-center gap-2 cursor-pointer\">\n <Checkbox\n checked={checked}\n onCheckedChange={(state) => {\n const next = new Set(arr)\n if (state === true) {\n next.add(opt.value)\n } else {\n next.delete(opt.value)\n }\n setValue(field.id, Array.from(next))\n }}\n disabled={disabled}\n />\n <span className=\"text-sm\">{opt.label}</span>\n </label>\n )\n })}\n </div>\n )}\n {field.type === 'relation' && (\n <RelationSelect\n options={options}\n placeholder={placeholder}\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(selected) => setValue(field.id, selected)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'custom' && (\n <>\n {field.component({\n id: field.id,\n value,\n error,\n setValue: fieldSetValue,\n setFormValue,\n values,\n entityId: entityIdForField,\n recordId,\n autoFocus,\n disabled,\n })}\n </>\n )}\n {field.description ? (\n <div className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <div>{field.description}</div>\n </div>\n ) : null}\n {error ? <div className=\"text-xs text-status-error-text\">{error}</div> : null}\n </div>\n )\n},\n(prev, next) =>\n prev.field.id === next.field.id &&\n prev.field.type === next.field.type &&\n prev.field.label === next.field.label &&\n prev.field.description === next.field.description &&\n prev.field.required === next.field.required &&\n prev.markRequired === next.markRequired &&\n prev.value === next.value &&\n prev.error === next.error &&\n prev.options === next.options &&\n prev.loadFieldOptions === next.loadFieldOptions &&\n prev.autoFocus === next.autoFocus &&\n prev.onSubmitRequest === next.onSubmitRequest &&\n prev.setValue === next.setValue &&\n prev.onBlurRequest === next.onBlurRequest &&\n prev.wrapperClassName === next.wrapperClassName &&\n prev.entityIdForField === next.entityIdForField &&\n prev.recordId === next.recordId &&\n (prev.field.type !== 'custom' ||\n (prev.values === next.values &&\n prev.field.component === (next.field as CrudCustomField).component))\n)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { z } from 'zod'\nimport { useRouter } from 'next/navigation'\nimport {\n DndContext,\n closestCenter,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type Activators,\n} from '@dnd-kit/core'\nimport type { KeyboardSensorOptions } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy, useSortable, arrayMove } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { DataLoader } from '../primitives/DataLoader'\nimport { Checkbox } from '../primitives/checkbox'\nimport { Input } from '../primitives/input'\nimport { PasswordInput } from '../primitives/password-input'\nimport { Textarea } from '../primitives/textarea'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../primitives/select'\nimport { flash } from './FlashMessages'\nimport { FormHeader } from './forms/FormHeader'\nimport { FormFooter } from './forms/FormFooter'\nimport { Button } from '../primitives/button'\nimport { IconButton } from '../primitives/icon-button'\nimport {\n Check,\n Settings,\n Layers,\n Tag,\n Sparkles,\n Package,\n Shirt,\n Grid,\n ShoppingBag,\n ShoppingCart,\n Store,\n Users,\n Briefcase,\n Building,\n BookOpen,\n Bookmark,\n Camera,\n Car,\n Clock,\n Cloud,\n Compass,\n CreditCard,\n Database,\n Flame,\n Gift,\n Globe,\n Heart,\n Info,\n Key,\n Map as MapIcon,\n Palette,\n Shield,\n Star,\n Truck,\n Zap,\n Coins,\n} from 'lucide-react'\nimport { loadGeneratedFieldRegistrations } from './fields/registry'\nimport type { CustomFieldDefDto, CustomFieldDefinitionsPayload, CustomFieldsetDto } from './utils/customFieldDefs'\nimport { isDefVisible } from './utils/customFieldDefs'\nimport { buildFormFieldsFromCustomFields, buildFormFieldFromCustomFieldDef } from './utils/customFieldForms'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { TagsInput } from './inputs/TagsInput'\nimport { ComboboxInput } from './inputs/ComboboxInput'\nimport { format } from 'date-fns/format'\nimport { parseISO } from 'date-fns/parseISO'\nimport type { Locale } from 'date-fns/locale'\nimport { DateTimePicker } from './inputs/DateTimePicker'\nimport { TimePicker } from './inputs/TimePicker'\nimport { DatePicker } from './inputs/DatePicker'\nimport { mapCrudServerErrorToFormErrors, parseServerMessage } from './utils/serverErrors'\nimport { withScopedApiRequestHeaders } from './utils/apiCall'\nimport { buildOptimisticLockHeader, extractOptimisticLockConflict } from './utils/optimisticLock'\nimport { surfaceRecordConflict } from './conflicts'\nimport type { CustomFieldDefLike } from '@open-mercato/shared/modules/entities/validation'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../primitives/dialog'\nimport { FieldDefinitionsManager, type FieldDefinitionsManagerHandle } from './custom-fields/FieldDefinitionsManager'\nimport { useConfirmDialog } from './confirm-dialog'\nimport { useInjectionSpotEvents, InjectionSpot, useInjectionWidgets } from './injection/InjectionSpot'\nimport { dispatchBackendMutationError } from './injection/mutationEvents'\nimport { VersionHistoryAction } from './version-history/VersionHistoryAction'\nimport { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useInjectionDataWidgets } from './injection/useInjectionDataWidgets'\nimport { CollapsibleGroup, type CollapsibleGroupHandle } from './crud/CollapsibleGroup'\nimport { SortableGroupHandleProvider, type SortableGroupHandleProps } from './crud/SortableGroupHandle'\nimport { useGroupOrder } from './crud/useGroupOrder'\nimport { InjectedField } from './injection/InjectedField'\nimport type { InjectionFieldDefinition, FieldContext } from '@open-mercato/shared/modules/widgets/injection'\nimport { evaluateInjectedVisibility } from './injection/visibility-utils'\nimport { ComponentReplacementHandles } from '@open-mercato/shared/modules/widgets/component-registry'\nimport { RichEditor, type RichEditorLabels } from '../primitives/rich-editor'\nimport MarkdownField from './inputs/MarkdownField'\n\n// Stable empty options array to avoid creating a new [] every render\nconst EMPTY_OPTIONS: CrudFieldOption[] = []\n// Sentinel for the optional-Select clear affordance. Radix Select forbids\n// empty-string item values, so we use a stable non-empty token that maps to\n// `undefined` in the change handler.\nconst SELECT_CLEAR_SENTINEL = '__crudform_select_clear__'\nconst FOCUSABLE_SELECTOR =\n '[data-crud-focus-target], input:not([type=\"hidden\"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\nconst CRUDFORM_EXTENDED_EVENTS_ENABLED = parseBooleanWithDefault(\n process.env.NEXT_PUBLIC_OM_CRUDFORM_EXTENDED_EVENTS_ENABLED,\n true,\n)\n\nfunction evaluateFieldVisibility(\n visibleWhen: { field: string; equals: string | number | boolean } | undefined,\n values: Record<string, unknown>,\n): boolean {\n if (!visibleWhen) return true\n return values[visibleWhen.field] === visibleWhen.equals\n}\n\nfunction isFormControlTarget(target: EventTarget | null): boolean {\n if (!target || typeof (target as Element).tagName !== 'string') return false\n const el = target as HTMLElement\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction resolveActivatorEventTarget(event: React.SyntheticEvent | Event): EventTarget | null {\n const native = (event as React.SyntheticEvent).nativeEvent\n if (native && typeof (native as Event).target !== 'undefined') return (native as Event).target\n return (event as Event).target ?? null\n}\n\nclass GuardedKeyboardSensor extends KeyboardSensor {\n static activators: Activators<KeyboardSensorOptions> = KeyboardSensor.activators.map((activator) => ({\n eventName: activator.eventName,\n handler: (event, options, context) => {\n if (isFormControlTarget(resolveActivatorEventTarget(event))) return false\n return activator.handler(event, options, context)\n },\n }))\n}\n\nfunction resolveInternalNavigationTarget(target: string | URL | null | undefined): string | null {\n if (typeof window === 'undefined' || target == null) return null\n try {\n const url = target instanceof URL ? target : new URL(target, window.location.origin)\n if (url.origin !== window.location.origin) return null\n const currentPath = `${window.location.pathname}${window.location.search}`\n const nextPath = `${url.pathname}${url.search}`\n if (nextPath === currentPath) return null\n return `${url.pathname}${url.search}${url.hash}`\n } catch {\n return null\n }\n}\n\nfunction buildResolvedEntityIdsKey(entityId?: string, entityIds?: string[]): string {\n const dedup = new Set<string>()\n const list: string[] = []\n\n if (Array.isArray(entityIds) && entityIds.length) {\n entityIds.forEach((id) => {\n const trimmed = typeof id === 'string' ? id.trim() : ''\n if (!trimmed || dedup.has(trimmed)) return\n dedup.add(trimmed)\n list.push(trimmed)\n })\n } else if (typeof entityId === 'string' && entityId.trim().length > 0) {\n list.push(entityId.trim())\n }\n\n return list.join('\\0')\n}\n\nexport type CrudFieldBase = {\n id: string\n label: string\n placeholder?: string\n description?: React.ReactNode // inline field-level help\n required?: boolean\n /**\n * Simple conditional visibility for base fields.\n * When not satisfied, the field is not rendered and is excluded from blur validation.\n */\n visibleWhen?: { field: string; equals: string | number | boolean }\n layout?: 'full' | 'half' | 'third'\n disabled?: boolean\n readOnly?: boolean\n defaultValue?: unknown\n}\n\nexport type CrudFieldOption = { value: string; label: string }\n\nexport type CrudBuiltinField = CrudFieldBase & {\n type:\n | 'text'\n | 'password'\n | 'textarea'\n | 'checkbox'\n | 'select'\n | 'number'\n | 'date'\n | 'datepicker'\n | 'datetime-local'\n | 'datetime'\n | 'time'\n | 'tags'\n | 'richtext'\n | 'relation'\n | 'combobox'\n placeholder?: string\n options?: CrudFieldOption[]\n multiple?: boolean\n listbox?: boolean\n // for relation/select style fields; if provided, options are loaded on mount\n loadOptions?: (query?: string) => Promise<CrudFieldOption[]>\n // when type === 'richtext', choose editor implementation\n editor?: 'simple' | 'uiw' | 'html'\n // for text fields; provides datalist suggestions while allowing free-text input\n suggestions?: string[]\n // for combobox fields; allow custom values or restrict to suggestions only\n allowCustomValues?: boolean\n // for combobox fields; hydrate the option map up front so a pre-selected value\n // (typically an FK whose row is not on the first page of `loadOptions`) renders\n // its label without requiring the user to focus the field\n seedOptions?: CrudFieldOption[]\n // for combobox fields; resolve a pre-selected value to its display label when it\n // is not covered by `options`/`seedOptions`/`loadOptions` results (may be async)\n resolveLabel?: (value: string) => string | Promise<string>\n // for text/textarea fields; HTML maxLength + (textarea only) char counter when showCount=true\n maxLength?: number\n // for textarea fields; show character counter (requires maxLength)\n showCount?: boolean\n // for textarea fields; min height in rows\n rows?: number\n // for datetime/time fields\n minuteStep?: number\n minDate?: Date\n maxDate?: Date\n displayFormat?: string\n closeOnSelect?: boolean\n locale?: Locale\n}\n\nexport type CrudCustomFieldRenderProps = {\n id: string\n value: unknown\n error?: string\n autoFocus?: boolean\n disabled?: boolean\n values?: Record<string, unknown>\n setValue: (value: unknown) => void\n // Optional helper to update other form values from within a custom field\n setFormValue?: (id: string, value: unknown) => void\n // Optional context for advanced custom inputs\n entityId?: string\n recordId?: string\n}\n\nexport type CrudCustomField = CrudFieldBase & {\n type: 'custom'\n component: (props: CrudCustomFieldRenderProps) => React.ReactNode\n}\n\nexport type CrudField = CrudBuiltinField | CrudCustomField\n\ntype CrudFormValues<TValues extends Record<string, unknown>> = Partial<TValues> & Record<string, unknown>\n\nexport type CrudFormSubmitContext = {\n submitter?: {\n id?: string\n name?: string\n value?: string\n dataset: Record<string, string>\n }\n}\n\nexport type CrudFormProps<TValues extends Record<string, unknown>> = {\n schema?: z.ZodType<TValues>\n fields: CrudField[]\n initialValues?: Partial<TValues>\n /**\n * When true, suppresses the form's mount-time autofocus entirely.\n * Hosts can keep this enabled while async record data is still loading, then\n * flip it off once the initial values are ready to let the first field gain focus.\n */\n disableInitialFocus?: boolean\n submitLabel?: string\n submitIcon?: React.ComponentType<{ className?: string }>\n formId?: string\n customFieldsLoadingMessage?: string\n cancelHref?: string\n successRedirect?: string\n deleteRedirect?: string\n onSubmit?: (values: TValues, context?: CrudFormSubmitContext) => Promise<void> | void\n onDelete?: () => Promise<void> | void\n // When true, shows Delete button whenever onDelete is provided, even without an id\n deleteVisible?: boolean\n /**\n * OSS opt-in optimistic locking (spec: .ai/specs/implemented/2026-05-25-oss-optimistic-locking.md).\n *\n * When set to a non-empty ISO-8601 string (typically `record.updatedAt`\n * from the API response), the form auto-injects the\n * `x-om-ext-optimistic-lock-expected-updated-at` extension header on\n * every PUT / PATCH / DELETE issued through the underlying `onSubmit` /\n * `onDelete` callbacks (via `withScopedApiRequestHeaders`). When the\n * server-side guard is opted in for the resource and the timestamp is\n * stale, the API responds with a structured 409 conflict body.\n *\n * Strictly additive: when the prop is absent / null / empty, the form\n * behaves exactly as before (no header injected).\n */\n optimisticLockUpdatedAt?: string | null\n /**\n * Opt out of optimistic locking entirely for this form. When `true`, the\n * extension header is never attached, regardless of `optimisticLockUpdatedAt`\n * or the value auto-derived from `initialValues.updatedAt`. Use for forms\n * whose locking is owned elsewhere (e.g. sales document sub-resources guarded\n * at the command layer against the parent aggregate) or for entities without\n * an `updated_at` column.\n */\n disableOptimisticLock?: boolean\n // Legacy field-only grid toggle. Use `groups` for advanced layout.\n twoColumn?: boolean\n title?: string\n backHref?: string\n // Optional extra action buttons rendered next to Delete/Cancel/Save\n // Useful for custom links like \"Show Records\" etc.\n extraActions?: React.ReactNode\n /** When provided, shows a Version History clock icon in the header that opens a side panel. */\n versionHistory?: {\n resourceKind: string\n resourceId: string\n canUndoRedo?: boolean\n autoCheckAcl?: boolean\n }\n // When provided, CrudForm will fetch custom field definitions and append\n // form-editable custom fields automatically to the provided `fields`.\n entityId?: string\n entityIds?: string[]\n // Optional grouped layout rendered in two responsive columns (1 on mobile).\n groups?: CrudFormGroup[]\n // Loading state for the entire form (e.g., when loading record data)\n isLoading?: boolean\n loadingMessage?: string\n // User-defined entity mode: all fields are custom, use bare keys (no cf_)\n customEntity?: boolean\n // Embedded mode hides outer chrome; useful for inline sections\n embedded?: boolean\n // Hide the footer action bar (Save/Cancel/Delete) when embedding in a custom layout\n hideFooterActions?: boolean\n /**\n * Opt-in: track dirty state even when `embedded` is true, AND enable the form's built-in\n * navigation protection (beforeunload, link-click intercept, pushState/replaceState/popstate).\n *\n * Default: false \u2014 preserves pre-existing behavior where embedded forms do not maintain\n * internal unsaved-changes state and leave navigation guarding to the parent page.\n *\n * When enabled, the parent may also subscribe to dirty transitions via `onDirtyChange` to\n * mirror the state in its own UI (disabled save button, header indicators, etc.).\n */\n trackDirtyWhenEmbedded?: boolean\n onDirtyChange?: (dirty: boolean) => void\n // Optional custom content injected between the header actions and the form body\n contentHeader?: React.ReactNode\n readOnly?: boolean\n readOnlyOverlay?: React.ReactNode\n // Optional mapping of entityId -> form value key storing the selected fieldset code\n customFieldsetBindings?: Record<string, { valueKey: string }>\n // Optional injection spot ID for widget injection\n injectionSpotId?: string\n replacementHandle?: string\n // Enable collapsible group headers with localStorage persistence.\n // Pass `true` to enable with auto-generated pageType, or `{ pageType }` for explicit key.\n collapsibleGroups?: boolean | { pageType: string; chevronPosition?: 'left' | 'right' }\n /**\n * Enable drag-and-drop reordering of groups with localStorage persistence.\n * NOTE: Only column-1 groups are sortable. Column-2 (sidebar) groups are fixed\n * by design and always render in their declared order.\n */\n sortableGroups?: boolean | { pageType: string }\n // Lets the host page allow specific internal navigation targets to bypass\n // the unsaved-changes guard (e.g. navigating between sub-pages of the same record).\n // The function receives the resolved internal target (`pathname + search + hash`).\n shouldBypassUnsavedChangesGuard?: (target: string) => boolean\n}\n\n// Group-level custom component context\nexport type CrudFormGroupComponentProps = {\n values: Record<string, unknown>\n setValue: (id: string, v: unknown) => void\n errors: Record<string, string>\n /**\n * Field ids that active injection widgets declare as required (e.g. the SEO\n * helper). Custom group components that render their own labels can use this\n * to show a required marker that appears/disappears with the widget.\n */\n requiredFieldIds?: ReadonlySet<string>\n}\n\n// Special group kind for automatic Custom Fields section\nexport type CrudFormGroup = {\n id: string\n title?: string\n column?: 1 | 2\n description?: string\n // Either list field ids, inline field configs, or mix of both\n fields?: (CrudField | string)[]\n // Inject a custom component into the group card\n component?: (ctx: CrudFormGroupComponentProps) => React.ReactNode\n // When kind === 'customFields', the group renders form-editable custom fields\n kind?: 'customFields'\n // When true, render component output inline without wrapping group chrome\n bare?: boolean\n}\n\nfunction readByDotPath(source: Record<string, unknown> | undefined, path: string): unknown {\n if (!source || !path) return undefined\n if (Object.prototype.hasOwnProperty.call(source, path)) return source[path]\n const segments = path.split('.').filter(Boolean)\n let current: unknown = source\n for (const segment of segments) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\n// Keys that would mutate the prototype chain if used as dot-path segments.\n// Guard against them so a declared field id such as `__proto__.polluted` can\n// never reach into Object.prototype (prototype-pollution hardening).\nconst PROTO_POLLUTING_KEYS = new Set(['__proto__', 'prototype', 'constructor'])\n\nfunction isProtoPollutingKey(key: string): boolean {\n return PROTO_POLLUTING_KEYS.has(key)\n}\n\nfunction writeByDotPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const segments = path.split('.').filter(Boolean)\n if (segments.length === 0) return\n if (segments.some(isProtoPollutingKey)) return\n let current: Record<string, unknown> = target\n for (let index = 0; index < segments.length - 1; index++) {\n const segment = segments[index]\n const existing = current[segment]\n const isSafeObject =\n !!existing &&\n typeof existing === 'object' &&\n !Array.isArray(existing) &&\n (Object.getPrototypeOf(existing) === Object.prototype || Object.getPrototypeOf(existing) === null)\n\n if (!isSafeObject) {\n const created = Object.create(null) as Record<string, unknown>\n current[segment] = created\n current = created\n } else {\n current = existing as Record<string, unknown>\n }\n }\n const finalSegment = segments[segments.length - 1]\n if (isProtoPollutingKey(finalSegment)) return\n current[finalSegment] = value\n}\n\n// Collapse flat dot-path keys (e.g. `metadata.category`) declared as base form\n// fields into the nested object the schema expects (`{ metadata: { category } }`).\n// The flat keys are preserved alongside the nested projection so that forms whose\n// schema declares the flat keys directly keep working \u2014 CrudForm's non-strict\n// schema.safeParse retains whichever representation the schema declares and strips\n// the other. See issue #2503 (\"Latent framework gap\").\nfunction collapseDotPathFields(\n source: Record<string, unknown>,\n dotPathFieldIds: ReadonlySet<string>,\n): Record<string, unknown> {\n if (!dotPathFieldIds.size) return source\n let result: Record<string, unknown> | null = null\n for (const fieldId of dotPathFieldIds) {\n if (!Object.prototype.hasOwnProperty.call(source, fieldId)) continue\n if (!result) result = { ...source }\n writeByDotPath(result, fieldId, source[fieldId])\n }\n return result ?? source\n}\n\nfunction readInitialCustomFieldValue(\n source: Record<string, unknown> | undefined,\n key: string,\n): unknown {\n if (!source || !key) return undefined\n const candidates = [`cf_${key}`, `cf:${key}`, key]\n for (const candidate of candidates) {\n if (Object.prototype.hasOwnProperty.call(source, candidate)) {\n return source[candidate]\n }\n }\n return undefined\n}\n\nfunction readRenderedFieldValue(\n source: Record<string, unknown>,\n fieldId: string,\n): unknown {\n if (Object.prototype.hasOwnProperty.call(source, fieldId)) {\n return source[fieldId]\n }\n if (fieldId.startsWith('cf_')) {\n return readInitialCustomFieldValue(source, fieldId.slice(3))\n }\n if (fieldId.startsWith('cf:')) {\n return readInitialCustomFieldValue(source, fieldId.slice(3))\n }\n return undefined\n}\n\nfunction serializeIssuePath(path: ReadonlyArray<string | number | symbol>): string | null {\n if (!Array.isArray(path) || path.length === 0) return null\n const segments = path\n .map((segment) => {\n if (typeof segment === 'string' || typeof segment === 'number') {\n const normalized = String(segment).trim()\n return normalized.length > 0 ? normalized : null\n }\n return null\n })\n .filter((segment): segment is string => segment !== null)\n return segments.length > 0 ? segments.join('.') : null\n}\n\nfunction normalizeDirtySnapshotValue(value: unknown): unknown {\n if (value === undefined || value === null || value === '') return undefined\n if (Array.isArray(value)) {\n const normalized = value\n .map((entry) => normalizeDirtySnapshotValue(entry))\n .filter((entry) => entry !== undefined)\n return normalized.length ? normalized : undefined\n }\n if (typeof value !== 'object') return value\n\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) return value\n\n const normalized: Record<string, unknown> = {}\n const record = value as Record<string, unknown>\n for (const key of Object.keys(record).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))) {\n const nextValue = normalizeDirtySnapshotValue(record[key])\n if (nextValue !== undefined) normalized[key] = nextValue\n }\n return Object.keys(normalized).length ? normalized : undefined\n}\n\nfunction createDirtySnapshot(source: Record<string, unknown>): string {\n return JSON.stringify(normalizeDirtySnapshotValue(source) ?? {})\n}\n\nfunction createDirtyValueSnapshot(value: unknown): string {\n return JSON.stringify(normalizeDirtySnapshotValue(value) ?? null)\n}\n\nconst FIELDSET_ICON_COMPONENTS: Record<string, React.ComponentType<{ className?: string }>> = {\n layers: Layers,\n tag: Tag,\n sparkles: Sparkles,\n package: Package,\n shirt: Shirt,\n grid: Grid,\n shoppingBag: ShoppingBag,\n shoppingCart: ShoppingCart,\n store: Store,\n users: Users,\n briefcase: Briefcase,\n building: Building,\n bookOpen: BookOpen,\n bookmark: Bookmark,\n camera: Camera,\n car: Car,\n clock: Clock,\n cloud: Cloud,\n compass: Compass,\n creditCard: CreditCard,\n database: Database,\n flame: Flame,\n gift: Gift,\n globe: Globe,\n heart: Heart,\n key: Key,\n map: MapIcon,\n palette: Palette,\n shield: Shield,\n star: Star,\n truck: Truck,\n zap: Zap,\n coins: Coins,\n}\n\ntype CustomFieldGroupLayout = {\n code: string | null\n label?: string\n hint?: string\n fields: CrudField[]\n}\n\ntype CustomFieldSectionLayout = {\n entityId: string\n fieldsetCode: string | null\n fieldset?: CustomFieldsetDto\n title: string\n description?: string\n groups: CustomFieldGroupLayout[]\n}\n\ntype CustomFieldEntityLayout = {\n entityId: string\n sections: CustomFieldSectionLayout[]\n availableFieldsets: CustomFieldsetDto[]\n singleFieldsetPerRecord: boolean\n hasFieldsets: boolean\n activeFieldset: string | null\n}\n\nclass FieldDefinitionsManagerErrorBoundary extends React.Component<\n { children: React.ReactNode; onClose: () => void; unavailableMessage: string },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode; onClose: () => void; unavailableMessage: string }) {\n super(props)\n this.state = { hasError: false }\n }\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 p-6 text-sm text-muted-foreground\">\n <p>{this.props.unavailableMessage}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={this.props.onClose}>\n Close\n </Button>\n </div>\n )\n }\n return this.props.children\n }\n}\n\nfunction SortableGroupItem({ id, children, disabled }: { id: string; children: React.ReactNode; disabled?: boolean }) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id, disabled })\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n position: 'relative' as const,\n }\n const handleProps = React.useMemo<SortableGroupHandleProps>(() => ({\n ref: setActivatorNodeRef,\n attributes: attributes as unknown as Record<string, unknown>,\n listeners: listeners as unknown as Record<string, unknown> | undefined,\n isDragging,\n disabled: !!disabled,\n }), [setActivatorNodeRef, attributes, listeners, isDragging, disabled])\n return (\n <div ref={setNodeRef} style={style}>\n <SortableGroupHandleProvider value={handleProps}>{children}</SortableGroupHandleProvider>\n </div>\n )\n}\n\nexport function CrudForm<TValues extends Record<string, unknown>>({\n schema,\n fields,\n initialValues,\n disableInitialFocus = false,\n submitLabel,\n submitIcon,\n formId: providedFormId,\n customFieldsLoadingMessage,\n cancelHref,\n successRedirect,\n deleteRedirect,\n onSubmit,\n onDelete,\n deleteVisible,\n optimisticLockUpdatedAt,\n disableOptimisticLock = false,\n twoColumn = false,\n title,\n backHref,\n entityId,\n entityIds,\n groups,\n isLoading = false,\n loadingMessage,\n customEntity = false,\n embedded = false,\n hideFooterActions = false,\n trackDirtyWhenEmbedded = false,\n onDirtyChange,\n extraActions,\n versionHistory,\n contentHeader,\n readOnly = false,\n readOnlyOverlay,\n customFieldsetBindings,\n injectionSpotId,\n replacementHandle,\n collapsibleGroups,\n sortableGroups,\n shouldBypassUnsavedChangesGuard,\n}: CrudFormProps<TValues>) {\n // Ensure module field components are registered (client-side)\n React.useEffect(() => { loadGeneratedFieldRegistrations().catch(() => {}) }, [])\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const t = useT()\n const resolvedSubmitLabel = submitLabel ?? t('ui.forms.actions.save')\n const resolvedLoadingMessage = loadingMessage ?? t('ui.forms.loading')\n const resolvedCustomFieldsLoadingMessage = customFieldsLoadingMessage ?? resolvedLoadingMessage\n const cancelLabel = t('ui.forms.actions.cancel')\n const deleteLabel = t('ui.forms.actions.delete')\n const savingLabel = t('ui.forms.status.saving')\n const backLabel = t('ui.navigation.back')\n const customFieldsLabel = t('entities.customFields.title')\n const fieldsetSelectorLabel = t('entities.customFields.fieldsetSelectorLabel', 'Fieldset')\n const emptyFieldsetMessage = t('entities.customFields.emptyFieldset', 'No fields defined for this fieldset.')\n const defaultFieldsetLabel = t('entities.customFields.defaultFieldset', 'Default')\n const manageFieldsetLabel = t('entities.customFields.manageFieldset', 'Manage fields')\n const fieldsetDialogTitle = t('entities.customFields.manageDialogTitle', 'Edit custom fields')\n const fieldsetDialogUnavailable = t('entities.customFields.manageDialogUnavailable', 'Field definitions page is unavailable.')\n const hasVersionHistory = Boolean(versionHistory?.resourceKind)\n const deleteConfirmMessage = hasVersionHistory\n ? t('ui.forms.confirmDeleteWithUndo', 'Delete this record? You can restore it using version history.')\n : t('ui.forms.confirmDelete')\n const deleteSuccessMessage = t('ui.forms.flash.deleteSuccess')\n const deleteErrorMessage = t('ui.forms.flash.deleteError')\n const saveErrorMessage = t('ui.forms.flash.saveError')\n const internalFormId = React.useId()\n const formId = providedFormId ?? internalFormId\n const formReadOnly = Boolean(readOnly)\n const [values, setValues] = React.useState<CrudFormValues<TValues>>(\n () => ({ ...(initialValues ?? {}) } as CrudFormValues<TValues>)\n )\n const valuesRef = React.useRef(values)\n const [errors, setErrors] = React.useState<Record<string, string>>({})\n const [pending, setPending] = React.useState(false)\n // Synchronous guard against re-entrant submit/delete invocations (e.g. rapid\n // double-clicks of \"Save\" while validation and network IO are still running).\n // React state is async, so `pending` cannot block a click that fires before\n // the next render; a ref flips on the first call and rejects duplicates.\n const submittingRef = React.useRef(false)\n const deletingRef = React.useRef(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const [dynamicOptions, setDynamicOptions] = React.useState<Record<string, CrudFieldOption[]>>({})\n const [cfDefinitions, setCfDefinitions] = React.useState<CustomFieldDefDto[]>([])\n const [cfMetadata, setCfMetadata] = React.useState<CustomFieldDefinitionsPayload | null>(null)\n const [cfFieldsetSelections, setCfFieldsetSelections] = React.useState<Record<string, string | null>>({})\n const [isLoadingCustomFields, setIsLoadingCustomFields] = React.useState(false)\n const [customFieldDefsVersion, setCustomFieldDefsVersion] = React.useState(0)\n const [fieldsetEditorTarget, setFieldsetEditorTarget] = React.useState<{ entityId: string; fieldsetCode: string | null; view: 'entity' | 'fieldset' } | null>(null)\n const [isInDialog, setIsInDialog] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n\n // Collapsible groups support\n const collapsibleGroupsEnabled = Boolean(collapsibleGroups)\n const collapsiblePageType = typeof collapsibleGroups === 'object' ? collapsibleGroups.pageType : formId\n const collapsibleChevronPosition = typeof collapsibleGroups === 'object' ? collapsibleGroups.chevronPosition : undefined\n const groupCollapseRefs = React.useRef(new Map<string, CollapsibleGroupHandle>())\n\n // Sortable groups support\n const sortableGroupsEnabled = Boolean(sortableGroups)\n const sortablePageType = typeof sortableGroups === 'object' ? sortableGroups.pageType : formId\n const fieldsetManagerRef = React.useRef<FieldDefinitionsManagerHandle | null>(null)\n const resolvedEntityIdsKey = React.useMemo(() => buildResolvedEntityIdsKey(entityId, entityIds), [entityId, entityIds])\n const resolvedEntityIds = React.useMemo(\n () => (resolvedEntityIdsKey ? resolvedEntityIdsKey.split('\\0') : []),\n [resolvedEntityIdsKey],\n )\n const primaryEntityId = resolvedEntityIds.length ? resolvedEntityIds[0] : null\n\n // Injection spot events for widget lifecycle management\n const resolvedInjectionSpotId = React.useMemo(() => {\n if (injectionSpotId) return injectionSpotId\n if (resolvedEntityIds.length) {\n const normalized = resolvedEntityIds[0].replace(/[:]+/g, '.')\n return `crud-form:${normalized}`\n }\n return undefined\n }, [injectionSpotId, resolvedEntityIds])\n const resolvedReplacementHandle = React.useMemo(() => {\n if (replacementHandle) return replacementHandle\n if (resolvedEntityIds.length) return ComponentReplacementHandles.crudForm(resolvedEntityIds[0].replace(/[:]+/g, '.'))\n return ComponentReplacementHandles.crudForm('unknown')\n }, [replacementHandle, resolvedEntityIds])\n const headerInjectionSpotId = resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:header` : undefined\n \n const recordId = React.useMemo(() => {\n const raw = values.id\n if (typeof raw === 'string') return raw\n if (typeof raw === 'number') return String(raw)\n return undefined\n }, [values])\n const fallbackRecordId = recordId || (\n versionHistory?.resourceId === undefined || versionHistory.resourceId === null\n ? undefined\n : String(versionHistory.resourceId).trim() || undefined\n )\n\n const operation = recordId ? 'update' : 'create'\n\n // Resolve the optimistic-lock version used to build the extension header.\n // Explicit `optimisticLockUpdatedAt` (including `null`) always wins. When the\n // prop is absent, auto-derive from the loaded record's `updatedAt`/`updated_at`\n // so every edit CrudForm enforces optimistic locking by default without\n // per-form wiring. Presence of a loaded `updatedAt` \u2014 NOT the create/update\n // heuristic \u2014 drives this: some edit pages keep the record id outside form\n // values (so `operation` reads as `create`), while a genuine create has no\n // `updatedAt` in `initialValues`. Even a \"duplicate\"-style create that carries\n // one is harmless \u2014 the server ignores the header on inserts (no candidate id).\n // `disableOptimisticLock` always wins; an explicit prop (incl. `null`) wins next.\n const resolvedOptimisticLockUpdatedAt = React.useMemo<string | null | undefined>(() => {\n if (disableOptimisticLock) return null\n if (optimisticLockUpdatedAt !== undefined) return optimisticLockUpdatedAt\n const source = initialValues as Record<string, unknown> | undefined\n const camel = source?.updatedAt\n if (typeof camel === 'string' && camel.length > 0) return camel\n const snake = source?.updated_at\n if (typeof snake === 'string' && snake.length > 0) return snake\n return null\n }, [disableOptimisticLock, optimisticLockUpdatedAt, initialValues])\n\n const injectionContext = React.useMemo(() => ({\n formId,\n entityId: primaryEntityId,\n resourceKind: versionHistory?.resourceKind,\n resourceId: recordId ?? versionHistory?.resourceId,\n recordId: fallbackRecordId,\n isLoading,\n pending,\n operation,\n }), [formId, primaryEntityId, versionHistory?.resourceKind, versionHistory?.resourceId, recordId, fallbackRecordId, isLoading, pending, operation])\n const injectionContextRef = React.useRef(injectionContext)\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n React.useEffect(() => {\n valuesRef.current = values\n }, [values])\n\n const isDirtyRef = React.useRef(false)\n const navigationPromptBypassRef = React.useRef(false)\n const navigationConfirmPendingRef = React.useRef(false)\n const submitNavigationBypassRef = React.useRef(false)\n const submitNavigationBypassTimeoutRef = React.useRef<number | null>(null)\n const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false)\n const popStateRollbackRef = React.useRef(false)\n const shouldBypassUnsavedChangesGuardRef = React.useRef(shouldBypassUnsavedChangesGuard)\n React.useEffect(() => {\n shouldBypassUnsavedChangesGuardRef.current = shouldBypassUnsavedChangesGuard\n }, [shouldBypassUnsavedChangesGuard])\n\n React.useEffect(() => {\n // Preserve pre-existing behavior: embedded forms do not track dirty state by default.\n // Opt-in via `trackDirtyWhenEmbedded` when the parent actually needs the callback.\n if (embedded && !trackDirtyWhenEmbedded) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const snapshot = dirtyBaselineSnapshotRef.current\n if (!snapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const currentSnapshot = createDirtySnapshot(values as Record<string, unknown>)\n const dirty = currentSnapshot !== snapshot\n isDirtyRef.current = dirty\n setHasUnsavedChanges(dirty)\n }, [embedded, trackDirtyWhenEmbedded, values])\n\n React.useEffect(() => {\n onDirtyChange?.(hasUnsavedChanges)\n }, [hasUnsavedChanges, onDirtyChange])\n\n const allowNextNavigation = React.useCallback(() => {\n navigationPromptBypassRef.current = true\n if (typeof window !== 'undefined') {\n window.setTimeout(() => {\n navigationPromptBypassRef.current = false\n }, 0)\n }\n }, [])\n\n const clearSubmitNavigationBypass = React.useCallback(() => {\n submitNavigationBypassRef.current = false\n if (typeof window !== 'undefined' && submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n submitNavigationBypassTimeoutRef.current = null\n }\n }, [])\n\n const keepSubmitNavigationBypassAlive = React.useCallback(() => {\n if (typeof window === 'undefined') return\n submitNavigationBypassRef.current = true\n if (submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n }\n submitNavigationBypassTimeoutRef.current = window.setTimeout(() => {\n submitNavigationBypassRef.current = false\n submitNavigationBypassTimeoutRef.current = null\n }, 1500)\n }, [])\n\n React.useEffect(() => {\n return () => {\n clearSubmitNavigationBypass()\n }\n }, [clearSubmitNavigationBypass])\n\n const clearDirtyState = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n const source = snapshotSource ?? (valuesRef.current as Record<string, unknown>)\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(source)\n dirtyBaselineValuesRef.current = { ...source }\n userEditedFieldIdsRef.current.clear()\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n }, [])\n\n const confirmUnsavedChanges = React.useCallback(async (): Promise<boolean> => {\n if (!isDirtyRef.current || typeof window === 'undefined') return true\n if (navigationPromptBypassRef.current || submitNavigationBypassRef.current) return true\n if (navigationConfirmPendingRef.current) return false\n navigationConfirmPendingRef.current = true\n try {\n const confirmed = await confirm({\n title: t('ui.forms.confirmUnsavedChanges', 'You have unsaved changes. Are you sure you want to leave?'),\n })\n if (confirmed) allowNextNavigation()\n return confirmed\n } finally {\n navigationConfirmPendingRef.current = false\n }\n }, [allowNextNavigation, confirm, t])\n\n React.useEffect(() => {\n // Navigation protection runs when the form is tracking dirty state.\n // Embedded hosts must opt in via `trackDirtyWhenEmbedded` so parent pages that manage\n // their own protection (or have none by design) keep their pre-existing behavior.\n if ((embedded && !trackDirtyWhenEmbedded) || !hasUnsavedChanges) return\n const beforeUnloadHandler = (event: BeforeUnloadEvent) => {\n if (!isDirtyRef.current || submitNavigationBypassRef.current) return\n event.preventDefault()\n event.returnValue = ''\n }\n window.addEventListener('beforeunload', beforeUnloadHandler)\n\n const clickHandler = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (!isDirtyRef.current) return\n const anchor = (event.target as HTMLElement)?.closest?.('a[href]') as HTMLAnchorElement | null\n if (!anchor) return\n const href = anchor.getAttribute('href')\n if (!href || href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:')) return\n if (anchor.target === '_blank' || event.metaKey || event.ctrlKey || event.shiftKey) return\n const target = resolveInternalNavigationTarget(href)\n if (!target) return\n if (shouldBypassUnsavedChangesGuardRef.current?.(target)) return\n const baselineSnapshot = dirtyBaselineSnapshotRef.current\n if (baselineSnapshot && createDirtySnapshot(valuesRef.current as Record<string, unknown>) === baselineSnapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n event.preventDefault()\n event.stopPropagation()\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n router.push(target)\n })\n }\n document.addEventListener('click', clickHandler, true)\n\n const originalPushState = window.history.pushState.bind(window.history)\n const originalReplaceState = window.history.replaceState.bind(window.history)\n\n const createHistoryInterceptor = (original: History['pushState']): History['pushState'] =>\n ((data: unknown, unused: string, url?: string | URL | null) => {\n const target = resolveInternalNavigationTarget(url ?? null)\n if (!target || navigationPromptBypassRef.current || submitNavigationBypassRef.current) {\n return original(data, unused, url)\n }\n if (!isDirtyRef.current) {\n return original(data, unused, url)\n }\n if (shouldBypassUnsavedChangesGuardRef.current?.(target)) {\n return original(data, unused, url)\n }\n const baselineSnapshot = dirtyBaselineSnapshotRef.current\n if (baselineSnapshot && createDirtySnapshot(valuesRef.current as Record<string, unknown>) === baselineSnapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return original(data, unused, url)\n }\n if (navigationConfirmPendingRef.current) {\n return undefined\n }\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n original(data, unused, url)\n })\n return undefined\n }) as History['pushState']\n\n const popStateHandler = () => {\n if (popStateRollbackRef.current) {\n popStateRollbackRef.current = false\n return\n }\n if (!isDirtyRef.current || navigationPromptBypassRef.current || submitNavigationBypassRef.current) return\n popStateRollbackRef.current = true\n window.history.go(1)\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n allowNextNavigation()\n window.history.back()\n })\n }\n\n window.history.pushState = createHistoryInterceptor(originalPushState)\n window.history.replaceState = createHistoryInterceptor(originalReplaceState)\n window.addEventListener('popstate', popStateHandler)\n\n return () => {\n window.removeEventListener('beforeunload', beforeUnloadHandler)\n document.removeEventListener('click', clickHandler, true)\n window.removeEventListener('popstate', popStateHandler)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [allowNextNavigation, clearDirtyState, confirmUnsavedChanges, embedded, hasUnsavedChanges, router, trackDirtyWhenEmbedded])\n\n const { widgets: injectionWidgets } = useInjectionWidgets(resolvedInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const { widgets: injectedFieldWidgets } = useInjectionDataWidgets(\n resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:fields` : '__disabled__:fields'\n )\n \n const { triggerEvent: triggerInjectionEvent } = useInjectionSpotEvents(resolvedInjectionSpotId ?? '', injectionWidgets)\n const extendedInjectionEventsEnabled = CRUDFORM_EXTENDED_EVENTS_ENABLED && Boolean(resolvedInjectionSpotId)\n\n // Fields that active injection widgets declare as required (e.g. the SEO helper\n // enforcing a description). The host renders a visual required marker for these;\n // enforcement stays in the widget's own onBeforeSave validation.\n const widgetRequiredFieldIds = React.useMemo(() => {\n const ids = new Set<string>()\n for (const widget of injectionWidgets ?? []) {\n const metadata = widget.module?.metadata\n if (!metadata || metadata.enabled === false) continue\n for (const fieldId of metadata.requiredFields ?? []) ids.add(fieldId)\n }\n return ids\n }, [injectionWidgets])\n\n const transformValidationErrors = React.useCallback(\n async (fieldErrors: Record<string, string>): Promise<Record<string, string>> => {\n if (!extendedInjectionEventsEnabled || !Object.keys(fieldErrors).length) return fieldErrors\n try {\n const result = await triggerInjectionEvent(\n 'transformValidation',\n fieldErrors as unknown as TValues,\n injectionContextRef.current,\n { originalData: valuesRef.current as TValues },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) return fieldErrors\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([key, value]) => [key, String(value)]),\n )\n } catch (err) {\n console.error('[CrudForm] Error in transformValidation:', err)\n return fieldErrors\n }\n },\n [extendedInjectionEventsEnabled, triggerInjectionEvent],\n )\n\n const translateValidationMessage = React.useCallback(\n (message: string | null | undefined): string => {\n if (typeof message !== 'string') return ''\n const trimmed = message.trim()\n if (!trimmed) return ''\n return t(trimmed, trimmed)\n },\n [t],\n )\n\n const translateValidationErrors = React.useCallback(\n (fieldErrors: Record<string, string>): Record<string, string> =>\n Object.fromEntries(\n Object.entries(fieldErrors).map(([fieldId, message]) => [fieldId, translateValidationMessage(message)]),\n ),\n [translateValidationMessage],\n )\n\n const mapDefsForValidation = React.useCallback(\n (definitions: CustomFieldDefDto[]): CustomFieldDefLike[] =>\n definitions.map((definition) => ({\n key: definition.key,\n kind: definition.kind,\n configJson: {\n validation: Array.isArray(definition.validation) ? definition.validation : [],\n },\n })),\n [],\n )\n\n const canNavigateTo = React.useCallback(\n async (target: string): Promise<boolean> => {\n if (!extendedInjectionEventsEnabled) return true\n try {\n const result = await triggerInjectionEvent(\n 'onBeforeNavigate',\n valuesRef.current as TValues,\n injectionContextRef.current,\n { target },\n )\n if (!result.ok) {\n flash(result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return false\n }\n return true\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return false\n }\n },\n [extendedInjectionEventsEnabled, t, triggerInjectionEvent],\n )\n\n const navigateWithGuard = React.useCallback(\n async (target: string) => {\n if (!target) return\n const allowed = await canNavigateTo(target)\n if (allowed) {\n allowNextNavigation()\n router.push(target)\n }\n },\n [allowNextNavigation, canNavigateTo, router],\n )\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof window === 'undefined') return\n const handleEvent = (event: Event) => {\n const customEvent = event as CustomEvent<unknown>\n void triggerInjectionEvent('onAppEvent', valuesRef.current as TValues, injectionContextRef.current, {\n appEvent: customEvent.detail,\n }).catch((err) => {\n console.error('[CrudForm] Error in onAppEvent:', err)\n })\n }\n window.addEventListener('om:event', handleEvent as EventListener)\n return () => {\n window.removeEventListener('om:event', handleEvent as EventListener)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof document === 'undefined') return\n const emitVisibility = () => {\n void triggerInjectionEvent('onVisibilityChange', valuesRef.current as TValues, injectionContextRef.current, {\n visible: document.visibilityState === 'visible',\n }).catch((err) => {\n console.error('[CrudForm] Error in onVisibilityChange:', err)\n })\n }\n document.addEventListener('visibilitychange', emitVisibility)\n emitVisibility()\n return () => {\n document.removeEventListener('visibilitychange', emitVisibility)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled) return\n const root = rootRef.current\n if (!root || typeof window === 'undefined') return\n const handleClickCapture = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n const targetElement = event.target instanceof Element ? event.target : null\n const linkElement = targetElement?.closest('a[href]')\n if (!(linkElement instanceof HTMLAnchorElement)) return\n if (!root.contains(linkElement)) return\n if (linkElement.target && linkElement.target !== '_self') return\n const rawHref = linkElement.getAttribute('href')\n if (!rawHref || rawHref.startsWith('#')) return\n let target = rawHref\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://')) {\n try {\n const parsed = new URL(rawHref)\n if (parsed.origin !== window.location.origin) return\n target = `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return\n }\n } else if (!rawHref.startsWith('/')) {\n return\n }\n event.preventDefault()\n void navigateWithGuard(target)\n }\n root.addEventListener('click', handleClickCapture, true)\n return () => {\n root.removeEventListener('click', handleClickCapture, true)\n }\n }, [extendedInjectionEventsEnabled, navigateWithGuard])\n \n React.useEffect(() => {\n const root = rootRef.current\n if (!root) return\n setIsInDialog(Boolean(root.closest('[data-dialog-content]')))\n }, [])\n const dialogFooterClass = isInDialog\n ? 'sticky bottom-0 left-0 right-0 z-20 -mx-6 px-6 bg-card border-t border-border/70 py-2 sm:-mx-6 sm:px-6'\n : ''\n // No bottom padding on the dialog form. The previous `pb-20` left an 80px gap below\n // the sticky footer in every dialog whose content fit the viewport (the form sized to\n // content + 80px with the footer as its last child) \u2014 visible as empty white space at\n // the bottom of Quick deal, Add stage, Activity composer, etc. The sticky footer\n // handles the overflow case on its own: when content scrolls, the footer stays pinned\n // to the dialog's bottom and the user can scroll fields above it.\n const dialogFormPadding = ''\n\n const buildCustomFieldsManageHref = React.useCallback(\n (targetEntityId: string | null) => {\n if (!targetEntityId) return null\n try {\n const encoded = encodeURIComponent(targetEntityId)\n return customEntity ? `/backend/entities/user/${encoded}` : `/backend/entities/system/${encoded}`\n } catch {\n return null\n }\n },\n [customEntity],\n )\n\n const refreshCustomFieldDefinitions = React.useCallback(() => {\n setCustomFieldDefsVersion((prev) => prev + 1)\n }, [])\n\n // Unified delete handler with confirmation\n const handleDelete = React.useCallback(async () => {\n if (!onDelete) return\n if (deletingRef.current) return\n deletingRef.current = true\n const deletePayload = values as TValues\n try {\n const confirmed = await confirm({\n title: deleteConfirmMessage,\n variant: 'destructive',\n })\n if (!confirmed) return\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeDelete', deletePayload, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n setPending(true)\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n const optimisticLockHeader = buildOptimisticLockHeader(resolvedOptimisticLockUpdatedAt)\n const mergedDeleteHeaders = {\n ...(injectionRequestHeaders ?? {}),\n ...optimisticLockHeader,\n }\n if (Object.keys(mergedDeleteHeaders).length > 0) {\n await withScopedApiRequestHeaders(mergedDeleteHeaders, async () => {\n await onDelete()\n })\n } else {\n await onDelete()\n }\n\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterDelete:', err)\n }\n }\n try { flash(deleteSuccessMessage, 'success') } catch {}\n // Redirect if requested by caller\n if (typeof deleteRedirect === 'string' && deleteRedirect) {\n await navigateWithGuard(deleteRedirect)\n }\n } catch (err) {\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDeleteError', deletePayload, injectionContext, { error: err })\n } catch (hookError) {\n console.error('[CrudForm] Error in onDeleteError:', hookError)\n }\n }\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const optimisticLockConflict = extractOptimisticLockConflict(err)\n if (optimisticLockConflict) {\n // Surface on the unified, persistent conflict bar instead of a toast.\n try { surfaceRecordConflict(err, t) } catch {}\n } else {\n const message = err instanceof Error && err.message ? err.message : deleteErrorMessage\n try { flash(message, 'error') } catch {}\n }\n } finally {\n deletingRef.current = false\n setPending(false)\n }\n }, [\n confirm,\n deleteConfirmMessage,\n deleteErrorMessage,\n deleteRedirect,\n deleteSuccessMessage,\n formId,\n injectionContext,\n onDelete,\n resolvedInjectionSpotId,\n navigateWithGuard,\n t,\n transformValidationErrors,\n triggerInjectionEvent,\n values,\n ])\n \n // Determine whether this form is creating a new record (no `id` yet)\n const isNewRecord = React.useMemo(() => {\n const rawId = values.id\n if (rawId === undefined || rawId === null) return true\n return typeof rawId === 'string' ? rawId.trim().length === 0 : false\n }, [values])\n const showDelete = Boolean(onDelete) && (typeof deleteVisible === 'boolean' ? deleteVisible : !isNewRecord)\n const versionHistoryEnabled = Boolean(versionHistory?.resourceId && String(versionHistory.resourceId).trim().length > 0)\n const versionHistoryAction = (\n <VersionHistoryAction\n config={versionHistoryEnabled ? versionHistory! : null}\n t={t}\n canUndoRedo={versionHistory?.canUndoRedo}\n autoCheckAcl={versionHistory?.autoCheckAcl}\n />\n )\n const headerInjectionAction = headerInjectionSpotId ? (\n <InjectionSpot\n spotId={headerInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ) : null\n const headerExtraActions = versionHistoryEnabled || headerInjectionAction || extraActions ? (\n <>\n {versionHistoryEnabled ? versionHistoryAction : null}\n {headerInjectionAction}\n {extraActions}\n </>\n ) : undefined\n\n // Auto-append custom fields for this entityId\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n if (!resolvedEntityIds.length) { \n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n return \n }\n \n setIsLoadingCustomFields(true)\n try {\n const mod = await import('./utils/customFieldForms')\n const { definitions, metadata } = await mod.fetchCustomFieldFormStructure(resolvedEntityIds, undefined, { bareIds: customEntity })\n if (!cancelled) {\n setCfDefinitions(definitions)\n setCfMetadata(metadata)\n setCfFieldsetSelections((prev) => {\n const next: Record<string, string | null> = {}\n let changed = false\n resolvedEntityIds.forEach((entityId) => {\n const existing = prev[entityId]\n const fieldsets = metadata.fieldsetsByEntity?.[entityId] ?? []\n const defaultSelection = fieldsets[0]?.code ?? null\n const value = existing !== undefined ? existing : defaultSelection\n next[entityId] = value\n if (existing !== value) changed = true\n })\n if (Object.keys(prev).length !== Object.keys(next).length) changed = true\n return changed ? next : prev\n })\n setIsLoadingCustomFields(false)\n }\n } catch {\n if (!cancelled) {\n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n }\n }\n }\n load()\n return () => { cancelled = true }\n }, [resolvedEntityIds, customEntity, customFieldDefsVersion])\n\n React.useEffect(() => {\n if (!customFieldsetBindings) return\n setCfFieldsetSelections((prev) => {\n let changed = false\n const next = { ...prev }\n resolvedEntityIds.forEach((entityId) => {\n const binding = customFieldsetBindings[entityId]\n if (!binding) return\n const raw = values[binding.valueKey]\n if (typeof raw === 'string' && raw.trim().length > 0) {\n const normalized = raw.trim()\n if (next[entityId] !== normalized) {\n next[entityId] = normalized\n changed = true\n }\n }\n })\n return changed ? next : prev\n })\n }, [customFieldsetBindings, resolvedEntityIds, values])\n\n const fieldsetsByEntity = cfMetadata?.fieldsetsByEntity ?? {}\n const entitySettings = cfMetadata?.entitySettings ?? {}\n\n const { cfFields, customFieldLayout } = React.useMemo(() => {\n if (!cfDefinitions.length) return { cfFields: [], customFieldLayout: [] as CustomFieldEntityLayout[] }\n const aggregated: CrudField[] = []\n const layout: CustomFieldEntityLayout[] = []\n const defsByEntity = new globalThis.Map<string, CustomFieldDefDto[]>()\n cfDefinitions.forEach((def) => {\n const entityId = typeof def.entityId === 'string' && def.entityId.trim().length\n ? def.entityId.trim()\n : resolvedEntityIds[0]\n if (!entityId) return\n const bucket = defsByEntity.get(entityId) ?? []\n bucket.push(def)\n defsByEntity.set(entityId, bucket)\n })\n\n const buildSection = (\n entityId: string,\n fieldsetCode: string | null,\n defList: CustomFieldDefDto[],\n fieldset?: CustomFieldsetDto,\n ): CustomFieldSectionLayout | null => {\n if (!defList.length) return null\n const groupsMap = new globalThis.Map<string, CustomFieldGroupLayout>()\n const order: string[] = []\n const fieldsetGroupMap = new globalThis.Map<string, { title?: string; hint?: string; code: string }>()\n if (Array.isArray(fieldset?.groups)) {\n fieldset.groups.forEach((group) => {\n if (!group?.code) return\n fieldsetGroupMap.set(group.code, { code: group.code, title: group.title, hint: group.hint })\n })\n }\n const sortedDefs = [...defList]\n .filter((definition) => isDefVisible(definition, 'form'))\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n const ensureBucket = (code: string | null, def: CustomFieldDefDto): CustomFieldGroupLayout => {\n const key = code ?? '__default__'\n let bucket = groupsMap.get(key)\n if (!bucket) {\n const fallbackMeta = code ? fieldsetGroupMap.get(code) : undefined\n const directMeta = code ? def.group : undefined\n const label =\n code === null\n ? undefined\n : directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || code\n const hint = directMeta?.hint || fallbackMeta?.hint\n bucket = { code, label, hint, fields: [] }\n groupsMap.set(key, bucket)\n order.push(key)\n } else if (code && !bucket.label) {\n const fallbackMeta = fieldsetGroupMap.get(code)\n const directMeta = def.group ?? undefined\n bucket.label = directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || bucket.label\n bucket.hint = directMeta?.hint || fallbackMeta?.hint || bucket.hint\n }\n return bucket\n }\n sortedDefs.forEach((definition) => {\n const field = buildFormFieldFromCustomFieldDef(definition, { bareIds: customEntity })\n if (!field) return\n aggregated.push(field)\n const bucket = ensureBucket(definition.group?.code ?? null, definition)\n bucket.fields.push(field)\n })\n const groups = order\n .map((key) => groupsMap.get(key)!)\n .filter((group) => group.fields.length > 0)\n if (!groups.length) return null\n return {\n entityId,\n fieldsetCode,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups,\n }\n }\n\n const entityIds = resolvedEntityIds.length ? resolvedEntityIds : Array.from(defsByEntity.keys())\n entityIds.forEach((entityId) => {\n const defsForEntity = defsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) return\n const availableFieldsets = fieldsetsByEntity[entityId] ?? []\n const hasFieldsets = availableFieldsets.length > 0\n const singleFieldsetPerRecord =\n entitySettings[entityId]?.singleFieldsetPerRecord !== false\n const defsByFieldset = new globalThis.Map<string | null, CustomFieldDefDto[]>()\n defsForEntity.forEach((def) => {\n const memberships = Array.isArray(def.fieldsets)\n ? def.fieldsets\n .filter((entry): entry is string => typeof entry === 'string')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : []\n if (memberships.length > 0) {\n memberships.forEach((code) => {\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n return\n }\n const code = typeof def.fieldset === 'string' && def.fieldset.trim().length > 0 ? def.fieldset.trim() : null\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n const sections: CustomFieldSectionLayout[] = []\n\n const createEmptySection = (code: string | null): CustomFieldSectionLayout => {\n const fieldset = code ? availableFieldsets.find((fs) => fs.code === code) : undefined\n return {\n entityId,\n fieldsetCode: code,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups: [],\n }\n }\n\n if (!hasFieldsets) {\n const fallbackDefs =\n defsByFieldset.get(null) ?? Array.from(defsByFieldset.values()).flat()\n const section = buildSection(entityId, null, fallbackDefs, undefined)\n if (section) sections.push(section)\n } else if (singleFieldsetPerRecord) {\n const availableCodes = availableFieldsets.map((fs) => fs.code)\n const activeFieldset =\n cfFieldsetSelections[entityId] && availableCodes.includes(cfFieldsetSelections[entityId]!)\n ? cfFieldsetSelections[entityId]\n : availableFieldsets[0]?.code ?? null\n const targetDefs = activeFieldset ? defsByFieldset.get(activeFieldset) ?? [] : defsByFieldset.get(null) ?? []\n const targetSection = activeFieldset\n ? buildSection(\n entityId,\n activeFieldset,\n targetDefs,\n availableFieldsets.find((fs) => fs.code === activeFieldset),\n )\n : buildSection(entityId, null, targetDefs, undefined)\n if (targetSection) {\n sections.push(targetSection)\n } else if (activeFieldset) {\n sections.push(createEmptySection(activeFieldset))\n }\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length && activeFieldset) {\n const generalSection = buildSection(entityId, null, unassigned, undefined)\n if (generalSection) sections.push(generalSection)\n }\n } else {\n availableFieldsets.forEach((fieldset) => {\n const list = defsByFieldset.get(fieldset.code) ?? []\n const section = buildSection(entityId, fieldset.code, list, fieldset)\n if (section) sections.push(section)\n })\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length) {\n const section = buildSection(entityId, null, unassigned, undefined)\n if (section) sections.push(section)\n }\n }\n\n if (!sections.length && hasFieldsets) {\n const fallbackCode = availableFieldsets[0]?.code ?? null\n sections.push(createEmptySection(fallbackCode))\n }\n\n layout.push({\n entityId,\n sections,\n availableFieldsets,\n singleFieldsetPerRecord,\n hasFieldsets,\n activeFieldset: cfFieldsetSelections[entityId] ?? availableFieldsets[0]?.code ?? null,\n })\n })\n\n return { cfFields: aggregated, customFieldLayout: layout }\n }, [\n cfDefinitions,\n cfFieldsetSelections,\n customEntity,\n customFieldsLabel,\n entitySettings,\n fieldsetsByEntity,\n resolvedEntityIds,\n ])\n\n const injectedFieldDefinitions = React.useMemo<InjectionFieldDefinition[]>(() => {\n const definitions: InjectionFieldDefinition[] = []\n for (const widget of injectedFieldWidgets) {\n if (!('fields' in widget)) continue\n for (const field of widget.fields ?? []) {\n definitions.push(field as InjectionFieldDefinition)\n }\n }\n return definitions\n }, [injectedFieldWidgets])\n\n const injectedFieldContext = React.useMemo<FieldContext>(() => {\n const recordValues = values as Record<string, unknown>\n const organizationId = typeof recordValues.organizationId === 'string' ? recordValues.organizationId : null\n const tenantId = typeof recordValues.tenantId === 'string' ? recordValues.tenantId : null\n const userId = typeof recordValues.userId === 'string' ? recordValues.userId : null\n return {\n organizationId,\n tenantId,\n userId,\n record: recordValues,\n }\n }, [values])\n\n const hiddenBaseFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n const recordValues = values as Record<string, unknown>\n for (const field of fields) {\n if (!evaluateFieldVisibility(field.visibleWhen, recordValues)) {\n hidden.add(field.id)\n }\n }\n return hidden\n }, [fields, values])\n\n const hiddenInjectedFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n for (const definition of injectedFieldDefinitions) {\n if (!evaluateInjectedVisibility(definition.visibleWhen, values as Record<string, unknown>, injectedFieldContext)) {\n hidden.add(definition.id)\n }\n }\n return hidden\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n const injectedFieldIdSet = React.useMemo(\n () => new Set(injectedFieldDefinitions.map((definition) => definition.id)),\n [injectedFieldDefinitions],\n )\n\n const injectedCrudFields = React.useMemo<CrudField[]>(() => {\n return injectedFieldDefinitions.map((definition) => ({\n id: definition.id,\n label: definition.label,\n type: 'custom',\n readOnly: definition.readOnly,\n component: ({ value, setValue, values: formValues }) => (\n <InjectedField\n field={definition}\n value={value}\n onChange={(_, nextValue) => setValue(nextValue)}\n context={injectedFieldContext}\n formData={(formValues ?? values) as Record<string, unknown>}\n />\n ),\n }))\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n\n const allFields = React.useMemo(() => {\n const base = [...fields, ...injectedCrudFields]\n\n if (groups) {\n const provided = new Set(base.map(f => f.id))\n for (const group of groups) {\n if (!group.fields) continue\n for (const entry of group.fields) {\n if (typeof entry === 'string') continue\n if (!provided.has(entry.id)) {\n provided.add(entry.id)\n base.push(entry)\n }\n }\n }\n }\n if (!cfFields.length) return base\n const provided = new Set(base.map(f => f.id))\n const extras = cfFields.filter(f => !provided.has(f.id))\n return [...base, ...extras]\n }, [fields, injectedCrudFields, cfFields, groups])\n\n const fieldById = React.useMemo(() => {\n return new globalThis.Map(allFields.map((f) => [f.id, f]))\n }, [allFields])\n\n // Declared base fields whose id is a dot-path (e.g. `metadata.category`).\n // Injected and custom (cf) fields already get dot-path/cf-path hydration and\n // are excluded here so their dedicated handling is preserved. CrudForm hydrates\n // these flat keys from nested initial values on load and projects them back into\n // nested objects before schema.safeParse on submit. See issue #2503.\n const dotPathBaseFieldIds = React.useMemo(() => {\n const ids = new Set<string>()\n const cfFieldIds = new Set(cfFields.map((field) => field.id))\n for (const field of allFields) {\n const fieldId = field.id\n if (!fieldId.includes('.')) continue\n if (injectedFieldIdSet.has(fieldId)) continue\n if (fieldId.startsWith('cf_') || fieldId.startsWith('cf:')) continue\n if (cfFieldIds.has(fieldId)) continue\n ids.add(fieldId)\n }\n return ids\n }, [allFields, injectedFieldIdSet, cfFields])\n\n const validateFieldOnBlur = React.useCallback(async (\n fieldId: string,\n sourceValues?: CrudFormValues<TValues>,\n ) => {\n if (formReadOnly) return\n const field = fieldById.get(fieldId)\n if (!field || field.disabled) return\n if (hiddenBaseFieldIds.has(fieldId) || hiddenInjectedFieldIds.has(fieldId)) return\n\n const nextValues = sourceValues ?? valuesRef.current\n const nextFieldErrors: Record<string, string> = {}\n const requiredMessage = t('ui.forms.errors.required')\n const value = nextValues[fieldId]\n const isArray = Array.isArray(value)\n const isString = typeof value === 'string'\n const empty =\n value === undefined ||\n value === null ||\n (isString && value.trim() === '') ||\n (isArray && value.length === 0) ||\n (field.type === 'checkbox' && value !== true)\n\n if (field.required && empty) {\n nextFieldErrors[fieldId] = requiredMessage\n }\n\n const customFieldKey = customEntity\n ? cfDefinitions.some((definition) => definition.key === fieldId)\n ? fieldId\n : null\n : fieldId.startsWith('cf_')\n ? fieldId.replace(/^cf_/, '')\n : null\n\n if (!Object.keys(nextFieldErrors).length && customFieldKey) {\n const defsForField = cfDefinitions.filter((definition) => definition.key === customFieldKey)\n if (defsForField.length) {\n try {\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n const validationResult = validateValuesAgainstDefs(\n { [customFieldKey]: value },\n mapDefsForValidation(defsForField),\n )\n if (!validationResult.ok) {\n const normalizedFieldErrors = customEntity\n ? Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [\n key.replace(/^cf_/, ''),\n String(message),\n ]),\n )\n : Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [key, String(message)]),\n )\n const transformedErrors = await transformValidationErrors(normalizedFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n } catch {\n // ignore client-side custom field validation if helper is unavailable\n }\n }\n }\n\n if (!Object.keys(nextFieldErrors).length && schema) {\n const widgetValues = { ...(nextValues as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n const result = schema.safeParse(collapseDotPathFields(coreValues, dotPathBaseFieldIds))\n if (!result.success) {\n const schemaFieldErrors: Record<string, string> = {}\n result.error.issues.forEach((issue) => {\n const path = serializeIssuePath(issue.path)\n if (!path) return\n if (\n path === fieldId ||\n path.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${path}.`)\n ) {\n schemaFieldErrors[path] = issue.message\n }\n })\n if (Object.keys(schemaFieldErrors).length) {\n const transformedErrors = await transformValidationErrors(schemaFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n }\n }\n\n setErrors((prev) => {\n const next = Object.fromEntries(\n Object.entries(prev).filter(([existingFieldId]) => !(\n existingFieldId === fieldId ||\n existingFieldId.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${existingFieldId}.`)\n )),\n )\n for (const [key, message] of Object.entries(nextFieldErrors)) {\n next[key] = message\n }\n const same =\n Object.keys(next).length === Object.keys(prev).length &&\n Object.entries(next).every(([key, message]) => prev[key] === message)\n return same ? prev : next\n })\n }, [\n cfDefinitions,\n customEntity,\n dotPathBaseFieldIds,\n fieldById,\n formReadOnly,\n hiddenBaseFieldIds,\n hiddenInjectedFieldIds,\n injectedFieldIdSet,\n mapDefsForValidation,\n schema,\n t,\n transformValidationErrors,\n translateValidationErrors,\n ])\n\n const allFieldsRef = React.useRef(allFields)\n allFieldsRef.current = allFields\n\n const dynamicOptionLoaderKey = React.useMemo(() => {\n return allFields\n .filter(f => f.type !== 'custom' && typeof (f as CrudBuiltinField).loadOptions === 'function')\n .map(f => f.id)\n .join('\\0')\n }, [allFields])\n\n const injectionGroupCards = React.useMemo<CrudFormGroup[]>(() => {\n if (!injectionWidgets || injectionWidgets.length === 0) return []\n const pairs = injectionWidgets\n .filter((widget) => (widget.placement?.kind ?? 'stack') === 'group')\n .map((widget) => {\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const group: CrudFormGroup = {\n id: `widget:${widget.widgetId}`,\n title: widget.placement?.groupLabel ?? widget.module.metadata.title,\n description: widget.placement?.groupDescription ?? widget.module.metadata.description,\n column: widget.placement?.column === 2 ? 2 : 1,\n component: () => (\n <widget.module.Widget\n context={injectionContext}\n data={values as unknown as CrudFormValues<TValues>}\n onDataChange={(next) => setValues(next as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ),\n }\n return { group, priority }\n })\n pairs.sort((a, b) => b.priority - a.priority)\n return pairs.map((p) => p.group)\n }, [injectionWidgets, injectionContext, pending, setValues, values])\n \n const groupsWithInjectedFields = React.useMemo(() => {\n if (!groups || groups.length === 0 || injectedFieldDefinitions.length === 0) return groups\n const cloned = groups.map((group) => ({ ...group, fields: [...(group.fields ?? [])] }))\n const fallbackIndex = cloned.length - 1\n for (const definition of injectedFieldDefinitions) {\n const targetIndex = cloned.findIndex((group) => group.id === definition.group)\n const index = targetIndex >= 0 ? targetIndex : fallbackIndex\n if (targetIndex < 0 && process.env.NODE_ENV !== 'production') {\n console.warn(`[CrudForm] Injected field \"${definition.id}\" targets group \"${definition.group}\" which does not exist. Appended to last group.`)\n }\n if (index < 0) continue\n const fieldEntries = cloned[index].fields ?? []\n if (!fieldEntries.some((entry) => typeof entry === 'string' && entry === definition.id)) {\n fieldEntries.push(definition.id)\n }\n cloned[index].fields = fieldEntries\n }\n return cloned\n }, [groups, injectedFieldDefinitions])\n\n const shouldAutoGroup = (!groupsWithInjectedFields || groupsWithInjectedFields.length === 0) && injectionGroupCards.length > 0\n const resolvedGroupsForLayout = React.useMemo(() => {\n const baseGroups = groupsWithInjectedFields && groupsWithInjectedFields.length ? groupsWithInjectedFields : []\n const autoGroup = shouldAutoGroup ? [{ id: '__auto-fields__', fields: allFields }] as CrudFormGroup[] : []\n return [...(baseGroups.length ? baseGroups : autoGroup), ...injectionGroupCards]\n }, [allFields, groupsWithInjectedFields, injectionGroupCards, shouldAutoGroup])\n const useGroupedLayout = resolvedGroupsForLayout.length > 0\n\n // Sortable group order\n const defaultGroupIds = React.useMemo(() => resolvedGroupsForLayout.map((g) => g.id), [resolvedGroupsForLayout])\n const { orderedIds: sortedGroupIds, reorder: reorderGroups } = useGroupOrder(\n sortablePageType,\n defaultGroupIds,\n )\n const sortableSensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(GuardedKeyboardSensor),\n )\n const handleGroupDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = sortedGroupIds.indexOf(String(active.id))\n const newIndex = sortedGroupIds.indexOf(String(over.id))\n if (oldIndex !== -1 && newIndex !== -1) reorderGroups(oldIndex, newIndex)\n }, [sortedGroupIds, reorderGroups])\n\n // Auto-expand collapsed groups that contain validation errors\n React.useEffect(() => {\n if (!collapsibleGroupsEnabled || Object.keys(errors).length === 0) return\n const errorFieldIds = new Set(Object.keys(errors))\n for (const g of resolvedGroupsForLayout) {\n const groupFieldIds = (g.fields ?? []).map((f) => (typeof f === 'string' ? f : f.id))\n const hasError = groupFieldIds.some((id) => errorFieldIds.has(id))\n if (hasError) {\n groupCollapseRefs.current.get(g.id)?.expand()\n }\n }\n }, [errors, collapsibleGroupsEnabled, resolvedGroupsForLayout])\n\n const stackedInjectionWidgets = React.useMemo(\n () => (injectionWidgets ?? []).filter((widget) => (widget.placement?.kind ?? 'stack') === 'stack'),\n [injectionWidgets],\n )\n\n const placedCustomFieldIds = React.useMemo(() => {\n const placed = new Set<string>()\n for (const other of (groups ?? [])) {\n if (other.kind === 'customFields' || !other.fields) continue\n for (const entry of other.fields) {\n if (typeof entry === 'string') placed.add(entry)\n else if (entry && typeof (entry as CrudField).id === 'string') placed.add((entry as CrudField).id)\n }\n }\n return placed\n }, [groups])\n\n const resolveGroupFields = React.useCallback((g: CrudFormGroup): CrudField[] => {\n if (g.kind === 'customFields') {\n return cfFields.filter((f) => !placedCustomFieldIds.has(f.id))\n }\n\n const src = g.fields || []\n const result: CrudField[] = []\n\n for (const item of src) {\n if (typeof item === 'string') {\n const found = fieldById.get(item)\n if (found) result.push(found)\n } else if (item) {\n result.push(item as CrudField)\n }\n }\n\n return result\n }, [cfFields, fieldById, placedCustomFieldIds])\n\n const customFieldsManageHref = React.useMemo(() => buildCustomFieldsManageHref(primaryEntityId), [buildCustomFieldsManageHref, primaryEntityId])\n\n const customFieldsEmptyState = React.useMemo(() => {\n const text = t('entities.customFields.empty')\n const action = t('entities.customFields.addFirst')\n return (\n <div className=\"rounded-md border border-dashed border-muted-foreground/50 bg-muted/30 px-3 py-4 text-sm text-muted-foreground\">\n <span>{text} </span>\n {customFieldsManageHref ? (\n <Link href={customFieldsManageHref} className=\"font-medium text-primary hover:underline\">\n {action}\n </Link>\n ) : (\n <span className=\"font-medium text-foreground\">{action}</span>\n )}\n </div>\n )\n }, [customFieldsManageHref, t])\n\n const firstFieldId = React.useMemo(() => {\n if (useGroupedLayout) {\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const scan = (list: CrudFormGroup[]) => {\n for (const group of list) {\n const resolved = resolveGroupFields(group)\n for (const field of resolved) {\n if (field?.id && !field.disabled) return field.id\n }\n }\n return null as string | null\n }\n\n const fromCol1 = scan(col1)\n if (fromCol1) return fromCol1\n const fromCol2 = scan(col2)\n if (fromCol2) return fromCol2\n }\n\n for (const field of allFields) {\n if (field?.id && !field.disabled) return field.id\n }\n return null\n }, [allFields, resolveGroupFields, resolvedGroupsForLayout, useGroupedLayout])\n\n const requestSubmit = React.useCallback(() => {\n if (formReadOnly) return\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId) as HTMLFormElement | null\n form?.requestSubmit()\n }, [formId, formReadOnly])\n\n const lastFocusedFieldRef = React.useRef<string | null>(null)\n const lastErrorFieldRef = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (disableInitialFocus || isLoading || isLoadingCustomFields || formReadOnly) {\n lastFocusedFieldRef.current = null\n return\n }\n\n if (!firstFieldId) return\n if (lastFocusedFieldRef.current === firstFieldId) return\n\n const run = () => {\n const form = document.getElementById(formId)\n if (!form) return\n\n // Do not steal focus if the user is already interacting with any element inside the form\n const active = typeof document !== 'undefined' ? (document.activeElement as HTMLElement | null) : null\n if (active && form.contains(active)) {\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${firstFieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n\n if (target && typeof target.focus === 'function') {\n target.focus({ preventScroll: true })\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastFocusedFieldRef.current = firstFieldId\n }\n }\n\n const frame =\n typeof window.requestAnimationFrame === 'function'\n ? window.requestAnimationFrame(run)\n : window.setTimeout(run, 0)\n\n return () => {\n if (typeof window === 'undefined') return\n if (typeof window.cancelAnimationFrame === 'function') {\n window.cancelAnimationFrame(frame as number)\n } else {\n window.clearTimeout(frame as number)\n }\n }\n }, [disableInitialFocus, firstFieldId, formId, formReadOnly, isLoading, isLoadingCustomFields])\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n const entries = Object.entries(errors)\n if (!entries.length) {\n lastErrorFieldRef.current = null\n return\n }\n const [fieldId] = entries[0]\n if (!fieldId || lastErrorFieldRef.current === fieldId) return\n\n const form = document.getElementById(formId)\n if (!form) return\n\n // Don't steal focus if the user is already typing inside the form. The auto-focus\n // is meant for \"submit failed, jump to first invalid field\" \u2014 not for \"user is\n // editing one error field and our focus jumps to a different remaining error\n // each keystroke as the errors object shrinks\". Keystrokes would otherwise land\n // in the wrong input.\n const active = document.activeElement\n if (active instanceof HTMLElement && form.contains(active)) {\n lastErrorFieldRef.current = fieldId\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(`[name=\"${fieldId}\"]`) ??\n container ??\n null\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastErrorFieldRef.current = fieldId\n }\n }, [errors, formId])\n\n // When an injection widget blocks save (e.g. the SEO helper), the blocking\n // reason is easy to miss if the relevant field or the widget panel is off-screen.\n // Deliberately scroll to the first field-mapped error, falling back to the\n // injection widget region when the widget only returns a message.\n const scrollToInjectionBlockedTarget = React.useCallback(\n (fieldErrors?: Record<string, string>) => {\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId)\n if (!form) return\n let target: HTMLElement | null = null\n for (const fieldId of fieldErrors ? Object.keys(fieldErrors) : []) {\n const fieldContainer = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n if (fieldContainer) {\n target = fieldContainer\n break\n }\n }\n if (!target) {\n target = form.querySelector<HTMLElement>('[data-crud-injection-region]')\n }\n if (target && typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n },\n [formId],\n )\n\n const updateEditedFieldMarker = React.useCallback((\n id: string,\n nextValue: unknown,\n baselineSource: Record<string, unknown> | undefined = dirtyBaselineValuesRef.current,\n ) => {\n if (\n baselineSource &&\n createDirtyValueSnapshot(baselineSource[id]) === createDirtyValueSnapshot(nextValue)\n ) {\n userEditedFieldIdsRef.current.delete(id)\n return\n }\n userEditedFieldIdsRef.current.add(id)\n }, [])\n\n const setValue = React.useCallback((id: string, nextValue: unknown) => {\n let nextData: CrudFormValues<TValues> | null = null\n let nextDirty: boolean | null = null\n const currentValue = (valuesRef.current as Record<string, unknown>)[id]\n if (!Object.is(currentValue, nextValue)) {\n updateEditedFieldMarker(id, nextValue)\n }\n setValues((prev) => {\n if (Object.is(prev[id], nextValue)) return prev\n const baselineSource = dirtyBaselineValuesRef.current ?? (prev as Record<string, unknown>)\n updateEditedFieldMarker(id, nextValue, baselineSource)\n nextData = { ...prev, [id]: nextValue } as CrudFormValues<TValues>\n valuesRef.current = nextData\n if (!(embedded && !trackDirtyWhenEmbedded)) {\n const baseline = dirtyBaselineSnapshotRef.current ?? createDirtySnapshot(prev as Record<string, unknown>)\n dirtyBaselineSnapshotRef.current = baseline\n dirtyBaselineValuesRef.current = baselineSource\n nextDirty = createDirtySnapshot(nextData as Record<string, unknown>) !== baseline\n }\n return nextData\n })\n if (nextDirty !== null) {\n isDirtyRef.current = nextDirty\n setHasUnsavedChanges(nextDirty)\n }\n const clearedMessages: string[] = []\n setErrors((prev) => {\n if (!Object.keys(prev).length) return prev\n let changed = false\n const nextEntries = Object.entries(prev).filter(([fieldId, message]) => {\n const shouldClear =\n fieldId === id ||\n fieldId.startsWith(`${id}.`) ||\n id.startsWith(`${fieldId}.`)\n if (shouldClear) {\n changed = true\n clearedMessages.push(message)\n }\n return !shouldClear\n })\n return changed ? Object.fromEntries(nextEntries) : prev\n })\n if (clearedMessages.length) {\n const highlightedMessage = t('ui.forms.errors.highlighted')\n const translatedMessages = new Set(\n clearedMessages\n .map((message) => translateValidationMessage(message))\n .filter((message) => message.trim().length > 0),\n )\n setFormError((prev) => {\n if (!prev) return prev\n const normalized = prev.trim()\n if (!normalized) return null\n if (normalized === highlightedMessage || translatedMessages.has(normalized)) {\n return null\n }\n return prev\n })\n }\n if (!nextData || !extendedInjectionEventsEnabled) return\n void triggerInjectionEvent('onFieldChange', nextData as TValues, injectionContextRef.current, {\n fieldId: id,\n fieldValue: nextValue,\n }).then((result) => {\n if (!result.ok) return\n const change = result.fieldChange\n if (!change) return\n const updates: Record<string, unknown> = { ...(change.sideEffects ?? {}) }\n if (change.value !== undefined) {\n updates[id] = change.value\n }\n if (Object.keys(updates).length > 0) {\n setValues((prev) => {\n let changed = false\n const next = { ...prev } as Record<string, unknown>\n for (const [key, value] of Object.entries(updates)) {\n if (Object.is(next[key], value)) continue\n next[key] = value\n changed = true\n }\n return changed ? (next as CrudFormValues<TValues>) : prev\n })\n }\n for (const message of change.messages ?? []) {\n flash(message.text, message.severity)\n }\n }).catch((err) => {\n console.error('[CrudForm] Error in onFieldChange:', err)\n })\n }, [embedded, extendedInjectionEventsEnabled, flash, t, trackDirtyWhenEmbedded, translateValidationMessage, triggerInjectionEvent, updateEditedFieldMarker])\n\n const onBlurRequest = React.useCallback((fieldId: string) => {\n void validateFieldOnBlur(fieldId)\n }, [validateFieldOnBlur])\n\n const handleFieldsetSelectionChange = React.useCallback(\n (entityId: string, nextCode: string | null) => {\n setCfFieldsetSelections((prev) => ({ ...prev, [entityId]: nextCode }))\n const bindingKey = customFieldsetBindings?.[entityId]?.valueKey\n if (bindingKey) {\n setValue(bindingKey, nextCode ?? undefined)\n }\n },\n [customFieldsetBindings, setValue],\n )\n\n const handleOpenFieldsetEditor = React.useCallback(\n (entityId: string, fieldsetCode: string | null, view: 'entity' | 'fieldset' = 'entity') => {\n const href = buildCustomFieldsManageHref(entityId)\n if (!href) return\n setFieldsetEditorTarget({ entityId, fieldsetCode, view })\n },\n [buildCustomFieldsManageHref],\n )\n\n const appliedInitialValuesSnapshotRef = React.useRef<string | undefined>(undefined)\n const dirtyBaselineSnapshotRef = React.useRef<string | undefined>(undefined)\n const dirtyBaselineValuesRef = React.useRef<Record<string, unknown> | undefined>(undefined)\n const userEditedFieldIdsRef = React.useRef<Set<string>>(new Set())\n React.useLayoutEffect(() => {\n if (!initialValues) return\n const snapshot = JSON.stringify({\n initialValues,\n injectedFieldIds: injectedFieldDefinitions.map((definition) => definition.id),\n customFieldMappings: cfDefinitions.map((definition) => definition.key),\n dotPathBaseFieldIds: Array.from(dotPathBaseFieldIds),\n })\n if (appliedInitialValuesSnapshotRef.current === snapshot) return\n appliedInitialValuesSnapshotRef.current = snapshot\n const initialRecord = initialValues as Record<string, unknown>\n let mergedValues: CrudFormValues<TValues> | null = null\n // Whether the user already has unsaved edits relative to the load-time baseline,\n // computed from `prev` (React's latest committed values) \u2014 NOT from isDirtyRef or\n // valuesRef, which are both updated in post-render effects and therefore still\n // hold stale values when this layout effect runs in the SAME render that async\n // custom-field / injected-field definitions arrive. That lag was the residual\n // race that let the baseline absorb an in-progress edit under load.\n let hadUnsavedEdits = false\n setValues((prev) => {\n const priorBaseline = dirtyBaselineSnapshotRef.current\n const editedFieldIds = userEditedFieldIdsRef.current\n hadUnsavedEdits =\n editedFieldIds.size > 0 ||\n priorBaseline !== undefined &&\n createDirtySnapshot(prev as Record<string, unknown>) !== priorBaseline\n const merged = { ...prev } as CrudFormValues<TValues>\n const mergedRecord = merged as Record<string, unknown>\n for (const [key, value] of Object.entries(initialValues as Record<string, unknown>)) {\n if (editedFieldIds.has(key)) continue\n mergedRecord[key] = value\n }\n for (const definition of injectedFieldDefinitions) {\n if (merged[definition.id] !== undefined) continue\n const extracted = readByDotPath(initialRecord, definition.id)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[definition.id] = extracted\n }\n }\n for (const definition of cfDefinitions) {\n const targetId = customEntity ? definition.key : `cf_${definition.key}`\n if (!targetId || merged[targetId] !== undefined) continue\n const extracted = readInitialCustomFieldValue(initialRecord, definition.key)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[targetId] = extracted\n }\n }\n for (const fieldId of dotPathBaseFieldIds) {\n if (merged[fieldId] !== undefined) continue\n const extracted = readByDotPath(initialRecord, fieldId)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[fieldId] = extracted\n }\n }\n mergedValues = merged\n return mergedValues\n })\n if (mergedValues && !hadUnsavedEdits) {\n // Do not absorb an in-progress edit into the pristine baseline. This effect\n // re-runs whenever the snapshot changes \u2014 which includes custom-field\n // definitions and injected fields loading ASYNCHRONOUSLY after mount. If the\n // user has already started editing by the time they arrive, recomputing the\n // baseline from the current (merged) values would set the baseline equal to\n // the edited values, silently clearing dirty (header Save disables, the edit\n // looks pristine) and discarding the unsaved change. Re-establish the baseline\n // only when there are no pending edits; while dirty, keep the load-time\n // baseline so the edit stays dirty until save/discard. Root cause of the flaky\n // optimistic-lock stale-edit conflicts (#2055 / TC-LOCK-OSS-015 / TC-LOCK-OSS-029).\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(mergedValues as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(mergedValues as Record<string, unknown>) }\n }\n if (!extendedInjectionEventsEnabled || !mergedValues) return\n let cancelled = false\n const run = async () => {\n try {\n const result = await triggerInjectionEvent(\n 'transformDisplayData',\n mergedValues as TValues,\n injectionContextRef.current,\n )\n const transformed = result.data\n if (cancelled || !transformed) return\n // As above: never re-apply transformed display data over an in-progress\n // edit \u2014 it would overwrite the user's unsaved changes and reset dirty.\n if (isDirtyRef.current) return\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(transformed as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(transformed as Record<string, unknown>) }\n setValues(transformed as CrudFormValues<TValues>)\n } catch (err) {\n console.error('[CrudForm] Error in transformDisplayData:', err)\n }\n }\n void run()\n return () => {\n cancelled = true\n }\n }, [\n cfDefinitions,\n customEntity,\n dotPathBaseFieldIds,\n extendedInjectionEventsEnabled,\n initialValues,\n injectedFieldDefinitions,\n triggerInjectionEvent,\n ])\n\n // Apply custom field defaults on create flows (one-time, ref-guarded).\n // Mode is determined from the host-provided initialValues prop, not from\n // the reactive values.id (which lags on async-loading edit pages).\n // We also wait for isLoading to settle so async edit pages that start with\n // initialValues={} don't get mis-detected as create flows.\n const cfDefaultsAppliedRef = React.useRef(false)\n const initialValuesHasId = React.useMemo(() => {\n if (!initialValues) return false\n const raw = (initialValues as Record<string, unknown>).id\n return raw !== undefined && raw !== null && raw !== ''\n }, [initialValues])\n\n React.useEffect(() => {\n // Do not fire while the host is still loading the record\n if (isLoading) return\n // Edit flow: initialValues contains an id \u2014 never apply defaults\n if (initialValuesHasId) return\n // Wait until custom field definitions have loaded\n if (!cfDefinitions.length) return\n // One-shot guard: do not reapply if already done\n if (cfDefaultsAppliedRef.current) return\n cfDefaultsAppliedRef.current = true\n\n const defaults: Record<string, unknown> = {}\n const prefix = customEntity ? '' : 'cf_'\n for (const def of cfDefinitions) {\n if (def.defaultValue === undefined || def.defaultValue === null) continue\n const fieldId = `${prefix}${def.key}`\n defaults[fieldId] = def.defaultValue\n }\n\n if (Object.keys(defaults).length === 0) return\n\n let mergedValues: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n const merged = { ...prev } as CrudFormValues<TValues>\n let applied = false\n for (const [fieldId, defaultVal] of Object.entries(defaults)) {\n // Skip if a value already exists (from initialValues or user input)\n if (merged[fieldId] !== undefined) continue\n ;(merged as Record<string, unknown>)[fieldId] = defaultVal\n applied = true\n }\n if (!applied) return prev\n mergedValues = merged\n return mergedValues\n })\n\n // Update the dirty baseline so the form doesn't appear dirty from defaults\n if (mergedValues) {\n dirtyBaselineSnapshotRef.current = createDirtySnapshot(mergedValues as Record<string, unknown>)\n dirtyBaselineValuesRef.current = { ...(mergedValues as Record<string, unknown>) }\n }\n }, [isLoading, initialValuesHasId, cfDefinitions, customEntity])\n\n const markFormAsClean = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n clearDirtyState(snapshotSource)\n }, [clearDirtyState])\n\n const buildFieldsetEditorHref = React.useCallback(\n (includeViewParam: boolean) => {\n if (!fieldsetEditorTarget) return null\n const base = buildCustomFieldsManageHref(fieldsetEditorTarget.entityId)\n if (!base) return null\n const params: string[] = []\n if (fieldsetEditorTarget.fieldsetCode) {\n params.push(`fieldset=${encodeURIComponent(fieldsetEditorTarget.fieldsetCode)}`)\n }\n if (includeViewParam && fieldsetEditorTarget.view === 'fieldset') {\n params.push('view=fieldset')\n }\n if (!params.length) return base\n const connector = base.includes('?') ? '&' : '?'\n return `${base}${connector}${params.join('&')}`\n },\n [buildCustomFieldsManageHref, fieldsetEditorTarget],\n )\n\n const fieldsetEditorFullHref = React.useMemo(() => buildFieldsetEditorHref(false), [buildFieldsetEditorHref])\n\n const handleFieldsetDialogSave = React.useCallback(() => {\n if (!fieldsetManagerRef.current) return\n void fieldsetManagerRef.current.submit()\n }, [])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (formReadOnly) return\n if (submittingRef.current) return\n submittingRef.current = true\n try {\n setFormError(null)\n setErrors({})\n\n const requiredMessage = t('ui.forms.errors.required')\n const highlightedMessage = t('ui.forms.errors.highlighted')\n\n // Make sure inputs that commit on blur flush their local state before submit.\n try {\n if (typeof document !== 'undefined') {\n const activeElement = document.activeElement\n if (activeElement instanceof HTMLElement) {\n activeElement.blur()\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n }\n }\n } catch {\n // ignore focus cleanup errors\n }\n\n // Basic required-field validation when no zod schema is provided\n const requiredErrors: Record<string, string> = {}\n for (const field of allFields) {\n if (!field.required) continue\n if (field.disabled) continue\n if (hiddenBaseFieldIds.has(field.id) || hiddenInjectedFieldIds.has(field.id)) continue\n const v = values[field.id]\n const isArray = Array.isArray(v)\n const isString = typeof v === 'string'\n const empty =\n v === undefined ||\n v === null ||\n (isString && v.trim() === '') ||\n (isArray && v.length === 0) ||\n (field.type === 'checkbox' && v !== true)\n if (empty) requiredErrors[field.id] = requiredMessage\n }\n if (Object.keys(requiredErrors).length) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Required field errors prevented submit', requiredErrors)\n }\n const transformedErrors = await transformValidationErrors(requiredErrors)\n setErrors(transformedErrors)\n flash(highlightedMessage, 'error')\n return\n }\n\n // Custom fields validation via definitions (rules)\n if (resolvedEntityIds.length) {\n try {\n const defs = cfDefinitions.length\n ? cfDefinitions\n : await import('./utils/customFieldDefs').then((mod) => mod.fetchCustomFieldDefs(resolvedEntityIds))\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n // Build values keyed by def.key for validation\n const cfValues: Record<string, unknown> = {}\n if (customEntity) {\n for (const def of defs) {\n if (Object.prototype.hasOwnProperty.call(values, def.key)) {\n cfValues[def.key] = values[def.key]\n }\n }\n } else {\n for (const [k, v] of Object.entries(values)) {\n if (k.startsWith('cf_')) cfValues[k.replace(/^cf_/, '')] = v\n }\n }\n const defsForValidation = mapDefsForValidation(defs)\n const result = validateValuesAgainstDefs(cfValues, defsForValidation)\n if (!result.ok) {\n if (customEntity) {\n const mapped: Record<string, string> = {}\n for (const [ek, ev] of Object.entries(result.fieldErrors)) mapped[ek.replace(/^cf_/, '')] = String(ev)\n const transformedErrors = await transformValidationErrors(mapped)\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n } else {\n const transformedErrors = await transformValidationErrors(\n Object.fromEntries(\n Object.entries(result.fieldErrors).map(([key, value]) => [key, String(value)]),\n ),\n )\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n }\n flash(highlightedMessage, 'error')\n return\n }\n } catch {\n // ignore validation errors if helper not available\n }\n }\n\n const widgetValues = { ...(valuesRef.current as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n if (customEntity) {\n const allowedKeys = new Set(cfDefinitions.map((definition) => definition.key).filter(Boolean))\n for (const key of Object.keys(coreValues)) {\n if (!allowedKeys.has(key)) delete coreValues[key]\n }\n }\n\n let parsedValues: TValues\n if (schema) {\n const res = schema.safeParse(collapseDotPathFields(coreValues, dotPathBaseFieldIds))\n if (!res.success) {\n const fieldErrors: Record<string, string> = {}\n res.error.issues.forEach((issue) => {\n const path = serializeIssuePath(issue.path)\n if (path) fieldErrors[path] = issue.message\n })\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Schema validation failed', res.error.issues)\n }\n const transformedErrors = await transformValidationErrors(fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n flash(highlightedMessage, 'error')\n return\n }\n parsedValues = res.data\n } else {\n parsedValues = coreValues as TValues\n }\n let submitValues = widgetValues as TValues\n let coreSubmitValues = parsedValues\n if (extendedInjectionEventsEnabled) {\n try {\n const result = await triggerInjectionEvent('transformFormData', submitValues, injectionContext)\n if (result.data) {\n submitValues = result.data as TValues\n const projectedCoreValues = { ...(result.data as Record<string, unknown>) }\n for (const injectedId of injectedFieldIdSet) {\n delete projectedCoreValues[injectedId]\n }\n if (customEntity) {\n const allowedKeys = new Set(cfDefinitions.map((definition) => definition.key).filter(Boolean))\n for (const key of Object.keys(projectedCoreValues)) {\n if (!allowedKeys.has(key)) delete projectedCoreValues[key]\n }\n }\n coreSubmitValues = schema\n ? schema.parse(collapseDotPathFields(projectedCoreValues, dotPathBaseFieldIds))\n : (projectedCoreValues as TValues)\n if (result.applyToForm) {\n setValues(result.data as CrudFormValues<TValues>)\n }\n }\n } catch (err) {\n console.error('[CrudForm] Error in transformFormData:', err)\n }\n }\n\n // Trigger onBeforeSave event for injection widgets\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeSave', submitValues, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n scrollToInjectionBlockedTarget(result.fieldErrors)\n setPending(false)\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n\n setPending(true)\n\n const nativeSubmitter = 'nativeEvent' in e ? (e.nativeEvent as SubmitEvent).submitter : null\n const submitContext: CrudFormSubmitContext | undefined =\n nativeSubmitter instanceof HTMLElement\n ? {\n submitter: {\n id: nativeSubmitter.id || undefined,\n name:\n 'name' in nativeSubmitter && typeof nativeSubmitter.name === 'string' && nativeSubmitter.name.trim().length > 0\n ? nativeSubmitter.name\n : undefined,\n value:\n 'value' in nativeSubmitter && typeof nativeSubmitter.value === 'string' && nativeSubmitter.value.trim().length > 0\n ? nativeSubmitter.value\n : undefined,\n dataset: Object.fromEntries(\n Object.entries(nativeSubmitter.dataset).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n ),\n },\n }\n : undefined\n \n // Trigger onSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n \n try {\n submitNavigationBypassRef.current = true\n const optimisticLockHeader = buildOptimisticLockHeader(resolvedOptimisticLockUpdatedAt)\n const mergedSubmitHeaders = {\n ...(injectionRequestHeaders ?? {}),\n ...optimisticLockHeader,\n }\n if (Object.keys(mergedSubmitHeaders).length > 0) {\n await withScopedApiRequestHeaders(mergedSubmitHeaders, async () => {\n await onSubmit?.(coreSubmitValues, submitContext)\n })\n } else {\n await onSubmit?.(coreSubmitValues, submitContext)\n }\n \n // Trigger onAfterSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterSave:', err)\n }\n }\n\n markFormAsClean(valuesRef.current as Record<string, unknown>)\n keepSubmitNavigationBypassAlive()\n if (successRedirect) await navigateWithGuard(successRedirect)\n } catch (err: unknown) {\n clearSubmitNavigationBypass()\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const { message: helperMessage, fieldErrors: serverFieldErrors } = mapCrudServerErrorToFormErrors(err, { customEntity })\n const combinedFieldErrors = serverFieldErrors ?? {}\n const hasFieldErrors = Object.keys(combinedFieldErrors).length > 0\n const firstFieldMessage = hasFieldErrors\n ? (() => {\n const firstKey = Object.keys(combinedFieldErrors)[0]\n if (!firstKey) return null\n const value = combinedFieldErrors[firstKey]\n if (typeof value !== 'string' || !value.trim().length) return null\n return translateValidationMessage(value)\n })()\n : null\n if (hasFieldErrors) {\n const transformedErrors = await transformValidationErrors(combinedFieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Submission failed with field errors', transformedErrors)\n }\n }\n\n const optimisticLockConflict = extractOptimisticLockConflict(err)\n let displayMessage = optimisticLockConflict\n ? t('ui.forms.flash.recordModified', 'This record was modified by someone else. Refresh and try again.')\n : typeof helperMessage === 'string' && helperMessage.trim() ? helperMessage.trim() : ''\n if (hasFieldErrors) {\n const lowered = displayMessage.toLowerCase()\n const highlightedLower = highlightedMessage.toLowerCase()\n if (!displayMessage || lowered === 'invalid input' || lowered === highlightedLower) {\n displayMessage = firstFieldMessage ?? highlightedMessage\n }\n }\n if (!displayMessage && err instanceof Error && typeof err.message === 'string' && err.message.trim()) {\n displayMessage = err.message.trim()\n }\n if (!displayMessage) {\n displayMessage = hasFieldErrors ? highlightedMessage : saveErrorMessage\n }\n displayMessage = parseServerMessage(displayMessage)\n if (optimisticLockConflict) {\n // Primary surface for the conflict is the persistent, error-styled\n // RecordConflictBanner (unified across all forms). Keep the inline\n // form error too, but suppress the redundant transient toast.\n try { surfaceRecordConflict(err, t) } catch {}\n } else if (!hasFieldErrors) {\n flash(displayMessage, 'error')\n }\n setFormError(displayMessage)\n } finally {\n setPending(false)\n }\n } finally {\n submittingRef.current = false\n }\n }\n\n // Tracks the last loader function observed per field id so we can invalidate cached\n // options when callers rebuild loaders that capture different state (e.g. a tenant id).\n const dynamicOptionLoadersRef = React.useRef<\n Map<string, ((query?: string) => Promise<CrudFieldOption[]>) | undefined>\n >(new Map())\n\n // Stable key prevents infinite re-render loop (see #814) \u2014 do not depend on allFields directly.\n React.useEffect(() => {\n let cancelled = false\n const loadAll = async () => {\n const loaders = allFieldsRef.current\n .filter(\n (f): f is CrudBuiltinField & { loadOptions: NonNullable<CrudBuiltinField['loadOptions']> } =>\n f.type !== 'custom' && typeof f.loadOptions === 'function'\n )\n .map(async (f) => {\n try {\n dynamicOptionLoadersRef.current.set(f.id, f.loadOptions)\n const opts = await f.loadOptions()\n if (!cancelled) setDynamicOptions((prev) => ({ ...prev, [f.id]: opts }))\n } catch {\n // ignore\n }\n })\n await Promise.all(loaders)\n }\n loadAll()\n return () => {\n cancelled = true\n }\n }, [dynamicOptionLoaderKey])\n\n const loadFieldOptions = React.useCallback(async (field: CrudField, query?: string): Promise<CrudFieldOption[]> => {\n if (!('type' in field) || field.type === 'custom') return EMPTY_OPTIONS\n const builtin = field as CrudBuiltinField\n const loader = builtin.loadOptions\n if (typeof loader === 'function') {\n const previousLoader = dynamicOptionLoadersRef.current.get(field.id)\n const loaderChanged = previousLoader !== loader\n dynamicOptionLoadersRef.current.set(field.id, loader)\n if (\n query === undefined &&\n !loaderChanged &&\n Array.isArray(dynamicOptions[field.id])\n ) {\n return dynamicOptions[field.id]\n }\n try {\n const fetched = await loader(query)\n if (query === undefined) {\n setDynamicOptions((prev) => ({\n ...prev,\n [field.id]: fetched,\n }))\n }\n return fetched\n } catch {\n return builtin.options ?? EMPTY_OPTIONS\n }\n }\n return dynamicOptions[field.id] || builtin.options || EMPTY_OPTIONS\n }, [dynamicOptions])\n\n const fieldOptionsById = React.useMemo(() => {\n const map = new globalThis.Map<string, CrudFieldOption[]>()\n for (const f of allFields) {\n if (!('type' in f) || f.type === 'custom') continue\n const builtin = f as CrudBuiltinField\n const staticOptions = builtin.options ?? EMPTY_OPTIONS\n const dynamic = dynamicOptions[f.id]\n if (dynamic && dynamic.length) {\n const merged: CrudFieldOption[] = []\n const seen = new Set<string>()\n for (const opt of staticOptions) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n for (const opt of dynamic) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n map.set(f.id, merged)\n } else if (staticOptions.length) {\n map.set(f.id, staticOptions)\n } else if (dynamic) {\n map.set(f.id, dynamic)\n }\n }\n return map\n }, [allFields, dynamicOptions])\n\n // no auto-focus; let the browser/user manage focus\n\n const usesResponsiveLayout = allFields.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const grid = twoColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : usesResponsiveLayout\n ? 'grid grid-cols-1 gap-4 md:grid-cols-6'\n : 'grid grid-cols-1 gap-4'\n\n // Helper to render a list of field configs\n const resolveLayoutClass = (layout?: CrudFieldBase['layout']) => {\n switch (layout) {\n case 'half':\n return 'md:col-span-3'\n case 'third':\n return 'md:col-span-2'\n default:\n return 'md:col-span-6'\n }\n }\n\n const renderFields = (fieldList: CrudField[]) => {\n const usesResponsive = fieldList.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const gridClass = usesResponsive ? 'grid grid-cols-1 gap-4 md:grid-cols-6' : 'grid grid-cols-1 gap-4'\n return (\n <div className={gridClass}>\n {fieldList.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsive ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={readRenderedFieldValue(values as Record<string, unknown>, f.id)}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n onBlurRequest={onBlurRequest}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!disableInitialFocus && !formReadOnly && Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n markRequired={widgetRequiredFieldIds.has(f.id)}\n />\n )\n })}\n </div>\n )\n }\n\n const renderCustomFieldsContent = React.useCallback((): React.ReactNode[] => {\n if (!customFieldLayout.length) {\n return [\n <div key=\"custom-fields-empty\" className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n ]\n }\n\n const nodes: React.ReactNode[] = []\n const multipleEntities = customFieldLayout.length > 1\n\n customFieldLayout.forEach((entityLayout) => {\n const manageHref = buildCustomFieldsManageHref(entityLayout.entityId)\n const showSelector =\n entityLayout.hasFieldsets &&\n entityLayout.singleFieldsetPerRecord &&\n entityLayout.availableFieldsets.length > 0\n\n if (multipleEntities) {\n nodes.push(\n <div\n key={`custom-fields-entity-${entityLayout.entityId}`}\n className=\"px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {entityLayout.entityId}\n </div>,\n )\n }\n\n if (showSelector) {\n nodes.push(\n <div key={`custom-fields-selector-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <label className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {fieldsetSelectorLabel}\n </label>\n <Select\n value={entityLayout.activeFieldset || undefined}\n onValueChange={(value) =>\n handleFieldsetSelectionChange(\n entityLayout.entityId,\n value || null,\n )}\n >\n <SelectTrigger className=\"w-auto min-w-[10rem]\">\n <SelectValue placeholder={defaultFieldsetLabel} />\n </SelectTrigger>\n <SelectContent>\n {entityLayout.availableFieldsets.map((fs) => (\n <SelectItem key={fs.code} value={fs.code}>\n {fs.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() =>\n handleOpenFieldsetEditor(entityLayout.entityId, entityLayout.activeFieldset ?? null, 'fieldset')}\n disabled={!manageHref}\n title={manageFieldsetLabel}\n >\n <Settings className=\"size-4\" />\n </IconButton>\n </div>\n </div>,\n )\n }\n\n if (entityLayout.sections.length) {\n entityLayout.sections.forEach((section) => {\n const FieldsetIcon = section.fieldset?.icon\n ? FIELDSET_ICON_COMPONENTS[section.fieldset.icon]\n : null\n const sectionKey = `${entityLayout.entityId}:${section.fieldsetCode ?? 'default'}`\n const manageDisabled = !manageHref\n nodes.push(\n <div key={sectionKey} className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n {FieldsetIcon ? (\n <FieldsetIcon className=\"size-5 text-muted-foreground\" />\n ) : null}\n <div>\n <div className=\"text-sm font-medium\">{section.title}</div>\n {section.description ? (\n <div className=\"text-xs text-muted-foreground\">\n {section.description}\n </div>\n ) : null}\n </div>\n </div>\n <Button\n type=\"button\"\n variant=\"muted\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => handleOpenFieldsetEditor(entityLayout.entityId, section.fieldsetCode, 'fieldset')}\n disabled={manageDisabled}\n >\n <Settings className=\"size-4\" />\n {manageFieldsetLabel}\n </Button>\n </div>\n {section.groups.map((group) => {\n const groupKey = `${section.fieldsetCode ?? 'default'}:${group.code ?? 'default'}`\n const visibleFields = placedCustomFieldIds.size > 0\n ? group.fields.filter((f) => !placedCustomFieldIds.has(f.id))\n : group.fields\n if (!visibleFields.length) return null\n return (\n <div key={groupKey} className=\"space-y-2\">\n {group.label ? (\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n ) : null}\n {renderFields(visibleFields)}\n </div>\n )\n })}\n {!section.groups.length ? (\n <div className=\"text-xs text-muted-foreground\">{emptyFieldsetMessage}</div>\n ) : null}\n </div>,\n )\n })\n } else {\n nodes.push(\n <div key={`custom-fields-empty-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n )\n }\n })\n\n return nodes\n }, [\n buildCustomFieldsManageHref,\n customFieldLayout,\n customFieldsEmptyState,\n defaultFieldsetLabel,\n emptyFieldsetMessage,\n fieldsetSelectorLabel,\n handleFieldsetSelectionChange,\n handleOpenFieldsetEditor,\n manageFieldsetLabel,\n placedCustomFieldIds,\n renderFields,\n ])\n\n const fieldsetManagerDialog = (\n <Dialog open={fieldsetEditorTarget !== null} onOpenChange={(open) => { if (!open) setFieldsetEditorTarget(null) }}>\n <DialogContent\n className=\"max-w-5xl w-full\"\n aria-describedby={undefined}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleFieldsetDialogSave()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{fieldsetDialogTitle}</DialogTitle>\n </DialogHeader>\n {fieldsetEditorTarget ? (\n <FieldDefinitionsManagerErrorBoundary\n onClose={() => setFieldsetEditorTarget(null)}\n unavailableMessage={fieldsetDialogUnavailable}\n >\n <FieldDefinitionsManager\n ref={fieldsetManagerRef}\n entityId={fieldsetEditorTarget.entityId}\n initialFieldset={fieldsetEditorTarget.fieldsetCode}\n fullEditorHref={fieldsetEditorFullHref ?? undefined}\n onSaved={refreshCustomFieldDefinitions}\n onClose={() => setFieldsetEditorTarget(null)}\n />\n </FieldDefinitionsManagerErrorBoundary>\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground px-4 text-center\">\n {fieldsetDialogUnavailable}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n\n const handleReadOnlyFocusCapture = React.useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n const target = event.target\n if (target instanceof HTMLElement) target.blur()\n }, [formReadOnly])\n\n const handleReadOnlyKeyDownCapture = React.useCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n event.preventDefault()\n }, [formReadOnly])\n\n const wrapFormBody = React.useCallback((children: React.ReactNode, className?: string) => {\n if (!formReadOnly) return children\n return (\n <div\n className={cn('relative', className)}\n onFocusCapture={handleReadOnlyFocusCapture}\n onKeyDownCapture={handleReadOnlyKeyDownCapture}\n >\n <div className=\"pointer-events-none select-none opacity-70\">\n {children}\n </div>\n <div className=\"absolute inset-0 z-10 flex items-start justify-center rounded-lg bg-background/80 p-4 backdrop-blur-[1px] sm:p-6\">\n {readOnlyOverlay ?? <div className=\"rounded-xl border border-border/70 bg-background/95 px-4 py-3 shadow-sm\" />}\n </div>\n </div>\n )\n }, [formReadOnly, handleReadOnlyFocusCapture, handleReadOnlyKeyDownCapture, readOnlyOverlay])\n\n // If groups are provided, render the two-column grouped layout\n if (useGroupedLayout) {\n\n // Sort groups by user-preferred order when sortable is enabled\n const sortedGroups = sortableGroupsEnabled\n ? [...resolvedGroupsForLayout].sort((a, b) => {\n const ai = sortedGroupIds.indexOf(a.id)\n const bi = sortedGroupIds.indexOf(b.id)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n : resolvedGroupsForLayout\n\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n for (const g of sortedGroups) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n const col1Ids = col1.map((g) => g.id)\n\n const renderGroupedCards = (items: CrudFormGroup[]) => {\n const nodes: React.ReactNode[] = []\n for (const g of items) {\n const isCustomFieldsGroup = g.kind === 'customFields'\n if (isCustomFieldsGroup) {\n if (isLoadingCustomFields) {\n const loadingContent = (\n <div key={`${g.id}-loading`} className=\"rounded-lg border bg-card p-4\">\n <DataLoader\n isLoading\n loadingMessage={resolvedCustomFieldsLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n <div />\n </DataLoader>\n </div>\n )\n if (collapsibleGroupsEnabled && g.title) {\n nodes.push(\n <CollapsibleGroup\n key={`${g.id}-loading-collapsible`}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n chevronPosition={collapsibleChevronPosition}\n >\n {loadingContent}\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(loadingContent)\n }\n continue\n }\n\n const customFieldsInnerNodes: React.ReactNode[] = []\n if (g.component) {\n customFieldsInnerNodes.push(\n <div key={`${g.id}-component`} className=\"rounded-lg border bg-card px-4 py-3\">\n {g.component({ values, setValue, errors, requiredFieldIds: widgetRequiredFieldIds })}\n </div>,\n )\n }\n const renderedSections = renderCustomFieldsContent()\n if (renderedSections.length) customFieldsInnerNodes.push(...renderedSections)\n\n if (collapsibleGroupsEnabled && g.title) {\n const customFieldCount = customFieldLayout.reduce(\n (sum, entity) => sum + entity.sections.reduce(\n (sSum, section) => sSum + section.groups.reduce(\n (gSum, group) => gSum + group.fields.length, 0,\n ), 0,\n ), 0,\n )\n const customFieldErrors = customFieldLayout.reduce(\n (sum, entity) => sum + entity.sections.reduce(\n (sSum, section) => sSum + section.groups.reduce(\n (gSum, group) => gSum + group.fields.filter((f) => errors[f.id]).length, 0,\n ), 0,\n ), 0,\n )\n nodes.push(\n <CollapsibleGroup\n key={g.id}\n ref={(handle) => {\n if (handle) groupCollapseRefs.current.set(g.id, handle)\n else groupCollapseRefs.current.delete(g.id)\n }}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n errorCount={customFieldErrors}\n fieldCount={customFieldCount}\n chevronPosition={collapsibleChevronPosition}\n >\n <div className=\"space-y-3\">\n {customFieldsInnerNodes}\n </div>\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(...customFieldsInnerNodes)\n }\n continue\n }\n\n const componentNode = g.component ? g.component({ values, setValue, errors, requiredFieldIds: widgetRequiredFieldIds }) : null\n if (g.bare) {\n if (componentNode) {\n nodes.push(<React.Fragment key={g.id}>{componentNode}</React.Fragment>)\n }\n continue\n }\n const groupFields = resolveGroupFields(g)\n const groupFieldIds = (g.fields ?? []).map((f) => (typeof f === 'string' ? f : f.id))\n const groupErrorCount = groupFieldIds.filter((id) => errors[id]).length\n\n const groupContent = (\n <>\n {g.description ? <div className=\"text-xs text-muted-foreground\">{t(g.description, g.description)}</div> : null}\n {componentNode ? (\n <div>{componentNode}</div>\n ) : null}\n <DataLoader\n isLoading={false}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n {groupFields.length > 0 ? renderFields(groupFields) : <div className=\"min-h-[1px]\" />}\n </DataLoader>\n </>\n )\n\n if (collapsibleGroupsEnabled && g.title) {\n nodes.push(\n <CollapsibleGroup\n key={g.id}\n ref={(handle) => {\n if (handle) groupCollapseRefs.current.set(g.id, handle)\n else groupCollapseRefs.current.delete(g.id)\n }}\n groupId={g.id}\n title={t(g.title, g.title)}\n pageType={collapsiblePageType}\n errorCount={groupErrorCount}\n fieldCount={groupFields.length}\n chevronPosition={collapsibleChevronPosition}\n >\n <div className=\"space-y-3\">\n {groupContent}\n </div>\n </CollapsibleGroup>,\n )\n } else {\n nodes.push(\n <div key={g.id} className=\"rounded-lg border bg-card px-4 py-3 space-y-3\">\n {g.title ? (\n <div className=\"text-sm font-medium\">{t(g.title, g.title)}</div>\n ) : null}\n {groupContent}\n </div>,\n )\n }\n }\n return nodes\n }\n\n const col1Nodes = renderGroupedCards(col1)\n const col2Content = renderGroupedCards(col2)\n\n // Wrap col1 nodes in sortable items when enabled\n const col1Content = sortableGroupsEnabled\n ? col1Nodes.map((node, i) => (\n <SortableGroupItem key={col1[i]?.id ?? i} id={col1[i]?.id ?? String(i)}>\n {node}\n </SortableGroupItem>\n ))\n : col1Nodes\n const hasSecondaryColumn = col2Content.length > 0\n\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n {wrapFormBody(\n <form id={formId} onSubmit={handleSubmit} className={`space-y-4 ${dialogFormPadding}`}>\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending || formReadOnly}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div\n className={hasSecondaryColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : 'grid grid-cols-1 gap-4'}\n >\n {sortableGroupsEnabled ? (\n <DndContext sensors={sortableSensors} collisionDetection={closestCenter} onDragEnd={handleGroupDragEnd}>\n <SortableContext items={col1Ids} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">{col1Content}</div>\n </SortableContext>\n </DndContext>\n ) : (\n <div className=\"space-y-3\">{col1Content}</div>\n )}\n {hasSecondaryColumn ? <div className=\"space-y-3\" data-crud-injection-region>{col2Content}</div> : null}\n </div>\n {formError && !Object.keys(errors).length ? <div className=\"text-sm text-status-error-text\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon }\n }}\n />\n )}\n </form>,\n )}\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n }\n\n // Default single-card layout (compatible with previous API)\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n {wrapFormBody(\n <div>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={`${embedded ? 'space-y-4' : 'rounded-lg border bg-card p-4 space-y-4'} ${dialogFormPadding}`}\n >\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending || formReadOnly}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div className={grid}>\n {allFields.map((f) => {\n if (hiddenBaseFieldIds.has(f.id) || hiddenInjectedFieldIds.has(f.id)) return null\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsiveLayout ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n onBlurRequest={onBlurRequest}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!disableInitialFocus && !formReadOnly && Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n markRequired={widgetRequiredFieldIds.has(f.id)}\n />\n )\n })}\n </div>\n {formError && !Object.keys(errors).length ? <div className=\"text-sm text-status-error-text\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n )}\n </form>\n </div>,\n )}\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction RelationSelect({\n value,\n onChange,\n options,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n options: CrudFieldOption[]\n placeholder?: string\n autoFocus?: boolean\n}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [query, options])\n\n return (\n <div className=\"space-y-1\">\n <Input\n ref={inputRef}\n placeholder={placeholder || t('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"max-h-40 overflow-auto rounded border\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full justify-start rounded-none font-normal\"\n onClick={() => onChange('')}\n >\n \u2014\n </Button>\n {filtered.map((opt) => (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n className={`w-full justify-start rounded-none font-normal ${\n value === opt.value ? 'bg-muted' : ''\n }`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </Button>\n ))}\n </div>\n </div>\n )\n}\n// Local-buffer text input to avoid focus loss when parent re-renders\nfunction TextInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n disabled,\n suggestions,\n inputType = 'text',\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n disabled?: boolean\n suggestions?: string[]\n inputType?: 'text' | 'password'\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const userTypingRef = React.useRef(false)\n const datalistId = React.useId()\n const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\n\n React.useEffect(() => {\n // Sync from props whenever the input is unfocused or the user hasn't typed yet.\n if (!isFocusedRef.current || !userTypingRef.current) {\n setLocal(value)\n }\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.value\n userTypingRef.current = true\n setLocal(next)\n onChange(next)\n }, [disabled, onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, disabled, onSubmit])\n\n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n userTypingRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n\n if (inputType === 'password') {\n return (\n <PasswordInput\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )\n }\n return (\n <>\n <Input\n type={inputType}\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n list={suggestions && suggestions.length > 0 ? datalistId : undefined}\n />\n {suggestions && suggestions.length > 0 && (\n <datalist id={datalistId}>\n {suggestions.map((suggestion) => (\n <option key={suggestion} value={suggestion} />\n ))}\n </datalist>\n )}\n </>\n )\n}\n\n// Local-buffer number input to avoid focus loss when parent re-renders\nfunction NumberInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n}: {\n value: number | string | null | undefined\n onChange: (v: number | undefined) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n}) {\n const serializedValue = value !== undefined && value !== null ? String(value) : ''\n const [local, setLocal] = React.useState<string>(serializedValue)\n const isFocusedRef = React.useRef(false)\n const commitIfChanged = React.useCallback(() => {\n if (local === serializedValue) return\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n }, [local, onChange, serializedValue])\n \n React.useEffect(() => {\n // Only sync from props when not focused to avoid caret jumps\n if (!isFocusedRef.current) {\n setLocal(serializedValue)\n }\n }, [serializedValue])\n \n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value\n setLocal(next)\n const numValue = next === '' ? undefined : Number(next)\n onChange(numValue)\n }, [onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, onSubmit])\n \n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n \n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n \n return (\n <Input\n type=\"number\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Local-buffer textarea to avoid form-wide re-renders while typing\nfunction TextAreaInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n maxLength,\n showCount,\n rows,\n disabled,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n maxLength?: number\n showCount?: boolean\n rows?: number\n disabled?: boolean\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\n\n React.useEffect(() => {\n if (!isFocusedRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value\n setLocal(next)\n onChange(next)\n }, [onChange])\n\n const handleFocus = React.useCallback(() => { isFocusedRef.current = true }, [])\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\n\n return (\n <Textarea\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n maxLength={maxLength}\n showCount={showCount}\n rows={rows}\n disabled={disabled}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Markdown editor \u2014 WYSIWYG MDXEditor (Lexical) wired to the CrudForm value/onChange contract.\ntype MDProps = { value?: string; onChange: (md: string) => void }\n\nconst MarkdownEditor = React.memo(function MarkdownEditor({ value = '', onChange }: MDProps) {\n return <MarkdownField value={value} onChange={onChange} />\n}, (prev, next) => prev.value === next.value)\n\n// HTML Rich Text editor wrapper for the CrudForm builtin `editor: 'html'`.\n// Maps the existing `ui.forms.richtext.*` i18n keys onto the `RichEditor`\n// `labels` contract and pins the `standard` toolbar variant \u2014 heading\n// dropdown + B/I/U + lists + link, matching the legacy behaviour plus\n// the Figma `164611:20259` heading selector.\ntype HtmlRichEditorFieldProps = { value?: string; onChange: (html: string) => void }\nconst HtmlRichEditorField = React.memo(function HtmlRichEditorField({ value = '', onChange }: HtmlRichEditorFieldProps) {\n const t = useT()\n const labels = React.useMemo<Partial<RichEditorLabels>>(() => ({\n bold: t('ui.forms.richtext.bold'),\n italic: t('ui.forms.richtext.italic'),\n underline: t('ui.forms.richtext.underline'),\n unorderedList: t('ui.forms.richtext.list'),\n orderedList: t('ui.forms.richtext.orderedList', 'Numbered list'),\n heading: t('ui.forms.richtext.heading', 'Heading'),\n heading1: t('ui.forms.richtext.heading1', 'Heading 1'),\n heading2: t('ui.forms.richtext.heading2', 'Heading 2'),\n heading3: t('ui.forms.richtext.heading3'),\n paragraph: t('ui.forms.richtext.paragraph', 'Paragraph'),\n link: t('ui.forms.richtext.link'),\n linkUrlPrompt: t('ui.forms.richtext.linkUrlPrompt'),\n placeholder: t('ui.forms.richtext.placeholder'),\n comment: t('ui.forms.richtext.comment', 'Add comment'),\n mention: t('ui.forms.richtext.mention', 'Mention'),\n more: t('ui.forms.richtext.more', 'More'),\n }), [t])\n return <RichEditor value={value} onChange={onChange} variant=\"full\" labels={labels} />\n}, (prev, next) => prev.value === next.value)\n\n// Very simple markdown editor with Bold/Italic/Underline + shortcuts.\ntype SimpleMDProps = { value?: string; onChange: (md: string) => void }\nconst SimpleMarkdownEditor = React.memo(function SimpleMarkdownEditor({ value = '', onChange }: SimpleMDProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const markdownPlaceholder = t('ui.forms.richtext.placeholder')\n const sampleText = t('ui.forms.richtext.sampleText')\n const taRef = React.useRef<HTMLTextAreaElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const wrap = (before: string, after: string = before) => {\n const el = taRef.current\n if (!el) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n const sel = value.slice(start, end) || sampleText\n const next = value.slice(0, start) + before + sel + after + value.slice(end)\n onChange(next)\n queueMicrotask(() => {\n const caret = start + before.length + sel.length + after.length\n el.focus()\n el.setSelectionRange(caret, caret)\n })\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const key = e.key.toLowerCase()\n if (key === 'b') { e.preventDefault(); wrap('**') }\n if (key === 'i') { e.preventDefault(); wrap('_') }\n if (key === 'u') { e.preventDefault(); wrap('__') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('**')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('_')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('__')}>{underlineLabel}</Button>\n </div>\n <textarea\n ref={taRef}\n className=\"w-full min-h-[100px] sm:min-h-[160px] resize-y px-2 py-2 font-mono text-sm outline-none\"\n spellCheck={false}\n value={local}\n onChange={(e) => { typingRef.current = true; setLocal(e.target.value) }}\n onBlur={() => { if (typingRef.current) { typingRef.current = false; onChange(local) } }}\n onKeyDown={onKeyDown}\n placeholder={markdownPlaceholder}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\ntype FieldControlProps = {\n field: CrudField\n value: unknown\n error?: string\n options: CrudFieldOption[]\n setValue: (id: string, v: unknown) => void\n onBlurRequest: (fieldId: string) => void\n values: Record<string, unknown>\n loadFieldOptions: (field: CrudField, query?: string) => Promise<CrudFieldOption[]>\n autoFocus: boolean\n onSubmitRequest: () => void\n wrapperClassName?: string\n entityIdForField?: string\n recordId?: string\n markRequired?: boolean\n}\n\nfunction supportsWrapperBlurValidation(field: CrudField): boolean {\n return (\n field.type === 'text' ||\n field.type === 'password' ||\n field.type === 'textarea' ||\n field.type === 'checkbox' ||\n field.type === 'select' ||\n field.type === 'number'\n )\n}\n\ntype ListboxMultiSelectProps = {\n options: CrudFieldOption[]\n placeholder?: string\n value: string[]\n onChange: (vals: string[]) => void\n autoFocus?: boolean\n}\n\nconst ListboxMultiSelect = React.memo(function ListboxMultiSelect({\n options,\n placeholder,\n value,\n onChange,\n autoFocus,\n}: ListboxMultiSelectProps) {\n const t = useT()\n const searchPlaceholder = placeholder || t('ui.forms.listbox.searchPlaceholder')\n const noMatchesLabel = t('ui.forms.listbox.noMatches')\n const [query, setQuery] = React.useState('')\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [options, query])\n const toggle = React.useCallback(\n (val: string) => {\n const set = new Set(value)\n if (set.has(val)) set.delete(val)\n else set.add(val)\n onChange(Array.from(set))\n },\n [value, onChange]\n )\n return (\n <div className=\"w-full\">\n <Input\n className=\"mb-2\"\n size=\"sm\"\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filtered.map((opt) => {\n const isSel = value.includes(opt.value)\n return (\n <Button\n key={opt.value}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggle(opt.value)}\n className={`w-full justify-start rounded-none font-normal px-3 py-2 ${isSel ? 'bg-muted' : ''}`}\n >\n <span className=\"inline-flex items-center gap-2\">\n {/* Decorative selection indicator \u2014 NOT an interactive Checkbox.\n The enclosing Button owns the click; a real Radix Checkbox here\n nests a <button> inside a <button> (hydration error) and its\n Presence/ref lifecycle drives an infinite update loop when the\n listbox renders selected values. A plain span mirrors the DS\n checkbox look without any of that. */}\n <span\n aria-hidden=\"true\"\n className={`inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border transition-colors ${\n isSel\n ? 'border-accent-indigo bg-accent-indigo text-accent-indigo-foreground'\n : 'border-input bg-background'\n }`}\n >\n {isSel ? <Check className=\"size-3.5\" aria-hidden=\"true\" /> : null}\n </span>\n <span>{opt.label}</span>\n </span>\n </Button>\n )\n })}\n {!filtered.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">{noMatchesLabel}</div>\n ) : null}\n </div>\n </div>\n )\n})\n\nconst FieldControl = React.memo(function FieldControlImpl({\n field,\n value,\n error,\n options,\n setValue,\n onBlurRequest,\n values,\n loadFieldOptions,\n autoFocus,\n onSubmitRequest,\n wrapperClassName,\n entityIdForField,\n recordId,\n markRequired,\n}: FieldControlProps) {\n const t = useT()\n const fieldSetValue = React.useCallback(\n (nextValue: unknown) => setValue(field.id, nextValue),\n [setValue, field.id]\n )\n const setFormValue = React.useCallback(\n (targetId: string, nextValue: unknown) => setValue(targetId, nextValue),\n [setValue],\n )\n const builtin = field.type === 'custom' ? null : field\n const hasLoader = typeof builtin?.loadOptions === 'function'\n const disabled = Boolean(field.disabled)\n const readOnly = Boolean(field.readOnly)\n const autoFocusField = autoFocus && !disabled\n\n React.useEffect(() => {\n if (!hasLoader || field.type === 'custom') return\n loadFieldOptions(field).catch(() => {})\n }, [field, hasLoader, loadFieldOptions])\n\n const placeholder = builtin?.placeholder\n const rootClassName = wrapperClassName ? `space-y-1 ${wrapperClassName}` : 'space-y-1'\n const validateOnWrapperBlur = supportsWrapperBlurValidation(field)\n const singleSelectValue = Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n const singleSelectOptionsKey = React.useMemo(\n () => options.map((opt) => `${opt.value}:${opt.label}`).join('\\0'),\n [options],\n )\n const singleSelectLabel = singleSelectValue\n ? options.find((option) => option.value === singleSelectValue)?.label\n : undefined\n\n return (\n <div\n className={rootClassName}\n data-crud-field-id={field.id}\n onBlur={validateOnWrapperBlur\n ? (event) => {\n const nextFocused = event.relatedTarget\n if (nextFocused instanceof Node && event.currentTarget.contains(nextFocused)) return\n onBlurRequest(field.id)\n }\n : undefined}\n >\n {field.type !== 'checkbox' && field.label.trim().length > 0 ? (\n <label className=\"block text-sm font-medium\">\n {field.label}\n {field.required || markRequired ? <span className=\"text-status-error-text\"> *</span> : null}\n </label>\n ) : null}\n {field.type === 'text' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n suggestions={field.type === 'text' ? field.suggestions : undefined}\n />\n )}\n {field.type === 'password' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n inputType=\"password\"\n />\n )}\n {field.type === 'number' && (\n <NumberInput\n value={typeof value === 'number' || typeof value === 'string' ? value : null}\n placeholder={placeholder}\n onChange={fieldSetValue}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n />\n )}\n {field.type === 'date' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime-local' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, \"yyyy-MM-dd'T'HH:mm\") : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datepicker' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? date.toISOString() : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'time' && (\n <TimePicker\n value={typeof value === 'string' ? value : null}\n onChange={(time) => setValue(field.id, time ?? undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n />\n )}\n {field.type === 'textarea' && (\n <TextAreaInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n maxLength={builtin?.maxLength}\n showCount={builtin?.showCount}\n rows={builtin?.rows}\n disabled={disabled}\n />\n )}\n {field.type === 'richtext' && builtin?.editor === 'simple' && (\n <SimpleMarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && builtin?.editor === 'html' && (\n <HtmlRichEditorField value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && (!builtin?.editor || (builtin.editor !== 'simple' && builtin.editor !== 'html')) && (\n <MarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'tags' && (\n <TagsInput\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suppressInitialSuggestionsOnFocus={autoFocusField}\n suggestions={options.map((opt) => ({ value: opt.value, label: opt.label }))}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n />\n )}\n {field.type === 'combobox' && (\n <ComboboxInput\n value={typeof value === 'string' ? value : String(value ?? '')}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={\n builtin?.suggestions\n ? builtin.suggestions\n : options.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n seedOptions={\n builtin?.seedOptions\n ? builtin.seedOptions.map((opt) => ({ value: opt.value, label: opt.label }))\n : undefined\n }\n resolveLabel={builtin?.resolveLabel}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n allowCustomValues={builtin?.allowCustomValues ?? true}\n clearable={!field.required}\n disabled={disabled}\n />\n )}\n {field.type === 'checkbox' && (\n <label className=\"inline-flex items-center gap-2 cursor-pointer\">\n <Checkbox\n checked={value === true}\n onCheckedChange={(next) => setValue(field.id, next === true)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )}\n {field.type === 'select' && !builtin?.multiple && (\n <Select\n key={`${field.id}:${singleSelectValue}:${singleSelectOptionsKey}`}\n // Radix Select MUST be either always-controlled or always-uncontrolled.\n // Passing `value={undefined}` on first render and a string later trips\n // React's \"uncontrolled \u2192 controlled\" warning and breaks Radix's\n // internal state (dropdown flashes / selections no-op). Use empty\n // string for \"no selection\" instead \u2014 Radix treats it the same as\n // undefined for matching SelectItems but keeps the prop type stable.\n value={singleSelectValue}\n onValueChange={(next) => {\n // Custom field clears must be explicit nulls; normal optional\n // fields keep the existing undefined clear semantics.\n if (!next || next === SELECT_CLEAR_SENTINEL) {\n const isCustomField = field.id.startsWith('cf_') || field.id.startsWith('cf:')\n setValue(field.id, isCustomField ? null : undefined)\n return\n }\n setValue(field.id, next)\n }}\n disabled={disabled}\n >\n <SelectTrigger data-crud-focus-target=\"\">\n <SelectValue placeholder={t('ui.forms.select.emptyOption', '\u2014')}>\n {singleSelectLabel}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {!field.required && value != null && value !== '' && (\n <SelectItem value={SELECT_CLEAR_SENTINEL}>\n {t('ui.forms.select.clearOption', '\u2014 Clear \u2014')}\n </SelectItem>\n )}\n {options\n .filter((opt) => opt.value !== '')\n .map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox === true && (\n <ListboxMultiSelect\n options={options}\n placeholder={placeholder}\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(vals) => setValue(field.id, vals)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox !== true && (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((opt) => {\n const arr = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n const checked = arr.includes(opt.value)\n return (\n <label key={opt.value} className=\"inline-flex items-center gap-2 cursor-pointer\">\n <Checkbox\n checked={checked}\n onCheckedChange={(state) => {\n const next = new Set(arr)\n if (state === true) {\n next.add(opt.value)\n } else {\n next.delete(opt.value)\n }\n setValue(field.id, Array.from(next))\n }}\n disabled={disabled}\n />\n <span className=\"text-sm\">{opt.label}</span>\n </label>\n )\n })}\n </div>\n )}\n {field.type === 'relation' && (\n <RelationSelect\n options={options}\n placeholder={placeholder}\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(selected) => setValue(field.id, selected)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'custom' && (\n <>\n {field.component({\n id: field.id,\n value,\n error,\n setValue: fieldSetValue,\n setFormValue,\n values,\n entityId: entityIdForField,\n recordId,\n autoFocus,\n disabled,\n })}\n </>\n )}\n {field.description ? (\n <div className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <div>{field.description}</div>\n </div>\n ) : null}\n {error ? <div className=\"text-xs text-status-error-text\">{error}</div> : null}\n </div>\n )\n},\n(prev, next) =>\n prev.field.id === next.field.id &&\n prev.field.type === next.field.type &&\n prev.field.label === next.field.label &&\n prev.field.description === next.field.description &&\n prev.field.required === next.field.required &&\n prev.markRequired === next.markRequired &&\n prev.value === next.value &&\n prev.error === next.error &&\n prev.options === next.options &&\n prev.loadFieldOptions === next.loadFieldOptions &&\n prev.autoFocus === next.autoFocus &&\n prev.onSubmitRequest === next.onSubmitRequest &&\n prev.setValue === next.setValue &&\n prev.onBlurRequest === next.onBlurRequest &&\n prev.wrapperClassName === next.wrapperClassName &&\n prev.entityIdForField === next.entityIdForField &&\n prev.recordId === next.recordId &&\n (prev.field.type !== 'custom' ||\n (prev.values === next.values &&\n prev.field.component === (next.field as CrudCustomField).component))\n)\n"],
|
|
5
|
+
"mappings": ";AAuoBQ,SAiyBJ,UAhyBM,KADF;AAtoBR,YAAY,WAAW;AACvB,OAAO,UAAU;AAEjB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,SAAS,iBAAiB,6BAA6B,mBAA8B;AACrF,SAAS,WAAW;AACpB,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uCAAuC;AAEhD,SAAS,oBAAoB;AAC7B,SAA0C,wCAAwC;AAClF,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAEzB,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,gCAAgC,0BAA0B;AACnE,SAAS,mCAAmC;AAC5C,SAAS,2BAA2B,qCAAqC;AACzE,SAAS,6BAA6B;AAEtC,SAAS,QAAQ,eAAe,cAAc,mBAAmB;AACjE,SAAS,+BAAmE;AAC5E,SAAS,wBAAwB;AACjC,SAAS,wBAAwB,eAAe,2BAA2B;AAC3E,SAAS,oCAAoC;AAC7C,SAAS,4BAA4B;AACrC,SAAS,+BAA+B;AACxC,SAAS,UAAU;AACnB,SAAS,+BAA+B;AACxC,SAAS,wBAAqD;AAC9D,SAAS,mCAAkE;AAC3E,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,kCAAkC;AAC3C,SAAS,mCAAmC;AAC5C,SAAS,kBAAyC;AAClD,OAAO,mBAAmB;AAG1B,MAAM,gBAAmC,CAAC;AAI1C,MAAM,wBAAwB;AAC9B,MAAM,qBACJ;AACF,MAAM,mCAAmC;AAAA,EACvC,QAAQ,IAAI;AAAA,EACZ;AACF;AAEA,SAAS,wBACP,aACA,QACS;AACT,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,OAAO,YAAY,KAAK,MAAM,YAAY;AACnD;AAEA,SAAS,oBAAoB,QAAqC;AAChE,MAAI,CAAC,UAAU,OAAQ,OAAmB,YAAY,SAAU,QAAO;AACvE,QAAM,KAAK;AACX,QAAM,MAAM,GAAG;AACf,MAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,SAAU,QAAO;AACtE,MAAI,GAAG,kBAAmB,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAyD;AAC5F,QAAM,SAAU,MAA+B;AAC/C,MAAI,UAAU,OAAQ,OAAiB,WAAW,YAAa,QAAQ,OAAiB;AACxF,SAAQ,MAAgB,UAAU;AACpC;AAEA,MAAM,8BAA8B,eAAe;AAAA,EACjD;AAAA,SAAO,aAAgD,eAAe,WAAW,IAAI,CAAC,eAAe;AAAA,MACnG,WAAW,UAAU;AAAA,MACrB,SAAS,CAAC,OAAO,SAAS,YAAY;AACpC,YAAI,oBAAoB,4BAA4B,KAAK,CAAC,EAAG,QAAO;AACpE,eAAO,UAAU,QAAQ,OAAO,SAAS,OAAO;AAAA,MAClD;AAAA,IACF,EAAE;AAAA;AACJ;AAEA,SAAS,gCAAgC,QAAwD;AAC/F,MAAI,OAAO,WAAW,eAAe,UAAU,KAAM,QAAO;AAC5D,MAAI;AACF,UAAM,MAAM,kBAAkB,MAAM,SAAS,IAAI,IAAI,QAAQ,OAAO,SAAS,MAAM;AACnF,QAAI,IAAI,WAAW,OAAO,SAAS,OAAQ,QAAO;AAClD,UAAM,cAAc,GAAG,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,MAAM;AACxE,UAAM,WAAW,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAC7C,QAAI,aAAa,YAAa,QAAO;AACrC,WAAO,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAA0B,UAAmB,WAA8B;AAClF,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,OAAiB,CAAC;AAExB,MAAI,MAAM,QAAQ,SAAS,KAAK,UAAU,QAAQ;AAChD,cAAU,QAAQ,CAAC,OAAO;AACxB,YAAM,UAAU,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI;AACrD,UAAI,CAAC,WAAW,MAAM,IAAI,OAAO,EAAG;AACpC,YAAM,IAAI,OAAO;AACjB,WAAK,KAAK,OAAO;AAAA,IACnB,CAAC;AAAA,EACH,WAAW,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AACrE,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AAEA,SAAO,KAAK,KAAK,IAAI;AACvB;AAoPA,SAAS,cAAc,QAA6C,MAAuB;AACzF,MAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAC7B,MAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,EAAG,QAAO,OAAO,IAAI;AAC1E,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,MAAI,UAAmB;AACvB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AAC9E,cAAW,QAAoC,OAAO;AAAA,EACxD;AACA,SAAO;AACT;AAKA,MAAM,uBAAuB,oBAAI,IAAI,CAAC,aAAa,aAAa,aAAa,CAAC;AAE9E,SAAS,oBAAoB,KAAsB;AACjD,SAAO,qBAAqB,IAAI,GAAG;AACrC;AAEA,SAAS,eAAe,QAAiC,MAAc,OAAsB;AAC3F,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,MAAI,SAAS,WAAW,EAAG;AAC3B,MAAI,SAAS,KAAK,mBAAmB,EAAG;AACxC,MAAI,UAAmC;AACvC,WAAS,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG,SAAS;AACxD,UAAM,UAAU,SAAS,KAAK;AAC9B,UAAM,WAAW,QAAQ,OAAO;AAChC,UAAM,eACJ,CAAC,CAAC,YACF,OAAO,aAAa,YACpB,CAAC,MAAM,QAAQ,QAAQ,MACtB,OAAO,eAAe,QAAQ,MAAM,OAAO,aAAa,OAAO,eAAe,QAAQ,MAAM;AAE/F,QAAI,CAAC,cAAc;AACjB,YAAM,UAAU,uBAAO,OAAO,IAAI;AAClC,cAAQ,OAAO,IAAI;AACnB,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,eAAe,SAAS,SAAS,SAAS,CAAC;AACjD,MAAI,oBAAoB,YAAY,EAAG;AACvC,UAAQ,YAAY,IAAI;AAC1B;AAQA,SAAS,sBACP,QACA,iBACyB;AACzB,MAAI,CAAC,gBAAgB,KAAM,QAAO;AAClC,MAAI,SAAyC;AAC7C,aAAW,WAAW,iBAAiB;AACrC,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,OAAO,EAAG;AAC5D,QAAI,CAAC,OAAQ,UAAS,EAAE,GAAG,OAAO;AAClC,mBAAe,QAAQ,SAAS,OAAO,OAAO,CAAC;AAAA,EACjD;AACA,SAAO,UAAU;AACnB;AAEA,SAAS,4BACP,QACA,KACS;AACT,MAAI,CAAC,UAAU,CAAC,IAAK,QAAO;AAC5B,QAAM,aAAa,CAAC,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG;AACjD,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,SAAS,GAAG;AAC3D,aAAO,OAAO,SAAS;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,QACA,SACS;AACT,MAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,OAAO,GAAG;AACzD,WAAO,OAAO,OAAO;AAAA,EACvB;AACA,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,WAAO,4BAA4B,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7D;AACA,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,WAAO,4BAA4B,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAA8D;AACxF,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG,QAAO;AACtD,QAAM,WAAW,KACd,IAAI,CAAC,YAAY;AAChB,QAAI,OAAO,YAAY,YAAY,OAAO,YAAY,UAAU;AAC9D,YAAM,aAAa,OAAO,OAAO,EAAE,KAAK;AACxC,aAAO,WAAW,SAAS,IAAI,aAAa;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,YAA+B,YAAY,IAAI;AAC1D,SAAO,SAAS,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI;AACpD;AAEA,SAAS,4BAA4B,OAAyB;AAC5D,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI,QAAO;AAClE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAMA,cAAa,MAChB,IAAI,CAAC,UAAU,4BAA4B,KAAK,CAAC,EACjD,OAAO,CAAC,UAAU,UAAU,MAAS;AACxC,WAAOA,YAAW,SAASA,cAAa;AAAA,EAC1C;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,MAAI,cAAc,OAAO,aAAa,cAAc,KAAM,QAAO;AAEjE,QAAM,aAAsC,CAAC;AAC7C,QAAM,SAAS;AACf,aAAW,OAAO,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAE,GAAG;AAClF,UAAM,YAAY,4BAA4B,OAAO,GAAG,CAAC;AACzD,QAAI,cAAc,OAAW,YAAW,GAAG,IAAI;AAAA,EACjD;AACA,SAAO,OAAO,KAAK,UAAU,EAAE,SAAS,aAAa;AACvD;AAEA,SAAS,oBAAoB,QAAyC;AACpE,SAAO,KAAK,UAAU,4BAA4B,MAAM,KAAK,CAAC,CAAC;AACjE;AAEA,SAAS,yBAAyB,OAAwB;AACxD,SAAO,KAAK,UAAU,4BAA4B,KAAK,KAAK,IAAI;AAClE;AAEA,MAAM,2BAAwF;AAAA,EAC5F,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AACT;AA2BA,MAAM,6CAA6C,MAAM,UAGvD;AAAA,EACA,YAAY,OAAuF;AACjG,UAAM,KAAK;AACX,SAAK,QAAQ,EAAE,UAAU,MAAM;AAAA,EACjC;AAAA,EACA,OAAO,2BAA2B;AAChC,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EACA,SAAS;AACP,QAAI,KAAK,MAAM,UAAU;AACvB,aACE,qBAAC,SAAI,WAAU,qFACb;AAAA,4BAAC,OAAG,eAAK,MAAM,oBAAmB;AAAA,QAClC,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,KAAK,MAAM,SAAS,mBAE/E;AAAA,SACF;AAAA,IAEJ;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,kBAAkB,EAAE,IAAI,UAAU,SAAS,GAAkE;AACpH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,YAAY,EAAE,IAAI,SAAS,CAAC;AAChC,QAAM,QAA6B;AAAA,IACjC,WAAW,IAAI,UAAU,SAAS,SAAS;AAAA,IAC3C;AAAA,IACA,SAAS,aAAa,MAAM;AAAA,IAC5B,UAAU;AAAA,EACZ;AACA,QAAM,cAAc,MAAM,QAAkC,OAAO;AAAA,IACjE,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC,CAAC;AAAA,EACd,IAAI,CAAC,qBAAqB,YAAY,WAAW,YAAY,QAAQ,CAAC;AACtE,SACE,oBAAC,SAAI,KAAK,YAAY,OACpB,8BAAC,+BAA4B,OAAO,aAAc,UAAS,GAC7D;AAEJ;AAEO,SAAS,SAAkD;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,EACf,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AAEzB,QAAM,UAAU,MAAM;AAAE,oCAAgC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAAE,GAAG,CAAC,CAAC;AAC/E,QAAM,EAAE,SAAS,qBAAqB,IAAI,iBAAiB;AAC3D,QAAM,SAAS,UAAU;AACzB,QAAM,IAAI,KAAK;AACf,QAAM,sBAAsB,eAAe,EAAE,uBAAuB;AACpE,QAAM,yBAAyB,kBAAkB,EAAE,kBAAkB;AACrE,QAAM,qCAAqC,8BAA8B;AACzE,QAAM,cAAc,EAAE,yBAAyB;AAC/C,QAAM,cAAc,EAAE,yBAAyB;AAC/C,QAAM,cAAc,EAAE,wBAAwB;AAC9C,QAAM,YAAY,EAAE,oBAAoB;AACxC,QAAM,oBAAoB,EAAE,6BAA6B;AACzD,QAAM,wBAAwB,EAAE,+CAA+C,UAAU;AACzF,QAAM,uBAAuB,EAAE,uCAAuC,sCAAsC;AAC5G,QAAM,uBAAuB,EAAE,yCAAyC,SAAS;AACjF,QAAM,sBAAsB,EAAE,wCAAwC,eAAe;AACrF,QAAM,sBAAsB,EAAE,2CAA2C,oBAAoB;AAC7F,QAAM,4BAA4B,EAAE,iDAAiD,wCAAwC;AAC7H,QAAM,oBAAoB,QAAQ,gBAAgB,YAAY;AAC9D,QAAM,uBAAuB,oBACzB,EAAE,kCAAkC,+DAA+D,IACnG,EAAE,wBAAwB;AAC9B,QAAM,uBAAuB,EAAE,8BAA8B;AAC7D,QAAM,qBAAqB,EAAE,4BAA4B;AACzD,QAAM,mBAAmB,EAAE,0BAA0B;AACrD,QAAM,iBAAiB,MAAM,MAAM;AACnC,QAAM,SAAS,kBAAkB;AACjC,QAAM,eAAe,QAAQ,QAAQ;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM;AAAA,IAChC,OAAO,EAAE,GAAI,iBAAiB,CAAC,EAAG;AAAA,EACpC;AACA,QAAM,YAAY,MAAM,OAAO,MAAM;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAiC,CAAC,CAAC;AACrE,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAKlD,QAAM,gBAAgB,MAAM,OAAO,KAAK;AACxC,QAAM,cAAc,MAAM,OAAO,KAAK;AACtC,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,IAAI;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAA4C,CAAC,CAAC;AAChG,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA8B,CAAC,CAAC;AAChF,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA+C,IAAI;AAC7F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAwC,CAAC,CAAC;AACxG,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,MAAM,SAAS,KAAK;AAC9E,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,MAAM,SAAS,CAAC;AAC5E,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,MAAM,SAAgG,IAAI;AAClK,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,UAAU,MAAM,OAA8B,IAAI;AAGxD,QAAM,2BAA2B,QAAQ,iBAAiB;AAC1D,QAAM,sBAAsB,OAAO,sBAAsB,WAAW,kBAAkB,WAAW;AACjG,QAAM,6BAA6B,OAAO,sBAAsB,WAAW,kBAAkB,kBAAkB;AAC/G,QAAM,oBAAoB,MAAM,OAAO,oBAAI,IAAoC,CAAC;AAGhF,QAAM,wBAAwB,QAAQ,cAAc;AACpD,QAAM,mBAAmB,OAAO,mBAAmB,WAAW,eAAe,WAAW;AACxF,QAAM,qBAAqB,MAAM,OAA6C,IAAI;AAClF,QAAM,uBAAuB,MAAM,QAAQ,MAAM,0BAA0B,UAAU,SAAS,GAAG,CAAC,UAAU,SAAS,CAAC;AACtH,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAO,uBAAuB,qBAAqB,MAAM,IAAI,IAAI,CAAC;AAAA,IAClE,CAAC,oBAAoB;AAAA,EACvB;AACA,QAAM,kBAAkB,kBAAkB,SAAS,kBAAkB,CAAC,IAAI;AAG1E,QAAM,0BAA0B,MAAM,QAAQ,MAAM;AAClD,QAAI,gBAAiB,QAAO;AAC5B,QAAI,kBAAkB,QAAQ;AAC5B,YAAM,aAAa,kBAAkB,CAAC,EAAE,QAAQ,SAAS,GAAG;AAC5D,aAAO,aAAa,UAAU;AAAA,IAChC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,iBAAiB,CAAC;AACvC,QAAM,4BAA4B,MAAM,QAAQ,MAAM;AACpD,QAAI,kBAAmB,QAAO;AAC9B,QAAI,kBAAkB,OAAQ,QAAO,4BAA4B,SAAS,kBAAkB,CAAC,EAAE,QAAQ,SAAS,GAAG,CAAC;AACpH,WAAO,4BAA4B,SAAS,SAAS;AAAA,EACvD,GAAG,CAAC,mBAAmB,iBAAiB,CAAC;AACzC,QAAM,wBAAwB,0BAA0B,GAAG,uBAAuB,YAAY;AAE9F,QAAM,WAAW,MAAM,QAAQ,MAAM;AACnC,UAAM,MAAM,OAAO;AACnB,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,GAAG;AAC9C,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AACX,QAAM,mBAAmB,aACvB,gBAAgB,eAAe,UAAa,eAAe,eAAe,OACtE,SACA,OAAO,eAAe,UAAU,EAAE,KAAK,KAAK;AAGlD,QAAM,YAAY,WAAW,WAAW;AAYxC,QAAM,kCAAkC,MAAM,QAAmC,MAAM;AACrF,QAAI,sBAAuB,QAAO;AAClC,QAAI,4BAA4B,OAAW,QAAO;AAClD,UAAM,SAAS;AACf,UAAM,QAAQ,QAAQ;AACtB,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,UAAM,QAAQ,QAAQ;AACtB,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,WAAO;AAAA,EACT,GAAG,CAAC,uBAAuB,yBAAyB,aAAa,CAAC;AAElE,QAAM,mBAAmB,MAAM,QAAQ,OAAO;AAAA,IAC5C;AAAA,IACA,UAAU;AAAA,IACV,cAAc,gBAAgB;AAAA,IAC9B,YAAY,YAAY,gBAAgB;AAAA,IACxC,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,QAAQ,iBAAiB,gBAAgB,cAAc,gBAAgB,YAAY,UAAU,kBAAkB,WAAW,SAAS,SAAS,CAAC;AAClJ,QAAM,sBAAsB,MAAM,OAAO,gBAAgB;AACzD,QAAM,UAAU,MAAM;AACpB,wBAAoB,UAAU;AAAA,EAChC,GAAG,CAAC,gBAAgB,CAAC;AACrB,QAAM,UAAU,MAAM;AACpB,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM,OAAO,KAAK;AACrC,QAAM,4BAA4B,MAAM,OAAO,KAAK;AACpD,QAAM,8BAA8B,MAAM,OAAO,KAAK;AACtD,QAAM,4BAA4B,MAAM,OAAO,KAAK;AACpD,QAAM,mCAAmC,MAAM,OAAsB,IAAI;AACzE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AACtE,QAAM,sBAAsB,MAAM,OAAO,KAAK;AAC9C,QAAM,qCAAqC,MAAM,OAAO,+BAA+B;AACvF,QAAM,UAAU,MAAM;AACpB,uCAAmC,UAAU;AAAA,EAC/C,GAAG,CAAC,+BAA+B,CAAC;AAEpC,QAAM,UAAU,MAAM;AAGpB,QAAI,YAAY,CAAC,wBAAwB;AACvC,iBAAW,UAAU;AACrB,2BAAqB,KAAK;AAC1B;AAAA,IACF;AACA,UAAM,WAAW,yBAAyB;AAC1C,QAAI,CAAC,UAAU;AACb,iBAAW,UAAU;AACrB,2BAAqB,KAAK;AAC1B;AAAA,IACF;AACA,UAAM,kBAAkB,oBAAoB,MAAiC;AAC7E,UAAM,QAAQ,oBAAoB;AAClC,eAAW,UAAU;AACrB,yBAAqB,KAAK;AAAA,EAC5B,GAAG,CAAC,UAAU,wBAAwB,MAAM,CAAC;AAE7C,QAAM,UAAU,MAAM;AACpB,oBAAgB,iBAAiB;AAAA,EACnC,GAAG,CAAC,mBAAmB,aAAa,CAAC;AAErC,QAAM,sBAAsB,MAAM,YAAY,MAAM;AAClD,8BAA0B,UAAU;AACpC,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,WAAW,MAAM;AACtB,kCAA0B,UAAU;AAAA,MACtC,GAAG,CAAC;AAAA,IACN;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8B,MAAM,YAAY,MAAM;AAC1D,8BAA0B,UAAU;AACpC,QAAI,OAAO,WAAW,eAAe,iCAAiC,YAAY,MAAM;AACtF,aAAO,aAAa,iCAAiC,OAAO;AAC5D,uCAAiC,UAAU;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,kCAAkC,MAAM,YAAY,MAAM;AAC9D,QAAI,OAAO,WAAW,YAAa;AACnC,8BAA0B,UAAU;AACpC,QAAI,iCAAiC,YAAY,MAAM;AACrD,aAAO,aAAa,iCAAiC,OAAO;AAAA,IAC9D;AACA,qCAAiC,UAAU,OAAO,WAAW,MAAM;AACjE,gCAA0B,UAAU;AACpC,uCAAiC,UAAU;AAAA,IAC7C,GAAG,IAAI;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,kCAA4B;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,2BAA2B,CAAC;AAEhC,QAAM,kBAAkB,MAAM,YAAY,CAAC,mBAA6C;AACtF,UAAM,SAAS,kBAAmB,UAAU;AAC5C,6BAAyB,UAAU,oBAAoB,MAAM;AAC7D,2BAAuB,UAAU,EAAE,GAAG,OAAO;AAC7C,0BAAsB,QAAQ,MAAM;AACpC,eAAW,UAAU;AACrB,yBAAqB,KAAK;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwB,MAAM,YAAY,YAA8B;AAC5E,QAAI,CAAC,WAAW,WAAW,OAAO,WAAW,YAAa,QAAO;AACjE,QAAI,0BAA0B,WAAW,0BAA0B,QAAS,QAAO;AACnF,QAAI,4BAA4B,QAAS,QAAO;AAChD,gCAA4B,UAAU;AACtC,QAAI;AACF,YAAM,YAAY,MAAM,QAAQ;AAAA,QAC9B,OAAO,EAAE,kCAAkC,2DAA2D;AAAA,MACxG,CAAC;AACD,UAAI,UAAW,qBAAoB;AACnC,aAAO;AAAA,IACT,UAAE;AACA,kCAA4B,UAAU;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,qBAAqB,SAAS,CAAC,CAAC;AAEpC,QAAM,UAAU,MAAM;AAIpB,QAAK,YAAY,CAAC,0BAA2B,CAAC,kBAAmB;AACjE,UAAM,sBAAsB,CAAC,UAA6B;AACxD,UAAI,CAAC,WAAW,WAAW,0BAA0B,QAAS;AAC9D,YAAM,eAAe;AACrB,YAAM,cAAc;AAAA,IACtB;AACA,WAAO,iBAAiB,gBAAgB,mBAAmB;AAE3D,UAAM,eAAe,CAAC,UAAsB;AAC1C,UAAI,MAAM,iBAAkB;AAC5B,UAAI,CAAC,WAAW,QAAS;AACzB,YAAM,SAAU,MAAM,QAAwB,UAAU,SAAS;AACjE,UAAI,CAAC,OAAQ;AACb,YAAM,OAAO,OAAO,aAAa,MAAM;AACvC,UAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,MAAM,EAAG;AAC5F,UAAI,OAAO,WAAW,YAAY,MAAM,WAAW,MAAM,WAAW,MAAM,SAAU;AACpF,YAAM,SAAS,gCAAgC,IAAI;AACnD,UAAI,CAAC,OAAQ;AACb,UAAI,mCAAmC,UAAU,MAAM,EAAG;AAC1D,YAAM,mBAAmB,yBAAyB;AAClD,UAAI,oBAAoB,oBAAoB,UAAU,OAAkC,MAAM,kBAAkB;AAC9G,mBAAW,UAAU;AACrB,6BAAqB,KAAK;AAC1B;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,UAAI,4BAA4B,QAAS;AACzC,WAAK,sBAAsB,EAAE,KAAK,CAAC,cAAc;AAC/C,YAAI,CAAC,UAAW;AAChB,wBAAgB;AAChB,eAAO,KAAK,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AACA,aAAS,iBAAiB,SAAS,cAAc,IAAI;AAErD,UAAM,oBAAoB,OAAO,QAAQ,UAAU,KAAK,OAAO,OAAO;AACtE,UAAM,uBAAuB,OAAO,QAAQ,aAAa,KAAK,OAAO,OAAO;AAE5E,UAAM,2BAA2B,CAAC,cAC/B,CAAC,MAAe,QAAgB,QAA8B;AAC7D,YAAM,SAAS,gCAAgC,OAAO,IAAI;AAC1D,UAAI,CAAC,UAAU,0BAA0B,WAAW,0BAA0B,SAAS;AACrF,eAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,MACnC;AACA,UAAI,CAAC,WAAW,SAAS;AACvB,eAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,MACnC;AACA,UAAI,mCAAmC,UAAU,MAAM,GAAG;AACxD,eAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,MACnC;AACA,YAAM,mBAAmB,yBAAyB;AAClD,UAAI,oBAAoB,oBAAoB,UAAU,OAAkC,MAAM,kBAAkB;AAC9G,mBAAW,UAAU;AACrB,6BAAqB,KAAK;AAC1B,eAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,MACnC;AACA,UAAI,4BAA4B,SAAS;AACvC,eAAO;AAAA,MACT;AACA,WAAK,sBAAsB,EAAE,KAAK,CAAC,cAAc;AAC/C,YAAI,CAAC,UAAW;AAChB,wBAAgB;AAChB,iBAAS,MAAM,QAAQ,GAAG;AAAA,MAC5B,CAAC;AACD,aAAO;AAAA,IACT;AAEF,UAAM,kBAAkB,MAAM;AAC5B,UAAI,oBAAoB,SAAS;AAC/B,4BAAoB,UAAU;AAC9B;AAAA,MACF;AACA,UAAI,CAAC,WAAW,WAAW,0BAA0B,WAAW,0BAA0B,QAAS;AACnG,0BAAoB,UAAU;AAC9B,aAAO,QAAQ,GAAG,CAAC;AACnB,UAAI,4BAA4B,QAAS;AACzC,WAAK,sBAAsB,EAAE,KAAK,CAAC,cAAc;AAC/C,YAAI,CAAC,UAAW;AAChB,wBAAgB;AAChB,4BAAoB;AACpB,eAAO,QAAQ,KAAK;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,WAAO,QAAQ,YAAY,yBAAyB,iBAAiB;AACrE,WAAO,QAAQ,eAAe,yBAAyB,oBAAoB;AAC3E,WAAO,iBAAiB,YAAY,eAAe;AAEnD,WAAO,MAAM;AACX,aAAO,oBAAoB,gBAAgB,mBAAmB;AAC9D,eAAS,oBAAoB,SAAS,cAAc,IAAI;AACxD,aAAO,oBAAoB,YAAY,eAAe;AACtD,aAAO,QAAQ,YAAY;AAC3B,aAAO,QAAQ,eAAe;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,qBAAqB,iBAAiB,uBAAuB,UAAU,mBAAmB,QAAQ,sBAAsB,CAAC;AAE7H,QAAM,EAAE,SAAS,iBAAiB,IAAI,oBAAoB,yBAAyB;AAAA,IACjF,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,EAAE,SAAS,qBAAqB,IAAI;AAAA,IACxC,0BAA0B,GAAG,uBAAuB,YAAY;AAAA,EAClE;AAEA,QAAM,EAAE,cAAc,sBAAsB,IAAI,uBAAuB,2BAA2B,IAAI,gBAAgB;AACtH,QAAM,iCAAiC,oCAAoC,QAAQ,uBAAuB;AAK1G,QAAM,yBAAyB,MAAM,QAAQ,MAAM;AACjD,UAAM,MAAM,oBAAI,IAAY;AAC5B,eAAW,UAAU,oBAAoB,CAAC,GAAG;AAC3C,YAAM,WAAW,OAAO,QAAQ;AAChC,UAAI,CAAC,YAAY,SAAS,YAAY,MAAO;AAC7C,iBAAW,WAAW,SAAS,kBAAkB,CAAC,EAAG,KAAI,IAAI,OAAO;AAAA,IACtE;AACA,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,4BAA4B,MAAM;AAAA,IACtC,OAAO,gBAAyE;AAC9E,UAAI,CAAC,kCAAkC,CAAC,OAAO,KAAK,WAAW,EAAE,OAAQ,QAAO;AAChF,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA,oBAAoB;AAAA,UACpB,EAAE,cAAc,UAAU,QAAmB;AAAA,QAC/C;AACA,cAAM,cAAc,OAAO;AAC3B,YAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,EAAG,QAAO;AAC1F,eAAO,OAAO;AAAA,UACZ,OAAO,QAAQ,WAAsC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,QACnG;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,4CAA4C,GAAG;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,gCAAgC,qBAAqB;AAAA,EACxD;AAEA,QAAM,6BAA6B,MAAM;AAAA,IACvC,CAAC,YAA+C;AAC9C,UAAI,OAAO,YAAY,SAAU,QAAO;AACxC,YAAM,UAAU,QAAQ,KAAK;AAC7B,UAAI,CAAC,QAAS,QAAO;AACrB,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,4BAA4B,MAAM;AAAA,IACtC,CAAC,gBACC,OAAO;AAAA,MACL,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,SAAS,OAAO,MAAM,CAAC,SAAS,2BAA2B,OAAO,CAAC,CAAC;AAAA,IACxG;AAAA,IACF,CAAC,0BAA0B;AAAA,EAC7B;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,CAAC,gBACC,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC/B,KAAK,WAAW;AAAA,MAChB,MAAM,WAAW;AAAA,MACjB,YAAY;AAAA,QACV,YAAY,MAAM,QAAQ,WAAW,UAAU,IAAI,WAAW,aAAa,CAAC;AAAA,MAC9E;AAAA,IACF,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,MAAM;AAAA,IAC1B,OAAO,WAAqC;AAC1C,UAAI,CAAC,+BAAgC,QAAO;AAC5C,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,UAAU;AAAA,UACV,oBAAoB;AAAA,UACpB,EAAE,OAAO;AAAA,QACX;AACA,YAAI,CAAC,OAAO,IAAI;AACd,gBAAM,OAAO,WAAW,EAAE,8BAA8B,4BAA4B,GAAG,OAAO;AAC9F,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU,EAAE,8BAA8B,4BAA4B;AAChI,cAAM,SAAS,OAAO;AACtB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,gCAAgC,GAAG,qBAAqB;AAAA,EAC3D;AAEA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,OAAO,WAAmB;AACxB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,MAAM,cAAc,MAAM;AAC1C,UAAI,SAAS;AACX,4BAAoB;AACpB,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,eAAe,MAAM;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,kCAAkC,OAAO,WAAW,YAAa;AACtE,UAAM,cAAc,CAAC,UAAiB;AACpC,YAAM,cAAc;AACpB,WAAK,sBAAsB,cAAc,UAAU,SAAoB,oBAAoB,SAAS;AAAA,QAClG,UAAU,YAAY;AAAA,MACxB,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,gBAAQ,MAAM,mCAAmC,GAAG;AAAA,MACtD,CAAC;AAAA,IACH;AACA,WAAO,iBAAiB,YAAY,WAA4B;AAChE,WAAO,MAAM;AACX,aAAO,oBAAoB,YAAY,WAA4B;AAAA,IACrE;AAAA,EACF,GAAG,CAAC,gCAAgC,qBAAqB,CAAC;AAE1D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,kCAAkC,OAAO,aAAa,YAAa;AACxE,UAAM,iBAAiB,MAAM;AAC3B,WAAK,sBAAsB,sBAAsB,UAAU,SAAoB,oBAAoB,SAAS;AAAA,QAC1G,SAAS,SAAS,oBAAoB;AAAA,MACxC,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,gBAAQ,MAAM,2CAA2C,GAAG;AAAA,MAC9D,CAAC;AAAA,IACH;AACA,aAAS,iBAAiB,oBAAoB,cAAc;AAC5D,mBAAe;AACf,WAAO,MAAM;AACX,eAAS,oBAAoB,oBAAoB,cAAc;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,gCAAgC,qBAAqB,CAAC;AAE1D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,+BAAgC;AACrC,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,OAAO,WAAW,YAAa;AAC5C,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,MAAM,iBAAkB;AAC5B,UAAI,MAAM,WAAW,EAAG;AACxB,UAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,OAAQ;AACtE,YAAM,gBAAgB,MAAM,kBAAkB,UAAU,MAAM,SAAS;AACvE,YAAM,cAAc,eAAe,QAAQ,SAAS;AACpD,UAAI,EAAE,uBAAuB,mBAAoB;AACjD,UAAI,CAAC,KAAK,SAAS,WAAW,EAAG;AACjC,UAAI,YAAY,UAAU,YAAY,WAAW,QAAS;AAC1D,YAAM,UAAU,YAAY,aAAa,MAAM;AAC/C,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAI,SAAS;AACb,UAAI,QAAQ,WAAW,SAAS,KAAK,QAAQ,WAAW,UAAU,GAAG;AACnE,YAAI;AACF,gBAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,cAAI,OAAO,WAAW,OAAO,SAAS,OAAQ;AAC9C,mBAAS,GAAG,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI;AAAA,QAC3D,QAAQ;AACN;AAAA,QACF;AAAA,MACF,WAAW,CAAC,QAAQ,WAAW,GAAG,GAAG;AACnC;AAAA,MACF;AACA,YAAM,eAAe;AACrB,WAAK,kBAAkB,MAAM;AAAA,IAC/B;AACA,SAAK,iBAAiB,SAAS,oBAAoB,IAAI;AACvD,WAAO,MAAM;AACX,WAAK,oBAAoB,SAAS,oBAAoB,IAAI;AAAA,IAC5D;AAAA,EACF,GAAG,CAAC,gCAAgC,iBAAiB,CAAC;AAEtD,QAAM,UAAU,MAAM;AACpB,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,kBAAc,QAAQ,KAAK,QAAQ,uBAAuB,CAAC,CAAC;AAAA,EAC9D,GAAG,CAAC,CAAC;AACL,QAAM,oBAAoB,aACtB,2GACA;AAOJ,QAAM,oBAAoB;AAE1B,QAAM,8BAA8B,MAAM;AAAA,IACxC,CAAC,mBAAkC;AACjC,UAAI,CAAC,eAAgB,QAAO;AAC5B,UAAI;AACF,cAAM,UAAU,mBAAmB,cAAc;AACjD,eAAO,eAAe,0BAA0B,OAAO,KAAK,4BAA4B,OAAO;AAAA,MACjG,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,gCAAgC,MAAM,YAAY,MAAM;AAC5D,8BAA0B,CAAC,SAAS,OAAO,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAGL,QAAM,eAAe,MAAM,YAAY,YAAY;AACjD,QAAI,CAAC,SAAU;AACf,QAAI,YAAY,QAAS;AACzB,gBAAY,UAAU;AACtB,UAAM,gBAAgB;AACtB,QAAI;AACF,YAAM,YAAY,MAAM,QAAQ;AAAA,QAC9B,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,UAAW;AAEhB,UAAI;AACJ,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,SAAS,MAAM,sBAAsB,kBAAkB,eAAe,gBAAgB;AAC5F,cAAI,CAAC,OAAO,IAAI;AACd,gBAAI;AACF,kBAAI,OAAO,WAAW,aAAa;AACjC,6CAA6B;AAAA,kBAC3B,WAAW;AAAA,kBACX;AAAA,kBACA,OAAO,OAAO,WAAW;AAAA,gBAC3B,CAAC;AACD,uBAAO,cAAc,IAAI,YAAY,sBAAsB;AAAA,kBACzD,QAAQ;AAAA,oBACN;AAAA,oBACA,OAAO,OAAO,WAAW;AAAA,kBAC3B;AAAA,gBACF,CAAC,CAAC;AAAA,cACJ;AAAA,YACF,QAAQ;AAAA,YAER;AACA,gBAAI,OAAO,eAAe,OAAO,KAAK,OAAO,WAAW,EAAE,QAAQ;AAChE,oBAAM,oBAAoB,MAAM,0BAA0B,OAAO,WAAW;AAC5E,wBAAU,0BAA0B,iBAAiB,CAAC;AAAA,YACxD;AACA,kBAAM,UAAU,OAAO,WAAW,EAAE,8BAA8B,4BAA4B;AAC9F,kBAAM,SAAS,OAAO;AACtB;AAAA,UACF;AACA,oCAA0B,OAAO;AAAA,QACnC,SAAS,KAAK;AACZ,kBAAQ,MAAM,uCAAuC,GAAG;AACxD,gBAAM,EAAE,8BAA8B,4BAA4B,GAAG,OAAO;AAC5E;AAAA,QACF;AAAA,MACF;AAEA,iBAAW,IAAI;AACf,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,sBAAsB,YAAY,eAAe,gBAAgB;AAAA,QACzE,SAAS,KAAK;AACZ,kBAAQ,MAAM,iCAAiC,GAAG;AAClD,gBAAM,EAAE,8BAA8B,4BAA4B,GAAG,OAAO;AAC5E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,uBAAuB,0BAA0B,+BAA+B;AACtF,YAAM,sBAAsB;AAAA,QAC1B,GAAI,2BAA2B,CAAC;AAAA,QAChC,GAAG;AAAA,MACL;AACA,UAAI,OAAO,KAAK,mBAAmB,EAAE,SAAS,GAAG;AAC/C,cAAM,4BAA4B,qBAAqB,YAAY;AACjE,gBAAM,SAAS;AAAA,QACjB,CAAC;AAAA,MACH,OAAO;AACL,cAAM,SAAS;AAAA,MACjB;AAEA,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,sBAAsB,iBAAiB,eAAe,gBAAgB;AAAA,QAC9E,SAAS,KAAK;AACZ,kBAAQ,MAAM,sCAAsC,GAAG;AAAA,QACzD;AAAA,MACF;AACA,UAAI;AAAE,cAAM,sBAAsB,SAAS;AAAA,MAAE,QAAQ;AAAA,MAAC;AAEtD,UAAI,OAAO,mBAAmB,YAAY,gBAAgB;AACxD,cAAM,kBAAkB,cAAc;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,sBAAsB,iBAAiB,eAAe,kBAAkB,EAAE,OAAO,IAAI,CAAC;AAAA,QAC9F,SAAS,WAAW;AAClB,kBAAQ,MAAM,sCAAsC,SAAS;AAAA,QAC/D;AAAA,MACF;AACA,UAAI;AACF,YAAI,OAAO,WAAW,aAAa;AACjC,uCAA6B;AAAA,YAC3B,WAAW;AAAA,YACX;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AACD,iBAAO,cAAc,IAAI,YAAY,sBAAsB;AAAA,YACzD,QAAQ;AAAA,cACN;AAAA,cACA,OAAO;AAAA,YACT;AAAA,UACF,CAAC,CAAC;AAAA,QACJ;AAAA,MACF,QAAQ;AAAA,MAER;AACA,YAAM,yBAAyB,8BAA8B,GAAG;AAChE,UAAI,wBAAwB;AAE1B,YAAI;AAAE,gCAAsB,KAAK,CAAC;AAAA,QAAE,QAAQ;AAAA,QAAC;AAAA,MAC/C,OAAO;AACL,cAAM,UAAU,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACpE,YAAI;AAAE,gBAAM,SAAS,OAAO;AAAA,QAAE,QAAQ;AAAA,QAAC;AAAA,MACzC;AAAA,IACF,UAAE;AACA,kBAAY,UAAU;AACtB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,QAAQ,OAAO;AACrB,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,WAAO,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,WAAW,IAAI;AAAA,EACjE,GAAG,CAAC,MAAM,CAAC;AACX,QAAM,aAAa,QAAQ,QAAQ,MAAM,OAAO,kBAAkB,YAAY,gBAAgB,CAAC;AAC/F,QAAM,wBAAwB,QAAQ,gBAAgB,cAAc,OAAO,eAAe,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC;AACvH,QAAM,uBACJ;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,wBAAwB,iBAAkB;AAAA,MAClD;AAAA,MACA,aAAa,gBAAgB;AAAA,MAC7B,cAAc,gBAAgB;AAAA;AAAA,EAChC;AAEF,QAAM,wBAAwB,wBAC5B;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,MACN,cAAc,CAAC,YAAY,UAAU,OAAkC;AAAA,MACvE,UAAU;AAAA;AAAA,EACZ,IACE;AACJ,QAAM,qBAAqB,yBAAyB,yBAAyB,eAC3E,iCACG;AAAA,4BAAwB,uBAAuB;AAAA,IAC/C;AAAA,IACA;AAAA,KACH,IACE;AAGJ,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,mBAAe,OAAO;AACpB,UAAI,CAAC,kBAAkB,QAAQ;AAC7B,yBAAiB,CAAC,CAAC;AACnB,sBAAc,IAAI;AAClB,iCAAyB,KAAK;AAC9B;AAAA,MACF;AAEA,+BAAyB,IAAI;AAC7B,UAAI;AACF,cAAM,MAAM,MAAM,OAAO,0BAA0B;AACnD,cAAM,EAAE,aAAa,SAAS,IAAI,MAAM,IAAI,8BAA8B,mBAAmB,QAAW,EAAE,SAAS,aAAa,CAAC;AACjI,YAAI,CAAC,WAAW;AACd,2BAAiB,WAAW;AAC5B,wBAAc,QAAQ;AACtB,kCAAwB,CAAC,SAAS;AAChC,kBAAM,OAAsC,CAAC;AAC7C,gBAAI,UAAU;AACd,8BAAkB,QAAQ,CAACC,cAAa;AACtC,oBAAM,WAAW,KAAKA,SAAQ;AAC9B,oBAAM,YAAY,SAAS,oBAAoBA,SAAQ,KAAK,CAAC;AAC7D,oBAAM,mBAAmB,UAAU,CAAC,GAAG,QAAQ;AAC/C,oBAAM,QAAQ,aAAa,SAAY,WAAW;AAClD,mBAAKA,SAAQ,IAAI;AACjB,kBAAI,aAAa,MAAO,WAAU;AAAA,YACpC,CAAC;AACD,gBAAI,OAAO,KAAK,IAAI,EAAE,WAAW,OAAO,KAAK,IAAI,EAAE,OAAQ,WAAU;AACrE,mBAAO,UAAU,OAAO;AAAA,UAC1B,CAAC;AACD,mCAAyB,KAAK;AAAA,QAChC;AAAA,MACF,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,2BAAiB,CAAC,CAAC;AACnB,wBAAc,IAAI;AAClB,mCAAyB,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AACA,SAAK;AACL,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAC,mBAAmB,cAAc,sBAAsB,CAAC;AAE5D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,uBAAwB;AAC7B,4BAAwB,CAAC,SAAS;AAChC,UAAI,UAAU;AACd,YAAM,OAAO,EAAE,GAAG,KAAK;AACvB,wBAAkB,QAAQ,CAACA,cAAa;AACtC,cAAM,UAAU,uBAAuBA,SAAQ;AAC/C,YAAI,CAAC,QAAS;AACd,cAAM,MAAM,OAAO,QAAQ,QAAQ;AACnC,YAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,GAAG;AACpD,gBAAM,aAAa,IAAI,KAAK;AAC5B,cAAI,KAAKA,SAAQ,MAAM,YAAY;AACjC,iBAAKA,SAAQ,IAAI;AACjB,sBAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,UAAU,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,wBAAwB,mBAAmB,MAAM,CAAC;AAEtD,QAAM,oBAAoB,YAAY,qBAAqB,CAAC;AAC5D,QAAM,iBAAiB,YAAY,kBAAkB,CAAC;AAEtD,QAAM,EAAE,UAAU,kBAAkB,IAAI,MAAM,QAAQ,MAAM;AAC1D,QAAI,CAAC,cAAc,OAAQ,QAAO,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAAC,EAA+B;AACrG,UAAM,aAA0B,CAAC;AACjC,UAAM,SAAoC,CAAC;AAC3C,UAAM,eAAe,IAAI,WAAW,IAAiC;AACrE,kBAAc,QAAQ,CAAC,QAAQ;AAC7B,YAAMA,YAAW,OAAO,IAAI,aAAa,YAAY,IAAI,SAAS,KAAK,EAAE,SACrE,IAAI,SAAS,KAAK,IAClB,kBAAkB,CAAC;AACvB,UAAI,CAACA,UAAU;AACf,YAAM,SAAS,aAAa,IAAIA,SAAQ,KAAK,CAAC;AAC9C,aAAO,KAAK,GAAG;AACf,mBAAa,IAAIA,WAAU,MAAM;AAAA,IACnC,CAAC;AAED,UAAM,eAAe,CACnBA,WACA,cACA,SACA,aACoC;AACpC,UAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,YAAM,YAAY,IAAI,WAAW,IAAoC;AACrE,YAAM,QAAkB,CAAC;AACzB,YAAM,mBAAmB,IAAI,WAAW,IAA6D;AACrG,UAAI,MAAM,QAAQ,UAAU,MAAM,GAAG;AACnC,iBAAS,OAAO,QAAQ,CAAC,UAAU;AACjC,cAAI,CAAC,OAAO,KAAM;AAClB,2BAAiB,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,QAC7F,CAAC;AAAA,MACH;AACA,YAAM,aAAa,CAAC,GAAG,OAAO,EAC3B,OAAO,CAAC,eAAe,aAAa,YAAY,MAAM,CAAC,EACvD,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AACvD,YAAM,eAAe,CAAC,MAAqB,QAAmD;AAC5F,cAAM,MAAM,QAAQ;AACpB,YAAI,SAAS,UAAU,IAAI,GAAG;AAC9B,YAAI,CAAC,QAAQ;AACX,gBAAM,eAAe,OAAO,iBAAiB,IAAI,IAAI,IAAI;AACzD,gBAAM,aAAa,OAAO,IAAI,QAAQ;AACtC,gBAAM,QACJ,SAAS,OACL,SACA,YAAY,SAAS,cAAc,SAAS,YAAY,QAAQ,cAAc,QAAQ;AAC5F,gBAAM,OAAO,YAAY,QAAQ,cAAc;AAC/C,mBAAS,EAAE,MAAM,OAAO,MAAM,QAAQ,CAAC,EAAE;AACzC,oBAAU,IAAI,KAAK,MAAM;AACzB,gBAAM,KAAK,GAAG;AAAA,QAChB,WAAW,QAAQ,CAAC,OAAO,OAAO;AAChC,gBAAM,eAAe,iBAAiB,IAAI,IAAI;AAC9C,gBAAM,aAAa,IAAI,SAAS;AAChC,iBAAO,QAAQ,YAAY,SAAS,cAAc,SAAS,YAAY,QAAQ,cAAc,QAAQ,OAAO;AAC5G,iBAAO,OAAO,YAAY,QAAQ,cAAc,QAAQ,OAAO;AAAA,QACjE;AACA,eAAO;AAAA,MACT;AACA,iBAAW,QAAQ,CAAC,eAAe;AACjC,cAAM,QAAQ,iCAAiC,YAAY,EAAE,SAAS,aAAa,CAAC;AACpF,YAAI,CAAC,MAAO;AACZ,mBAAW,KAAK,KAAK;AACrB,cAAM,SAAS,aAAa,WAAW,OAAO,QAAQ,MAAM,UAAU;AACtE,eAAO,OAAO,KAAK,KAAK;AAAA,MAC1B,CAAC;AACD,YAAMC,UAAS,MACZ,IAAI,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAE,EAChC,OAAO,CAAC,UAAU,MAAM,OAAO,SAAS,CAAC;AAC5C,UAAI,CAACA,QAAO,OAAQ,QAAO;AAC3B,aAAO;AAAA,QACL,UAAAD;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,UAAU,SAAS;AAAA,QAC1B,aAAa,UAAU;AAAA,QACvB,QAAAC;AAAA,MACF;AAAA,IACF;AAEA,UAAMC,aAAY,kBAAkB,SAAS,oBAAoB,MAAM,KAAK,aAAa,KAAK,CAAC;AAC/F,IAAAA,WAAU,QAAQ,CAACF,cAAa;AAC9B,YAAM,gBAAgB,aAAa,IAAIA,SAAQ,KAAK,CAAC;AACrD,UAAI,CAAC,cAAc,OAAQ;AAC3B,YAAM,qBAAqB,kBAAkBA,SAAQ,KAAK,CAAC;AAC3D,YAAM,eAAe,mBAAmB,SAAS;AACjD,YAAM,0BACJ,eAAeA,SAAQ,GAAG,4BAA4B;AACxD,YAAM,iBAAiB,IAAI,WAAW,IAAwC;AAC9E,oBAAc,QAAQ,CAAC,QAAQ;AAC7B,cAAM,cAAc,MAAM,QAAQ,IAAI,SAAS,IAC3C,IAAI,UACD,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,IACrC,CAAC;AACL,YAAI,YAAY,SAAS,GAAG;AAC1B,sBAAY,QAAQ,CAACG,UAAS;AAC5B,kBAAMC,UAAS,eAAe,IAAID,KAAI,KAAK,CAAC;AAC5C,YAAAC,QAAO,KAAK,GAAG;AACf,2BAAe,IAAID,OAAMC,OAAM;AAAA,UACjC,CAAC;AACD;AAAA,QACF;AACA,cAAM,OAAO,OAAO,IAAI,aAAa,YAAY,IAAI,SAAS,KAAK,EAAE,SAAS,IAAI,IAAI,SAAS,KAAK,IAAI;AACxG,cAAM,SAAS,eAAe,IAAI,IAAI,KAAK,CAAC;AAC5C,eAAO,KAAK,GAAG;AACf,uBAAe,IAAI,MAAM,MAAM;AAAA,MACjC,CAAC;AACD,YAAM,WAAuC,CAAC;AAE9C,YAAM,qBAAqB,CAAC,SAAkD;AAC5E,cAAM,WAAW,OAAO,mBAAmB,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI,IAAI;AAC5E,eAAO;AAAA,UACL,UAAAJ;AAAA,UACA,cAAc;AAAA,UACd;AAAA,UACA,OAAO,UAAU,SAAS;AAAA,UAC1B,aAAa,UAAU;AAAA,UACvB,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,cAAc;AACjB,cAAM,eACJ,eAAe,IAAI,IAAI,KAAK,MAAM,KAAK,eAAe,OAAO,CAAC,EAAE,KAAK;AACvE,cAAM,UAAU,aAAaA,WAAU,MAAM,cAAc,MAAS;AACpE,YAAI,QAAS,UAAS,KAAK,OAAO;AAAA,MACpC,WAAW,yBAAyB;AAClC,cAAM,iBAAiB,mBAAmB,IAAI,CAAC,OAAO,GAAG,IAAI;AAC7D,cAAM,iBACJ,qBAAqBA,SAAQ,KAAK,eAAe,SAAS,qBAAqBA,SAAQ,CAAE,IACrF,qBAAqBA,SAAQ,IAC7B,mBAAmB,CAAC,GAAG,QAAQ;AACrC,cAAM,aAAa,iBAAiB,eAAe,IAAI,cAAc,KAAK,CAAC,IAAI,eAAe,IAAI,IAAI,KAAK,CAAC;AAC5G,cAAM,gBAAgB,iBAClB;AAAA,UACEA;AAAA,UACA;AAAA,UACA;AAAA,UACA,mBAAmB,KAAK,CAAC,OAAO,GAAG,SAAS,cAAc;AAAA,QAC5D,IACA,aAAaA,WAAU,MAAM,YAAY,MAAS;AACtD,YAAI,eAAe;AACjB,mBAAS,KAAK,aAAa;AAAA,QAC7B,WAAW,gBAAgB;AACzB,mBAAS,KAAK,mBAAmB,cAAc,CAAC;AAAA,QAClD;AACA,cAAM,aAAa,eAAe,IAAI,IAAI;AAC1C,YAAI,YAAY,UAAU,gBAAgB;AACxC,gBAAM,iBAAiB,aAAaA,WAAU,MAAM,YAAY,MAAS;AACzE,cAAI,eAAgB,UAAS,KAAK,cAAc;AAAA,QAClD;AAAA,MACF,OAAO;AACL,2BAAmB,QAAQ,CAAC,aAAa;AACvC,gBAAM,OAAO,eAAe,IAAI,SAAS,IAAI,KAAK,CAAC;AACnD,gBAAM,UAAU,aAAaA,WAAU,SAAS,MAAM,MAAM,QAAQ;AACpE,cAAI,QAAS,UAAS,KAAK,OAAO;AAAA,QACpC,CAAC;AACD,cAAM,aAAa,eAAe,IAAI,IAAI;AAC1C,YAAI,YAAY,QAAQ;AACtB,gBAAM,UAAU,aAAaA,WAAU,MAAM,YAAY,MAAS;AAClE,cAAI,QAAS,UAAS,KAAK,OAAO;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,UAAU,cAAc;AACpC,cAAM,eAAe,mBAAmB,CAAC,GAAG,QAAQ;AACpD,iBAAS,KAAK,mBAAmB,YAAY,CAAC;AAAA,MAChD;AAEA,aAAO,KAAK;AAAA,QACV,UAAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,qBAAqBA,SAAQ,KAAK,mBAAmB,CAAC,GAAG,QAAQ;AAAA,MACnF,CAAC;AAAA,IACH,CAAC;AAED,WAAO,EAAE,UAAU,YAAY,mBAAmB,OAAO;AAAA,EAC3D,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,2BAA2B,MAAM,QAAoC,MAAM;AAC/E,UAAM,cAA0C,CAAC;AACjD,eAAW,UAAU,sBAAsB;AACzC,UAAI,EAAE,YAAY,QAAS;AAC3B,iBAAW,SAAS,OAAO,UAAU,CAAC,GAAG;AACvC,oBAAY,KAAK,KAAiC;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,oBAAoB,CAAC;AAEzB,QAAM,uBAAuB,MAAM,QAAsB,MAAM;AAC7D,UAAM,eAAe;AACrB,UAAM,iBAAiB,OAAO,aAAa,mBAAmB,WAAW,aAAa,iBAAiB;AACvG,UAAM,WAAW,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AACrF,UAAM,SAAS,OAAO,aAAa,WAAW,WAAW,aAAa,SAAS;AAC/E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,qBAAqB,MAAM,QAAQ,MAAM;AAC7C,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,eAAe;AACrB,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,wBAAwB,MAAM,aAAa,YAAY,GAAG;AAC7D,eAAO,IAAI,MAAM,EAAE;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,yBAAyB,MAAM,QAAQ,MAAM;AACjD,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,cAAc,0BAA0B;AACjD,UAAI,CAAC,2BAA2B,WAAW,aAAa,QAAmC,oBAAoB,GAAG;AAChH,eAAO,IAAI,WAAW,EAAE;AAAA,MAC1B;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,sBAAsB,0BAA0B,MAAM,CAAC;AAC3D,QAAM,qBAAqB,MAAM;AAAA,IAC/B,MAAM,IAAI,IAAI,yBAAyB,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC;AAAA,IACzE,CAAC,wBAAwB;AAAA,EAC3B;AAEA,QAAM,qBAAqB,MAAM,QAAqB,MAAM;AAC1D,WAAO,yBAAyB,IAAI,CAAC,gBAAgB;AAAA,MACnD,IAAI,WAAW;AAAA,MACf,OAAO,WAAW;AAAA,MAClB,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,MACrB,WAAW,CAAC,EAAE,OAAO,UAAAK,WAAU,QAAQ,WAAW,MAChD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA,UAAU,CAAC,GAAG,cAAcA,UAAS,SAAS;AAAA,UAC9C,SAAS;AAAA,UACT,UAAW,cAAc;AAAA;AAAA,MAC3B;AAAA,IAEJ,EAAE;AAAA,EACJ,GAAG,CAAC,sBAAsB,0BAA0B,MAAM,CAAC;AAE3D,QAAM,YAAY,MAAM,QAAQ,MAAM;AACpC,UAAM,OAAO,CAAC,GAAG,QAAQ,GAAG,kBAAkB;AAE9C,QAAI,QAAQ;AACV,YAAMC,YAAW,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,EAAE,CAAC;AAC5C,iBAAW,SAAS,QAAQ;AAC1B,YAAI,CAAC,MAAM,OAAQ;AACnB,mBAAW,SAAS,MAAM,QAAQ;AAChC,cAAI,OAAO,UAAU,SAAU;AAC/B,cAAI,CAACA,UAAS,IAAI,MAAM,EAAE,GAAG;AAC3B,YAAAA,UAAS,IAAI,MAAM,EAAE;AACrB,iBAAK,KAAK,KAAK;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,UAAM,WAAW,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,EAAE,CAAC;AAC5C,UAAM,SAAS,SAAS,OAAO,OAAK,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;AACvD,WAAO,CAAC,GAAG,MAAM,GAAG,MAAM;AAAA,EAC5B,GAAG,CAAC,QAAQ,oBAAoB,UAAU,MAAM,CAAC;AAEjD,QAAM,YAAY,MAAM,QAAQ,MAAM;AACpC,WAAO,IAAI,WAAW,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAC3D,GAAG,CAAC,SAAS,CAAC;AAOd,QAAM,sBAAsB,MAAM,QAAQ,MAAM;AAC9C,UAAM,MAAM,oBAAI,IAAY;AAC5B,UAAM,aAAa,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAC5D,eAAW,SAAS,WAAW;AAC7B,YAAM,UAAU,MAAM;AACtB,UAAI,CAAC,QAAQ,SAAS,GAAG,EAAG;AAC5B,UAAI,mBAAmB,IAAI,OAAO,EAAG;AACrC,UAAI,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,KAAK,EAAG;AAC5D,UAAI,WAAW,IAAI,OAAO,EAAG;AAC7B,UAAI,IAAI,OAAO;AAAA,IACjB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,oBAAoB,QAAQ,CAAC;AAE5C,QAAM,sBAAsB,MAAM,YAAY,OAC5C,SACA,iBACG;AACH,QAAI,aAAc;AAClB,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,QAAI,CAAC,SAAS,MAAM,SAAU;AAC9B,QAAI,mBAAmB,IAAI,OAAO,KAAK,uBAAuB,IAAI,OAAO,EAAG;AAE5E,UAAM,aAAa,gBAAgB,UAAU;AAC7C,UAAM,kBAA0C,CAAC;AACjD,UAAM,kBAAkB,EAAE,0BAA0B;AACpD,UAAM,QAAQ,WAAW,OAAO;AAChC,UAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,UAAM,WAAW,OAAO,UAAU;AAClC,UAAM,QACJ,UAAU,UACV,UAAU,QACT,YAAY,MAAM,KAAK,MAAM,MAC7B,WAAW,MAAM,WAAW,KAC5B,MAAM,SAAS,cAAc,UAAU;AAE1C,QAAI,MAAM,YAAY,OAAO;AAC3B,sBAAgB,OAAO,IAAI;AAAA,IAC7B;AAEA,UAAM,iBAAiB,eACnB,cAAc,KAAK,CAAC,eAAe,WAAW,QAAQ,OAAO,IAC3D,UACA,OACF,QAAQ,WAAW,KAAK,IACtB,QAAQ,QAAQ,QAAQ,EAAE,IAC1B;AAEN,QAAI,CAAC,OAAO,KAAK,eAAe,EAAE,UAAU,gBAAgB;AAC1D,YAAM,eAAe,cAAc,OAAO,CAAC,eAAe,WAAW,QAAQ,cAAc;AAC3F,UAAI,aAAa,QAAQ;AACvB,YAAI;AACF,gBAAM,EAAE,0BAA0B,IAAI,MAAM,OAAO,kDAAkD;AACrG,gBAAM,mBAAmB;AAAA,YACvB,EAAE,CAAC,cAAc,GAAG,MAAM;AAAA,YAC1B,qBAAqB,YAAY;AAAA,UACnC;AACA,cAAI,CAAC,iBAAiB,IAAI;AACxB,kBAAM,wBAAwB,eAC1B,OAAO;AAAA,cACL,OAAO,QAAQ,iBAAiB,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM;AAAA,gBACnE,IAAI,QAAQ,QAAQ,EAAE;AAAA,gBACtB,OAAO,OAAO;AAAA,cAChB,CAAC;AAAA,YACH,IACA,OAAO;AAAA,cACL,OAAO,QAAQ,iBAAiB,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC;AAAA,YAC7F;AACJ,kBAAM,oBAAoB,MAAM,0BAA0B,qBAAqB;AAC/E,mBAAO,OAAO,iBAAiB,0BAA0B,iBAAiB,CAAC;AAAA,UAC7E;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,KAAK,eAAe,EAAE,UAAU,QAAQ;AAClD,YAAM,eAAe,EAAE,GAAI,WAAuC;AAClE,iBAAW,YAAY,wBAAwB;AAC7C,eAAO,aAAa,QAAQ;AAAA,MAC9B;AACA,YAAM,aAAa,EAAE,GAAG,aAAa;AACrC,iBAAW,cAAc,oBAAoB;AAC3C,eAAO,WAAW,UAAU;AAAA,MAC9B;AACA,YAAM,SAAS,OAAO,UAAU,sBAAsB,YAAY,mBAAmB,CAAC;AACtF,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,oBAA4C,CAAC;AACnD,eAAO,MAAM,OAAO,QAAQ,CAAC,UAAU;AACrC,gBAAM,OAAO,mBAAmB,MAAM,IAAI;AAC1C,cAAI,CAAC,KAAM;AACX,cACE,SAAS,WACT,KAAK,WAAW,GAAG,OAAO,GAAG,KAC7B,QAAQ,WAAW,GAAG,IAAI,GAAG,GAC7B;AACA,8BAAkB,IAAI,IAAI,MAAM;AAAA,UAClC;AAAA,QACF,CAAC;AACD,YAAI,OAAO,KAAK,iBAAiB,EAAE,QAAQ;AACzC,gBAAM,oBAAoB,MAAM,0BAA0B,iBAAiB;AAC3E,iBAAO,OAAO,iBAAiB,0BAA0B,iBAAiB,CAAC;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,cAAU,CAAC,SAAS;AAClB,YAAM,OAAO,OAAO;AAAA,QAClB,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC,eAAe,MAAM,EACjD,oBAAoB,WACpB,gBAAgB,WAAW,GAAG,OAAO,GAAG,KACxC,QAAQ,WAAW,GAAG,eAAe,GAAG,EACzC;AAAA,MACH;AACA,iBAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC5D,aAAK,GAAG,IAAI;AAAA,MACd;AACA,YAAM,OACJ,OAAO,KAAK,IAAI,EAAE,WAAW,OAAO,KAAK,IAAI,EAAE,UAC/C,OAAO,QAAQ,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,OAAO,MAAM,KAAK,GAAG,MAAM,OAAO;AACtE,aAAO,OAAO,OAAO;AAAA,IACvB,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,OAAO,SAAS;AAC3C,eAAa,UAAU;AAEvB,QAAM,yBAAyB,MAAM,QAAQ,MAAM;AACjD,WAAO,UACJ,OAAO,OAAK,EAAE,SAAS,YAAY,OAAQ,EAAuB,gBAAgB,UAAU,EAC5F,IAAI,OAAK,EAAE,EAAE,EACb,KAAK,IAAI;AAAA,EACd,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,sBAAsB,MAAM,QAAyB,MAAM;AAC/D,QAAI,CAAC,oBAAoB,iBAAiB,WAAW,EAAG,QAAO,CAAC;AAChE,UAAM,QAAQ,iBACX,OAAO,CAAC,YAAY,OAAO,WAAW,QAAQ,aAAa,OAAO,EAClE,IAAI,CAAC,WAAW;AACf,YAAM,WAAW,OAAO,OAAO,WAAW,aAAa,WAAW,OAAO,UAAU,WAAW;AAC9F,YAAM,QAAuB;AAAA,QAC3B,IAAI,UAAU,OAAO,QAAQ;AAAA,QAC7B,OAAO,OAAO,WAAW,cAAc,OAAO,OAAO,SAAS;AAAA,QAC9D,aAAa,OAAO,WAAW,oBAAoB,OAAO,OAAO,SAAS;AAAA,QAC1E,QAAQ,OAAO,WAAW,WAAW,IAAI,IAAI;AAAA,QAC7C,WAAW,MACT;AAAA,UAAC,OAAO,OAAO;AAAA,UAAd;AAAA,YACC,SAAS;AAAA,YACT,MAAM;AAAA,YACN,cAAc,CAAC,SAAS,UAAU,IAA+B;AAAA,YACjE,UAAU;AAAA;AAAA,QACZ;AAAA,MAEJ;AACA,aAAO,EAAE,OAAO,SAAS;AAAA,IAC3B,CAAC;AACH,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC5C,WAAO,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,EACjC,GAAG,CAAC,kBAAkB,kBAAkB,SAAS,WAAW,MAAM,CAAC;AAEnE,QAAM,2BAA2B,MAAM,QAAQ,MAAM;AACnD,QAAI,CAAC,UAAU,OAAO,WAAW,KAAK,yBAAyB,WAAW,EAAG,QAAO;AACpF,UAAM,SAAS,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,QAAQ,CAAC,GAAI,MAAM,UAAU,CAAC,CAAE,EAAE,EAAE;AACtF,UAAM,gBAAgB,OAAO,SAAS;AACtC,eAAW,cAAc,0BAA0B;AACjD,YAAM,cAAc,OAAO,UAAU,CAAC,UAAU,MAAM,OAAO,WAAW,KAAK;AAC7E,YAAM,QAAQ,eAAe,IAAI,cAAc;AAC/C,UAAI,cAAc,KAAK,QAAQ,IAAI,aAAa,cAAc;AAC5D,gBAAQ,KAAK,8BAA8B,WAAW,EAAE,oBAAoB,WAAW,KAAK,iDAAiD;AAAA,MAC/I;AACA,UAAI,QAAQ,EAAG;AACf,YAAM,eAAe,OAAO,KAAK,EAAE,UAAU,CAAC;AAC9C,UAAI,CAAC,aAAa,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,UAAU,WAAW,EAAE,GAAG;AACvF,qBAAa,KAAK,WAAW,EAAE;AAAA,MACjC;AACA,aAAO,KAAK,EAAE,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,wBAAwB,CAAC;AAErC,QAAM,mBAAmB,CAAC,4BAA4B,yBAAyB,WAAW,MAAM,oBAAoB,SAAS;AAC7H,QAAM,0BAA0B,MAAM,QAAQ,MAAM;AAClD,UAAM,aAAa,4BAA4B,yBAAyB,SAAS,2BAA2B,CAAC;AAC7G,UAAM,YAAY,kBAAkB,CAAC,EAAE,IAAI,mBAAmB,QAAQ,UAAU,CAAC,IAAuB,CAAC;AACzG,WAAO,CAAC,GAAI,WAAW,SAAS,aAAa,WAAY,GAAG,mBAAmB;AAAA,EACjF,GAAG,CAAC,WAAW,0BAA0B,qBAAqB,eAAe,CAAC;AAC9E,QAAM,mBAAmB,wBAAwB,SAAS;AAG1D,QAAM,kBAAkB,MAAM,QAAQ,MAAM,wBAAwB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,uBAAuB,CAAC;AAC/G,QAAM,EAAE,YAAY,gBAAgB,SAAS,cAAc,IAAI;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,UAAU,eAAe,EAAE,sBAAsB,EAAE,UAAU,EAAE,EAAE,CAAC;AAAA,IAClE,UAAU,qBAAqB;AAAA,EACjC;AACA,QAAM,qBAAqB,MAAM,YAAY,CAAC,UAAwB;AACpE,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,QAAI,CAAC,QAAQ,OAAO,OAAO,KAAK,GAAI;AACpC,UAAM,WAAW,eAAe,QAAQ,OAAO,OAAO,EAAE,CAAC;AACzD,UAAM,WAAW,eAAe,QAAQ,OAAO,KAAK,EAAE,CAAC;AACvD,QAAI,aAAa,MAAM,aAAa,GAAI,eAAc,UAAU,QAAQ;AAAA,EAC1E,GAAG,CAAC,gBAAgB,aAAa,CAAC;AAGlC,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,4BAA4B,OAAO,KAAK,MAAM,EAAE,WAAW,EAAG;AACnE,UAAM,gBAAgB,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AACjD,eAAW,KAAK,yBAAyB;AACvC,YAAM,iBAAiB,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,EAAG;AACpF,YAAM,WAAW,cAAc,KAAK,CAAC,OAAO,cAAc,IAAI,EAAE,CAAC;AACjE,UAAI,UAAU;AACZ,0BAAkB,QAAQ,IAAI,EAAE,EAAE,GAAG,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,0BAA0B,uBAAuB,CAAC;AAE9D,QAAM,0BAA0B,MAAM;AAAA,IACpC,OAAO,oBAAoB,CAAC,GAAG,OAAO,CAAC,YAAY,OAAO,WAAW,QAAQ,aAAa,OAAO;AAAA,IACjG,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,uBAAuB,MAAM,QAAQ,MAAM;AAC/C,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,SAAU,UAAU,CAAC,GAAI;AAClC,UAAI,MAAM,SAAS,kBAAkB,CAAC,MAAM,OAAQ;AACpD,iBAAW,SAAS,MAAM,QAAQ;AAChC,YAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK;AAAA,iBACtC,SAAS,OAAQ,MAAoB,OAAO,SAAU,QAAO,IAAK,MAAoB,EAAE;AAAA,MACnG;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,qBAAqB,MAAM,YAAY,CAAC,MAAkC;AAC9E,QAAI,EAAE,SAAS,gBAAgB;AAC7B,aAAO,SAAS,OAAO,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,EAAE,CAAC;AAAA,IAC/D;AAEA,UAAM,MAAM,EAAE,UAAU,CAAC;AACzB,UAAM,SAAsB,CAAC;AAE7B,eAAW,QAAQ,KAAK;AACtB,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,QAAQ,UAAU,IAAI,IAAI;AAChC,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B,WAAW,MAAM;AACf,eAAO,KAAK,IAAiB;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,WAAW,oBAAoB,CAAC;AAE9C,QAAM,yBAAyB,MAAM,QAAQ,MAAM,4BAA4B,eAAe,GAAG,CAAC,6BAA6B,eAAe,CAAC;AAE/I,QAAM,yBAAyB,MAAM,QAAQ,MAAM;AACjD,UAAM,OAAO,EAAE,6BAA6B;AAC5C,UAAM,SAAS,EAAE,gCAAgC;AACjD,WACE,qBAAC,SAAI,WAAU,kHACb;AAAA,2BAAC,UAAM;AAAA;AAAA,QAAK;AAAA,SAAC;AAAA,MACZ,yBACC,oBAAC,QAAK,MAAM,wBAAwB,WAAU,4CAC3C,kBACH,IAEA,oBAAC,UAAK,WAAU,+BAA+B,kBAAO;AAAA,OAE1D;AAAA,EAEJ,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE9B,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,kBAAkB;AACpB,YAAM,OAAwB,CAAC;AAC/B,YAAM,OAAwB,CAAC;AAE/B,iBAAW,KAAK,yBAAyB;AACvC,aAAK,EAAE,UAAU,OAAO,EAAG,MAAK,KAAK,CAAC;AAAA,YACjC,MAAK,KAAK,CAAC;AAAA,MAClB;AAEA,YAAM,OAAO,CAAC,SAA0B;AACtC,mBAAW,SAAS,MAAM;AACxB,gBAAM,WAAW,mBAAmB,KAAK;AACzC,qBAAW,SAAS,UAAU;AAC5B,gBAAI,OAAO,MAAM,CAAC,MAAM,SAAU,QAAO,MAAM;AAAA,UACjD;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,KAAK,IAAI;AAC1B,UAAI,SAAU,QAAO;AACrB,YAAM,WAAW,KAAK,IAAI;AAC1B,UAAI,SAAU,QAAO;AAAA,IACvB;AAEA,eAAW,SAAS,WAAW;AAC7B,UAAI,OAAO,MAAM,CAAC,MAAM,SAAU,QAAO,MAAM;AAAA,IACjD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,oBAAoB,yBAAyB,gBAAgB,CAAC;AAE7E,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,QAAI,aAAc;AAClB,QAAI,OAAO,aAAa,YAAa;AACrC,UAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAM,cAAc;AAAA,EACtB,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,QAAM,sBAAsB,MAAM,OAAsB,IAAI;AAC5D,QAAM,oBAAoB,MAAM,OAAsB,IAAI;AAE1D,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa;AAEtE,QAAI,uBAAuB,aAAa,yBAAyB,cAAc;AAC7E,0BAAoB,UAAU;AAC9B;AAAA,IACF;AAEA,QAAI,CAAC,aAAc;AACnB,QAAI,oBAAoB,YAAY,aAAc;AAElD,UAAM,MAAM,MAAM;AAChB,YAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAI,CAAC,KAAM;AAGX,YAAM,SAAS,OAAO,aAAa,cAAe,SAAS,gBAAuC;AAClG,UAAI,UAAU,KAAK,SAAS,MAAM,GAAG;AACnC;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,cAA2B,wBAAwB,YAAY,IAAI;AAC1F,YAAM,SACJ,WAAW,cAA2B,kBAAkB,KACxD,KAAK,cAA2B,kBAAkB;AAEpD,UAAI,UAAU,OAAO,OAAO,UAAU,YAAY;AAChD,eAAO,MAAM,EAAE,eAAe,KAAK,CAAC;AACpC,YAAI,kBAAkB,oBAAoB,kBAAkB,qBAAqB;AAC/E,cAAI;AACF,mBAAO,OAAO;AAAA,UAChB,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,4BAAoB,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,QACJ,OAAO,OAAO,0BAA0B,aACpC,OAAO,sBAAsB,GAAG,IAChC,OAAO,WAAW,KAAK,CAAC;AAE9B,WAAO,MAAM;AACX,UAAI,OAAO,WAAW,YAAa;AACnC,UAAI,OAAO,OAAO,yBAAyB,YAAY;AACrD,eAAO,qBAAqB,KAAe;AAAA,MAC7C,OAAO;AACL,eAAO,aAAa,KAAe;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,cAAc,QAAQ,cAAc,WAAW,qBAAqB,CAAC;AAE9F,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa;AACtE,UAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,QAAI,CAAC,QAAQ,QAAQ;AACnB,wBAAkB,UAAU;AAC5B;AAAA,IACF;AACA,UAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;AAC3B,QAAI,CAAC,WAAW,kBAAkB,YAAY,QAAS;AAEvD,UAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,QAAI,CAAC,KAAM;AAOX,UAAM,SAAS,SAAS;AACxB,QAAI,kBAAkB,eAAe,KAAK,SAAS,MAAM,GAAG;AAC1D,wBAAkB,UAAU;AAC5B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,cAA2B,wBAAwB,OAAO,IAAI;AACrF,UAAM,SACJ,WAAW,cAA2B,kBAAkB,KACxD,KAAK,cAA2B,UAAU,OAAO,IAAI,KACrD,aACA;AAEF,QAAI,UAAU,OAAO,OAAO,UAAU,YAAY;AAChD,aAAO,MAAM;AACb,UAAI,kBAAkB,oBAAoB,kBAAkB,qBAAqB;AAC/E,YAAI;AACF,iBAAO,OAAO;AAAA,QAChB,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,wBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,QAAQ,MAAM,CAAC;AAMnB,QAAM,iCAAiC,MAAM;AAAA,IAC3C,CAAC,gBAAyC;AACxC,UAAI,OAAO,aAAa,YAAa;AACrC,YAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAI,CAAC,KAAM;AACX,UAAI,SAA6B;AACjC,iBAAW,WAAW,cAAc,OAAO,KAAK,WAAW,IAAI,CAAC,GAAG;AACjE,cAAM,iBAAiB,KAAK,cAA2B,wBAAwB,OAAO,IAAI;AAC1F,YAAI,gBAAgB;AAClB,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,QAAQ;AACX,iBAAS,KAAK,cAA2B,8BAA8B;AAAA,MACzE;AACA,UAAI,UAAU,OAAO,OAAO,mBAAmB,YAAY;AACzD,eAAO,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,0BAA0B,MAAM,YAAY,CAChD,IACA,WACA,iBAAsD,uBAAuB,YAC1E;AACH,QACE,kBACA,yBAAyB,eAAe,EAAE,CAAC,MAAM,yBAAyB,SAAS,GACnF;AACA,4BAAsB,QAAQ,OAAO,EAAE;AACvC;AAAA,IACF;AACA,0BAAsB,QAAQ,IAAI,EAAE;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,MAAM,YAAY,CAAC,IAAY,cAAuB;AACrE,QAAI,WAA2C;AAC/C,QAAI,YAA4B;AAChC,UAAM,eAAgB,UAAU,QAAoC,EAAE;AACtE,QAAI,CAAC,OAAO,GAAG,cAAc,SAAS,GAAG;AACvC,8BAAwB,IAAI,SAAS;AAAA,IACvC;AACA,cAAU,CAAC,SAAS;AAClB,UAAI,OAAO,GAAG,KAAK,EAAE,GAAG,SAAS,EAAG,QAAO;AAC3C,YAAM,iBAAiB,uBAAuB,WAAY;AAC1D,8BAAwB,IAAI,WAAW,cAAc;AACrD,iBAAW,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,UAAU;AACtC,gBAAU,UAAU;AACpB,UAAI,EAAE,YAAY,CAAC,yBAAyB;AAC1C,cAAM,WAAW,yBAAyB,WAAW,oBAAoB,IAA+B;AACxG,iCAAyB,UAAU;AACnC,+BAAuB,UAAU;AACjC,oBAAY,oBAAoB,QAAmC,MAAM;AAAA,MAC3E;AACA,aAAO;AAAA,IACT,CAAC;AACD,QAAI,cAAc,MAAM;AACtB,iBAAW,UAAU;AACrB,2BAAqB,SAAS;AAAA,IAChC;AACA,UAAM,kBAA4B,CAAC;AACnC,cAAU,CAAC,SAAS;AAClB,UAAI,CAAC,OAAO,KAAK,IAAI,EAAE,OAAQ,QAAO;AACtC,UAAI,UAAU;AACd,YAAM,cAAc,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,OAAO,MAAM;AACtE,cAAM,cACJ,YAAY,MACZ,QAAQ,WAAW,GAAG,EAAE,GAAG,KAC3B,GAAG,WAAW,GAAG,OAAO,GAAG;AAC7B,YAAI,aAAa;AACf,oBAAU;AACV,0BAAgB,KAAK,OAAO;AAAA,QAC9B;AACA,eAAO,CAAC;AAAA,MACV,CAAC;AACD,aAAO,UAAU,OAAO,YAAY,WAAW,IAAI;AAAA,IACrD,CAAC;AACD,QAAI,gBAAgB,QAAQ;AAC1B,YAAM,qBAAqB,EAAE,6BAA6B;AAC1D,YAAM,qBAAqB,IAAI;AAAA,QAC7B,gBACG,IAAI,CAAC,YAAY,2BAA2B,OAAO,CAAC,EACpD,OAAO,CAAC,YAAY,QAAQ,KAAK,EAAE,SAAS,CAAC;AAAA,MAClD;AACA,mBAAa,CAAC,SAAS;AACrB,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,aAAa,KAAK,KAAK;AAC7B,YAAI,CAAC,WAAY,QAAO;AACxB,YAAI,eAAe,sBAAsB,mBAAmB,IAAI,UAAU,GAAG;AAC3E,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,QAAI,CAAC,YAAY,CAAC,+BAAgC;AAClD,SAAK,sBAAsB,iBAAiB,UAAqB,oBAAoB,SAAS;AAAA,MAC5F,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,UAAI,CAAC,OAAO,GAAI;AAChB,YAAM,SAAS,OAAO;AACtB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAmC,EAAE,GAAI,OAAO,eAAe,CAAC,EAAG;AACzE,UAAI,OAAO,UAAU,QAAW;AAC9B,gBAAQ,EAAE,IAAI,OAAO;AAAA,MACvB;AACA,UAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,kBAAU,CAAC,SAAS;AAClB,cAAI,UAAU;AACd,gBAAM,OAAO,EAAE,GAAG,KAAK;AACvB,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,gBAAI,OAAO,GAAG,KAAK,GAAG,GAAG,KAAK,EAAG;AACjC,iBAAK,GAAG,IAAI;AACZ,sBAAU;AAAA,UACZ;AACA,iBAAO,UAAW,OAAmC;AAAA,QACvD,CAAC;AAAA,MACH;AACA,iBAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,cAAM,QAAQ,MAAM,QAAQ,QAAQ;AAAA,MACtC;AAAA,IACF,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,cAAQ,MAAM,sCAAsC,GAAG;AAAA,IACzD,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,gCAAgC,OAAO,GAAG,wBAAwB,4BAA4B,uBAAuB,uBAAuB,CAAC;AAE3J,QAAM,gBAAgB,MAAM,YAAY,CAAC,YAAoB;AAC3D,SAAK,oBAAoB,OAAO;AAAA,EAClC,GAAG,CAAC,mBAAmB,CAAC;AAExB,QAAM,gCAAgC,MAAM;AAAA,IAC1C,CAACN,WAAkB,aAA4B;AAC7C,8BAAwB,CAAC,UAAU,EAAE,GAAG,MAAM,CAACA,SAAQ,GAAG,SAAS,EAAE;AACrE,YAAM,aAAa,yBAAyBA,SAAQ,GAAG;AACvD,UAAI,YAAY;AACd,iBAAS,YAAY,YAAY,MAAS;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,CAAC,wBAAwB,QAAQ;AAAA,EACnC;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,CAACA,WAAkB,cAA6B,OAA8B,aAAa;AACzF,YAAM,OAAO,4BAA4BA,SAAQ;AACjD,UAAI,CAAC,KAAM;AACX,8BAAwB,EAAE,UAAAA,WAAU,cAAc,KAAK,CAAC;AAAA,IAC1D;AAAA,IACA,CAAC,2BAA2B;AAAA,EAC9B;AAEA,QAAM,kCAAkC,MAAM,OAA2B,MAAS;AAClF,QAAM,2BAA2B,MAAM,OAA2B,MAAS;AAC3E,QAAM,yBAAyB,MAAM,OAA4C,MAAS;AAC1F,QAAM,wBAAwB,MAAM,OAAoB,oBAAI,IAAI,CAAC;AACjE,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,cAAe;AACpB,UAAM,WAAW,KAAK,UAAU;AAAA,MAC9B;AAAA,MACA,kBAAkB,yBAAyB,IAAI,CAAC,eAAe,WAAW,EAAE;AAAA,MAC5E,qBAAqB,cAAc,IAAI,CAAC,eAAe,WAAW,GAAG;AAAA,MACrE,qBAAqB,MAAM,KAAK,mBAAmB;AAAA,IACrD,CAAC;AACD,QAAI,gCAAgC,YAAY,SAAU;AAC1D,oCAAgC,UAAU;AAC1C,UAAM,gBAAgB;AACtB,QAAI,eAA+C;AAOnD,QAAI,kBAAkB;AACtB,cAAU,CAAC,SAAS;AAClB,YAAM,gBAAgB,yBAAyB;AAC/C,YAAM,iBAAiB,sBAAsB;AAC7C,wBACE,eAAe,OAAO,KACtB,kBAAkB,UAClB,oBAAoB,IAA+B,MAAM;AAC3D,YAAM,SAAS,EAAE,GAAG,KAAK;AACzB,YAAM,eAAe;AACrB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,aAAwC,GAAG;AACnF,YAAI,eAAe,IAAI,GAAG,EAAG;AAC7B,qBAAa,GAAG,IAAI;AAAA,MACtB;AACA,iBAAW,cAAc,0BAA0B;AACjD,YAAI,OAAO,WAAW,EAAE,MAAM,OAAW;AACzC,cAAM,YAAY,cAAc,eAAe,WAAW,EAAE;AAC5D,YAAI,cAAc,QAAW;AAC3B;AAAC,UAAC,OAAmC,WAAW,EAAE,IAAI;AAAA,QACxD;AAAA,MACF;AACA,iBAAW,cAAc,eAAe;AACtC,cAAM,WAAW,eAAe,WAAW,MAAM,MAAM,WAAW,GAAG;AACrE,YAAI,CAAC,YAAY,OAAO,QAAQ,MAAM,OAAW;AACjD,cAAM,YAAY,4BAA4B,eAAe,WAAW,GAAG;AAC3E,YAAI,cAAc,QAAW;AAC3B;AAAC,UAAC,OAAmC,QAAQ,IAAI;AAAA,QACnD;AAAA,MACF;AACA,iBAAW,WAAW,qBAAqB;AACzC,YAAI,OAAO,OAAO,MAAM,OAAW;AACnC,cAAM,YAAY,cAAc,eAAe,OAAO;AACtD,YAAI,cAAc,QAAW;AAC3B;AAAC,UAAC,OAAmC,OAAO,IAAI;AAAA,QAClD;AAAA,MACF;AACA,qBAAe;AACf,aAAO;AAAA,IACT,CAAC;AACD,QAAI,gBAAgB,CAAC,iBAAiB;AAWpC,+BAAyB,UAAU,oBAAoB,YAAuC;AAC9F,6BAAuB,UAAU,EAAE,GAAI,aAAyC;AAAA,IAClF;AACA,QAAI,CAAC,kCAAkC,CAAC,aAAc;AACtD,QAAI,YAAY;AAChB,UAAM,MAAM,YAAY;AACtB,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA,oBAAoB;AAAA,QACtB;AACA,cAAM,cAAc,OAAO;AAC3B,YAAI,aAAa,CAAC,YAAa;AAG/B,YAAI,WAAW,QAAS;AACxB,iCAAyB,UAAU,oBAAoB,WAAsC;AAC7F,+BAAuB,UAAU,EAAE,GAAI,YAAwC;AAC/E,kBAAU,WAAsC;AAAA,MAClD,SAAS,KAAK;AACZ,gBAAQ,MAAM,6CAA6C,GAAG;AAAA,MAChE;AAAA,IACF;AACA,SAAK,IAAI;AACT,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAOD,QAAM,uBAAuB,MAAM,OAAO,KAAK;AAC/C,QAAM,qBAAqB,MAAM,QAAQ,MAAM;AAC7C,QAAI,CAAC,cAAe,QAAO;AAC3B,UAAM,MAAO,cAA0C;AACvD,WAAO,QAAQ,UAAa,QAAQ,QAAQ,QAAQ;AAAA,EACtD,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,UAAU,MAAM;AAEpB,QAAI,UAAW;AAEf,QAAI,mBAAoB;AAExB,QAAI,CAAC,cAAc,OAAQ;AAE3B,QAAI,qBAAqB,QAAS;AAClC,yBAAqB,UAAU;AAE/B,UAAM,WAAoC,CAAC;AAC3C,UAAM,SAAS,eAAe,KAAK;AACnC,eAAW,OAAO,eAAe;AAC/B,UAAI,IAAI,iBAAiB,UAAa,IAAI,iBAAiB,KAAM;AACjE,YAAM,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG;AACnC,eAAS,OAAO,IAAI,IAAI;AAAA,IAC1B;AAEA,QAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,EAAG;AAExC,QAAI,eAA+C;AACnD,cAAU,CAAC,SAAS;AAClB,YAAM,SAAS,EAAE,GAAG,KAAK;AACzB,UAAI,UAAU;AACd,iBAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAE5D,YAAI,OAAO,OAAO,MAAM,OAAW;AAClC,QAAC,OAAmC,OAAO,IAAI;AAChD,kBAAU;AAAA,MACZ;AACA,UAAI,CAAC,QAAS,QAAO;AACrB,qBAAe;AACf,aAAO;AAAA,IACT,CAAC;AAGD,QAAI,cAAc;AAChB,+BAAyB,UAAU,oBAAoB,YAAuC;AAC9F,6BAAuB,UAAU,EAAE,GAAI,aAAyC;AAAA,IAClF;AAAA,EACF,GAAG,CAAC,WAAW,oBAAoB,eAAe,YAAY,CAAC;AAE/D,QAAM,kBAAkB,MAAM,YAAY,CAAC,mBAA6C;AACtF,oBAAgB,cAAc;AAAA,EAChC,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,0BAA0B,MAAM;AAAA,IACpC,CAAC,qBAA8B;AAC7B,UAAI,CAAC,qBAAsB,QAAO;AAClC,YAAM,OAAO,4BAA4B,qBAAqB,QAAQ;AACtE,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,SAAmB,CAAC;AAC1B,UAAI,qBAAqB,cAAc;AACrC,eAAO,KAAK,YAAY,mBAAmB,qBAAqB,YAAY,CAAC,EAAE;AAAA,MACjF;AACA,UAAI,oBAAoB,qBAAqB,SAAS,YAAY;AAChE,eAAO,KAAK,eAAe;AAAA,MAC7B;AACA,UAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,YAAM,YAAY,KAAK,SAAS,GAAG,IAAI,MAAM;AAC7C,aAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,KAAK,GAAG,CAAC;AAAA,IAC/C;AAAA,IACA,CAAC,6BAA6B,oBAAoB;AAAA,EACpD;AAEA,QAAM,yBAAyB,MAAM,QAAQ,MAAM,wBAAwB,KAAK,GAAG,CAAC,uBAAuB,CAAC;AAE5G,QAAM,2BAA2B,MAAM,YAAY,MAAM;AACvD,QAAI,CAAC,mBAAmB,QAAS;AACjC,SAAK,mBAAmB,QAAQ,OAAO;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,QAAI,aAAc;AAClB,QAAI,cAAc,QAAS;AAC3B,kBAAc,UAAU;AACxB,QAAI;AACJ,mBAAa,IAAI;AACjB,gBAAU,CAAC,CAAC;AAEZ,YAAM,kBAAkB,EAAE,0BAA0B;AACpD,YAAM,qBAAqB,EAAE,6BAA6B;AAG1D,UAAI;AACF,YAAI,OAAO,aAAa,aAAa;AACnC,gBAAM,gBAAgB,SAAS;AAC/B,cAAI,yBAAyB,aAAa;AACxC,0BAAc,KAAK;AACnB,kBAAM,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,YAAM,iBAAyC,CAAC;AAChD,iBAAW,SAAS,WAAW;AAC7B,YAAI,CAAC,MAAM,SAAU;AACrB,YAAI,MAAM,SAAU;AACpB,YAAI,mBAAmB,IAAI,MAAM,EAAE,KAAK,uBAAuB,IAAI,MAAM,EAAE,EAAG;AAC9E,cAAM,IAAI,OAAO,MAAM,EAAE;AACzB,cAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,cAAM,WAAW,OAAO,MAAM;AAC9B,cAAM,QACJ,MAAM,UACN,MAAM,QACL,YAAY,EAAE,KAAK,MAAM,MACzB,WAAW,EAAE,WAAW,KACxB,MAAM,SAAS,cAAc,MAAM;AACtC,YAAI,MAAO,gBAAe,MAAM,EAAE,IAAI;AAAA,MACxC;AACA,UAAI,OAAO,KAAK,cAAc,EAAE,QAAQ;AACtC,YAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAQ,MAAM,sDAAsD,cAAc;AAAA,QACpF;AACA,cAAM,oBAAoB,MAAM,0BAA0B,cAAc;AACxE,kBAAU,iBAAiB;AAC3B,cAAM,oBAAoB,OAAO;AACjC;AAAA,MACF;AAGA,UAAI,kBAAkB,QAAQ;AAC5B,YAAI;AACF,gBAAM,OAAO,cAAc,SACvB,gBACA,MAAM,OAAO,yBAAyB,EAAE,KAAK,CAAC,QAAQ,IAAI,qBAAqB,iBAAiB,CAAC;AACrG,gBAAM,EAAE,0BAA0B,IAAI,MAAM,OAAO,kDAAkD;AAErG,gBAAM,WAAoC,CAAC;AAC3C,cAAI,cAAc;AAChB,uBAAW,OAAO,MAAM;AACtB,kBAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,GAAG,GAAG;AACzD,yBAAS,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG;AAAA,cACpC;AAAA,YACF;AAAA,UACF,OAAO;AACL,uBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,kBAAI,EAAE,WAAW,KAAK,EAAG,UAAS,EAAE,QAAQ,QAAQ,EAAE,CAAC,IAAI;AAAA,YAC7D;AAAA,UACF;AACA,gBAAM,oBAAoB,qBAAqB,IAAI;AACnD,gBAAM,SAAS,0BAA0B,UAAU,iBAAiB;AACpE,cAAI,CAAC,OAAO,IAAI;AACd,gBAAI,cAAc;AAChB,oBAAM,SAAiC,CAAC;AACxC,yBAAW,CAAC,IAAI,EAAE,KAAK,OAAO,QAAQ,OAAO,WAAW,EAAG,QAAO,GAAG,QAAQ,QAAQ,EAAE,CAAC,IAAI,OAAO,EAAE;AACrG,oBAAM,oBAAoB,MAAM,0BAA0B,MAAM;AAChE,wBAAU,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,0BAA0B,iBAAiB,EAAE,EAAE;AAAA,YACpF,OAAO;AACL,oBAAM,oBAAoB,MAAM;AAAA,gBAC9B,OAAO;AAAA,kBACL,OAAO,QAAQ,OAAO,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,gBAC/E;AAAA,cACF;AACA,wBAAU,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,0BAA0B,iBAAiB,EAAE,EAAE;AAAA,YACpF;AACA,kBAAM,oBAAoB,OAAO;AACjC;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,YAAM,eAAe,EAAE,GAAI,UAAU,QAAoC;AACzE,iBAAW,YAAY,wBAAwB;AAC7C,eAAO,aAAa,QAAQ;AAAA,MAC9B;AACA,YAAM,aAAa,EAAE,GAAG,aAAa;AACrC,iBAAW,cAAc,oBAAoB;AAC3C,eAAO,WAAW,UAAU;AAAA,MAC9B;AACA,UAAI,cAAc;AAChB,cAAM,cAAc,IAAI,IAAI,cAAc,IAAI,CAAC,eAAe,WAAW,GAAG,EAAE,OAAO,OAAO,CAAC;AAC7F,mBAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AACzC,cAAI,CAAC,YAAY,IAAI,GAAG,EAAG,QAAO,WAAW,GAAG;AAAA,QAClD;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,QAAQ;AACV,cAAM,MAAM,OAAO,UAAU,sBAAsB,YAAY,mBAAmB,CAAC;AACnF,YAAI,CAAC,IAAI,SAAS;AAChB,gBAAM,cAAsC,CAAC;AAC7C,cAAI,MAAM,OAAO,QAAQ,CAAC,UAAU;AAClC,kBAAM,OAAO,mBAAmB,MAAM,IAAI;AAC1C,gBAAI,KAAM,aAAY,IAAI,IAAI,MAAM;AAAA,UACtC,CAAC;AACD,cAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,oBAAQ,MAAM,wCAAwC,IAAI,MAAM,MAAM;AAAA,UACxE;AACA,gBAAM,oBAAoB,MAAM,0BAA0B,WAAW;AACrE,oBAAU,0BAA0B,iBAAiB,CAAC;AACtD,gBAAM,oBAAoB,OAAO;AACjC;AAAA,QACF;AACA,uBAAe,IAAI;AAAA,MACrB,OAAO;AACL,uBAAe;AAAA,MACjB;AACA,UAAI,eAAe;AACnB,UAAI,mBAAmB;AACvB,UAAI,gCAAgC;AAClC,YAAI;AACF,gBAAM,SAAS,MAAM,sBAAsB,qBAAqB,cAAc,gBAAgB;AAC9F,cAAI,OAAO,MAAM;AACf,2BAAe,OAAO;AACtB,kBAAM,sBAAsB,EAAE,GAAI,OAAO,KAAiC;AAC1E,uBAAW,cAAc,oBAAoB;AAC3C,qBAAO,oBAAoB,UAAU;AAAA,YACvC;AACA,gBAAI,cAAc;AAChB,oBAAM,cAAc,IAAI,IAAI,cAAc,IAAI,CAAC,eAAe,WAAW,GAAG,EAAE,OAAO,OAAO,CAAC;AAC7F,yBAAW,OAAO,OAAO,KAAK,mBAAmB,GAAG;AAClD,oBAAI,CAAC,YAAY,IAAI,GAAG,EAAG,QAAO,oBAAoB,GAAG;AAAA,cAC3D;AAAA,YACF;AACA,+BAAmB,SACf,OAAO,MAAM,sBAAsB,qBAAqB,mBAAmB,CAAC,IAC3E;AACL,gBAAI,OAAO,aAAa;AACtB,wBAAU,OAAO,IAA+B;AAAA,YAClD;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,0CAA0C,GAAG;AAAA,QAC7D;AAAA,MACF;AAGA,UAAI;AACJ,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,SAAS,MAAM,sBAAsB,gBAAgB,cAAc,gBAAgB;AACzF,cAAI,CAAC,OAAO,IAAI;AACd,gBAAI;AACF,kBAAI,OAAO,WAAW,aAAa;AACjC,6CAA6B;AAAA,kBAC3B,WAAW;AAAA,kBACX;AAAA,kBACA,OAAO,OAAO,WAAW;AAAA,gBAC3B,CAAC;AACD,uBAAO,cAAc,IAAI,YAAY,sBAAsB;AAAA,kBACzD,QAAQ;AAAA,oBACN;AAAA,oBACA,OAAO,OAAO,WAAW;AAAA,kBAC3B;AAAA,gBACF,CAAC,CAAC;AAAA,cACJ;AAAA,YACF,QAAQ;AAAA,YAER;AACA,gBAAI,OAAO,eAAe,OAAO,KAAK,OAAO,WAAW,EAAE,QAAQ;AAChE,oBAAM,oBAAoB,MAAM,0BAA0B,OAAO,WAAW;AAC5E,wBAAU,0BAA0B,iBAAiB,CAAC;AAAA,YACxD;AACA,kBAAM,UAAU,OAAO,WAAW,EAAE,8BAA8B,4BAA4B;AAC9F,kBAAM,SAAS,OAAO;AACtB,2CAA+B,OAAO,WAAW;AACjD,uBAAW,KAAK;AAChB;AAAA,UACF;AACA,oCAA0B,OAAO;AAAA,QACnC,SAAS,KAAK;AACZ,kBAAQ,MAAM,qCAAqC,GAAG;AACtD,gBAAM,EAAE,8BAA8B,4BAA4B,GAAG,OAAO;AAC5E,qBAAW,KAAK;AAChB;AAAA,QACF;AAAA,MACF;AAEA,iBAAW,IAAI;AAEf,YAAM,kBAAkB,iBAAiB,IAAK,EAAE,YAA4B,YAAY;AACxF,YAAM,gBACJ,2BAA2B,cACvB;AAAA,QACE,WAAW;AAAA,UACT,IAAI,gBAAgB,MAAM;AAAA,UAC1B,MACE,UAAU,mBAAmB,OAAO,gBAAgB,SAAS,YAAY,gBAAgB,KAAK,KAAK,EAAE,SAAS,IAC1G,gBAAgB,OAChB;AAAA,UACN,OACE,WAAW,mBAAmB,OAAO,gBAAgB,UAAU,YAAY,gBAAgB,MAAM,KAAK,EAAE,SAAS,IAC7G,gBAAgB,QAChB;AAAA,UACN,SAAS,OAAO;AAAA,YACd,OAAO,QAAQ,gBAAgB,OAAO,EAAE,OAAO,CAAC,UAAqC,OAAO,MAAM,CAAC,MAAM,QAAQ;AAAA,UACnH;AAAA,QACF;AAAA,MACF,IACA;AAGN,UAAI,yBAAyB;AAC3B,YAAI;AACF,gBAAM,sBAAsB,UAAU,cAAc,gBAAgB;AAAA,QACtE,SAAS,KAAK;AACZ,kBAAQ,MAAM,+BAA+B,GAAG;AAChD,gBAAM,EAAE,8BAA8B,4BAA4B,GAAG,OAAO;AAC5E,qBAAW,KAAK;AAChB;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,kCAA0B,UAAU;AACpC,cAAM,uBAAuB,0BAA0B,+BAA+B;AACtF,cAAM,sBAAsB;AAAA,UAC1B,GAAI,2BAA2B,CAAC;AAAA,UAChC,GAAG;AAAA,QACL;AACA,YAAI,OAAO,KAAK,mBAAmB,EAAE,SAAS,GAAG;AAC/C,gBAAM,4BAA4B,qBAAqB,YAAY;AACjE,kBAAM,WAAW,kBAAkB,aAAa;AAAA,UAClD,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,WAAW,kBAAkB,aAAa;AAAA,QAClD;AAGA,YAAI,yBAAyB;AAC3B,cAAI;AACF,kBAAM,sBAAsB,eAAe,cAAc,gBAAgB;AAAA,UAC3E,SAAS,KAAK;AACZ,oBAAQ,MAAM,oCAAoC,GAAG;AAAA,UACvD;AAAA,QACF;AAEA,wBAAgB,UAAU,OAAkC;AAC5D,wCAAgC;AAChC,YAAI,gBAAiB,OAAM,kBAAkB,eAAe;AAAA,MAC9D,SAAS,KAAc;AACrB,oCAA4B;AAC5B,YAAI;AACF,cAAI,OAAO,WAAW,aAAa;AACjC,yCAA6B;AAAA,cAC3B,WAAW;AAAA,cACX;AAAA,cACA,OAAO;AAAA,YACT,CAAC;AACD,mBAAO,cAAc,IAAI,YAAY,sBAAsB;AAAA,cACzD,QAAQ;AAAA,gBACN;AAAA,gBACA,OAAO;AAAA,cACT;AAAA,YACF,CAAC,CAAC;AAAA,UACJ;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,EAAE,SAAS,eAAe,aAAa,kBAAkB,IAAI,+BAA+B,KAAK,EAAE,aAAa,CAAC;AACvH,cAAM,sBAAsB,qBAAqB,CAAC;AAClD,cAAM,iBAAiB,OAAO,KAAK,mBAAmB,EAAE,SAAS;AACjE,cAAM,oBAAoB,kBACrB,MAAM;AACL,gBAAM,WAAW,OAAO,KAAK,mBAAmB,EAAE,CAAC;AACnD,cAAI,CAAC,SAAU,QAAO;AACtB,gBAAM,QAAQ,oBAAoB,QAAQ;AAC1C,cAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAE,OAAQ,QAAO;AAC9D,iBAAO,2BAA2B,KAAK;AAAA,QACzC,GAAG,IACH;AACJ,YAAI,gBAAgB;AAClB,gBAAM,oBAAoB,MAAM,0BAA0B,mBAAmB;AAC7E,oBAAU,0BAA0B,iBAAiB,CAAC;AACtD,cAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,oBAAQ,MAAM,mDAAmD,iBAAiB;AAAA,UACpF;AAAA,QACF;AAEA,cAAM,yBAAyB,8BAA8B,GAAG;AAChE,YAAI,iBAAiB,yBACjB,EAAE,iCAAiC,kEAAkE,IACrG,OAAO,kBAAkB,YAAY,cAAc,KAAK,IAAI,cAAc,KAAK,IAAI;AACvF,YAAI,gBAAgB;AAClB,gBAAM,UAAU,eAAe,YAAY;AAC3C,gBAAM,mBAAmB,mBAAmB,YAAY;AACxD,cAAI,CAAC,kBAAkB,YAAY,mBAAmB,YAAY,kBAAkB;AAClF,6BAAiB,qBAAqB;AAAA,UACxC;AAAA,QACF;AACA,YAAI,CAAC,kBAAkB,eAAe,SAAS,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,KAAK,GAAG;AACpG,2BAAiB,IAAI,QAAQ,KAAK;AAAA,QACpC;AACA,YAAI,CAAC,gBAAgB;AACnB,2BAAiB,iBAAiB,qBAAqB;AAAA,QACzD;AACA,yBAAiB,mBAAmB,cAAc;AAClD,YAAI,wBAAwB;AAI1B,cAAI;AAAE,kCAAsB,KAAK,CAAC;AAAA,UAAE,QAAQ;AAAA,UAAC;AAAA,QAC/C,WAAW,CAAC,gBAAgB;AAC1B,gBAAM,gBAAgB,OAAO;AAAA,QAC/B;AACA,qBAAa,cAAc;AAAA,MAC7B,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACA,UAAE;AACA,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF;AAIA,QAAM,0BAA0B,MAAM,OAEpC,oBAAI,IAAI,CAAC;AAGX,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,UAAM,UAAU,YAAY;AAC1B,YAAM,UAAU,aAAa,QAC1B;AAAA,QACC,CAAC,MACC,EAAE,SAAS,YAAY,OAAO,EAAE,gBAAgB;AAAA,MACpD,EACC,IAAI,OAAO,MAAM;AAChB,YAAI;AACF,kCAAwB,QAAQ,IAAI,EAAE,IAAI,EAAE,WAAW;AACvD,gBAAM,OAAO,MAAM,EAAE,YAAY;AACjC,cAAI,CAAC,UAAW,mBAAkB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE;AAAA,QACzE,QAAQ;AAAA,QAER;AAAA,MACF,CAAC;AACH,YAAM,QAAQ,IAAI,OAAO;AAAA,IAC3B;AACA,YAAQ;AACR,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,sBAAsB,CAAC;AAE3B,QAAM,mBAAmB,MAAM,YAAY,OAAO,OAAkB,UAA+C;AACjH,QAAI,EAAE,UAAU,UAAU,MAAM,SAAS,SAAU,QAAO;AAC1D,UAAM,UAAU;AAChB,UAAM,SAAS,QAAQ;AACvB,QAAI,OAAO,WAAW,YAAY;AAChC,YAAM,iBAAiB,wBAAwB,QAAQ,IAAI,MAAM,EAAE;AACnE,YAAM,gBAAgB,mBAAmB;AACzC,8BAAwB,QAAQ,IAAI,MAAM,IAAI,MAAM;AACpD,UACE,UAAU,UACV,CAAC,iBACD,MAAM,QAAQ,eAAe,MAAM,EAAE,CAAC,GACtC;AACA,eAAO,eAAe,MAAM,EAAE;AAAA,MAChC;AACA,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,KAAK;AAClC,YAAI,UAAU,QAAW;AACvB,4BAAkB,CAAC,UAAU;AAAA,YAC3B,GAAG;AAAA,YACH,CAAC,MAAM,EAAE,GAAG;AAAA,UACd,EAAE;AAAA,QACJ;AACA,eAAO;AAAA,MACT,QAAQ;AACN,eAAO,QAAQ,WAAW;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,eAAe,MAAM,EAAE,KAAK,QAAQ,WAAW;AAAA,EACxD,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,mBAAmB,MAAM,QAAQ,MAAM;AAC3C,UAAM,MAAM,IAAI,WAAW,IAA+B;AAC1D,eAAW,KAAK,WAAW;AACzB,UAAI,EAAE,UAAU,MAAM,EAAE,SAAS,SAAU;AAC3C,YAAM,UAAU;AAChB,YAAM,gBAAgB,QAAQ,WAAW;AACzC,YAAM,UAAU,eAAe,EAAE,EAAE;AACnC,UAAI,WAAW,QAAQ,QAAQ;AAC7B,cAAM,SAA4B,CAAC;AACnC,cAAM,OAAO,oBAAI,IAAY;AAC7B,mBAAW,OAAO,eAAe;AAC/B,cAAI,KAAK,IAAI,IAAI,KAAK,EAAG;AACzB,eAAK,IAAI,IAAI,KAAK;AAClB,iBAAO,KAAK,GAAG;AAAA,QACjB;AACA,mBAAW,OAAO,SAAS;AACzB,cAAI,KAAK,IAAI,IAAI,KAAK,EAAG;AACzB,eAAK,IAAI,IAAI,KAAK;AAClB,iBAAO,KAAK,GAAG;AAAA,QACjB;AACA,YAAI,IAAI,EAAE,IAAI,MAAM;AAAA,MACtB,WAAW,cAAc,QAAQ;AAC/B,YAAI,IAAI,EAAE,IAAI,aAAa;AAAA,MAC7B,WAAW,SAAS;AAClB,YAAI,IAAI,EAAE,IAAI,OAAO;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,cAAc,CAAC;AAI9B,QAAM,uBAAuB,UAAU;AAAA,IACrC,CAAC,UAAU,MAAM,WAAW,UAAU,MAAM,WAAW;AAAA,EACzD;AACA,QAAM,OAAO,YACT,kDACA,uBACE,0CACA;AAGN,QAAM,qBAAqB,CAAC,WAAqC;AAC/D,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,cAA2B;AAC/C,UAAM,iBAAiB,UAAU;AAAA,MAC/B,CAAC,UAAU,MAAM,WAAW,UAAU,MAAM,WAAW;AAAA,IACzD;AACA,UAAM,YAAY,iBAAiB,0CAA0C;AAC7E,WACE,oBAAC,SAAI,WAAW,WACb,oBAAU,IAAI,CAAC,MAAM;AACpB,YAAM,SAAS,EAAE,UAAU;AAC3B,YAAM,mBAAmB,iBAAiB,mBAAmB,MAAM,IAAI;AACvE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,UACP,OAAO,uBAAuB,QAAmC,EAAE,EAAE;AAAA,UACrE,OAAO,OAAO,EAAE,EAAE;AAAA,UAClB,SAAS,iBAAiB,IAAI,EAAE,EAAE,KAAK;AAAA,UACvC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACE,WAAW,CAAC,uBAAuB,CAAC,gBAAgB,QAAQ,gBAAgB,EAAE,OAAO,YAAY;AAAA,UACnG,iBAAiB;AAAA,UACjB;AAAA,UACA,kBAAkB,mBAAmB;AAAA,UACrC;AAAA,UACA,cAAc,uBAAuB,IAAI,EAAE,EAAE;AAAA;AAAA,QAdxC,EAAE;AAAA,MAeT;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AAEA,QAAM,4BAA4B,MAAM,YAAY,MAAyB;AAC3E,QAAI,CAAC,kBAAkB,QAAQ;AAC7B,aAAO;AAAA,QACL,oBAAC,SAA8B,WAAU,iCACtC,oCADM,qBAET;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAA2B,CAAC;AAClC,UAAM,mBAAmB,kBAAkB,SAAS;AAEpD,sBAAkB,QAAQ,CAAC,iBAAiB;AAC1C,YAAM,aAAa,4BAA4B,aAAa,QAAQ;AACpE,YAAM,eACJ,aAAa,gBACb,aAAa,2BACb,aAAa,mBAAmB,SAAS;AAE3C,UAAI,kBAAkB;AACpB,cAAM;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cAET,uBAAa;AAAA;AAAA,YAHT,wBAAwB,aAAa,QAAQ;AAAA,UAIpD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM;AAAA,UACJ,oBAAC,SAA4D,WAAU,iCACrE,+BAAC,SAAI,WAAU,6CACb;AAAA,gCAAC,WAAM,WAAU,yDACd,iCACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,aAAa,kBAAkB;AAAA,gBACtC,eAAe,CAAC,UACd;AAAA,kBACE,aAAa;AAAA,kBACb,SAAS;AAAA,gBACX;AAAA,gBAEF;AAAA,sCAAC,iBAAc,WAAU,wBACvB,8BAAC,eAAY,aAAa,sBAAsB,GAClD;AAAA,kBACA,oBAAC,iBACE,uBAAa,mBAAmB,IAAI,CAAC,OACpC,oBAAC,cAAyB,OAAO,GAAG,MACjC,aAAG,SADW,GAAG,IAEpB,CACD,GACH;AAAA;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,SAAS,MACP,yBAAyB,aAAa,UAAU,aAAa,kBAAkB,MAAM,UAAU;AAAA,gBACjG,UAAU,CAAC;AAAA,gBACX,OAAO;AAAA,gBAEP,8BAAC,YAAS,WAAU,UAAS;AAAA;AAAA,YAC/B;AAAA,aACF,KAlCQ,0BAA0B,aAAa,QAAQ,EAmCzD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,QAAQ;AAChC,qBAAa,SAAS,QAAQ,CAAC,YAAY;AACzC,gBAAM,eAAe,QAAQ,UAAU,OACnC,yBAAyB,QAAQ,SAAS,IAAI,IAC9C;AACJ,gBAAM,aAAa,GAAG,aAAa,QAAQ,IAAI,QAAQ,gBAAgB,SAAS;AAChF,gBAAM,iBAAiB,CAAC;AACxB,gBAAM;AAAA,YACJ,qBAAC,SAAqB,WAAU,2CAC9B;AAAA,mCAAC,SAAI,WAAU,0CACb;AAAA,qCAAC,SAAI,WAAU,0BACZ;AAAA,iCACC,oBAAC,gBAAa,WAAU,gCAA+B,IACrD;AAAA,kBACJ,qBAAC,SACC;AAAA,wCAAC,SAAI,WAAU,uBAAuB,kBAAQ,OAAM;AAAA,oBACnD,QAAQ,cACP,oBAAC,SAAI,WAAU,iCACZ,kBAAQ,aACX,IACE;AAAA,qBACN;AAAA,mBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,MAAM,yBAAyB,aAAa,UAAU,QAAQ,cAAc,UAAU;AAAA,oBAC/F,UAAU;AAAA,oBAEV;AAAA,0CAAC,YAAS,WAAU,UAAS;AAAA,sBAC5B;AAAA;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cACC,QAAQ,OAAO,IAAI,CAAC,UAAU;AAC7B,sBAAM,WAAW,GAAG,QAAQ,gBAAgB,SAAS,IAAI,MAAM,QAAQ,SAAS;AAChF,sBAAM,gBAAgB,qBAAqB,OAAO,IAC9C,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,EAAE,CAAC,IAC1D,MAAM;AACV,oBAAI,CAAC,cAAc,OAAQ,QAAO;AAClC,uBACE,qBAAC,SAAmB,WAAU,aAC3B;AAAA,wBAAM,QACL,qBAAC,SACC;AAAA,wCAAC,SAAI,WAAU,uEACZ,gBAAM,OACT;AAAA,oBACC,MAAM,OACL,oBAAC,SAAI,WAAU,iCAAiC,gBAAM,MAAK,IACzD;AAAA,qBACN,IACE;AAAA,kBACH,aAAa,aAAa;AAAA,qBAXnB,QAYV;AAAA,cAEJ,CAAC;AAAA,cACA,CAAC,QAAQ,OAAO,SACf,oBAAC,SAAI,WAAU,iCAAiC,gCAAqB,IACnE;AAAA,iBAnDI,UAoDV;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM;AAAA,UACJ,oBAAC,SAAyD,WAAU,iCACjE,oCADO,uBAAuB,aAAa,QAAQ,EAEtD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,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;AAAA,EACF,CAAC;AAED,QAAM,wBACJ,oBAAC,UAAO,MAAM,yBAAyB,MAAM,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,yBAAwB,IAAI;AAAA,EAAE,GAC9G;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,oBAAkB;AAAA,MAClB,WAAW,CAAC,UAAU;AACpB,aAAK,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,SAAS;AAC7D,gBAAM,eAAe;AACrB,mCAAyB;AAAA,QAC3B;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,gBACC,8BAAC,eAAa,+BAAoB,GACpC;AAAA,QACC,uBACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,wBAAwB,IAAI;AAAA,YAC3C,oBAAoB;AAAA,YAEpB;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,UAAU,qBAAqB;AAAA,gBAC/B,iBAAiB,qBAAqB;AAAA,gBACtC,gBAAgB,0BAA0B;AAAA,gBAC1C,SAAS;AAAA,gBACT,SAAS,MAAM,wBAAwB,IAAI;AAAA;AAAA,YAC7C;AAAA;AAAA,QACF,IAEA,oBAAC,SAAI,WAAU,0FACZ,qCACH;AAAA;AAAA;AAAA,EAEJ,GACF;AAGF,QAAM,6BAA6B,MAAM,YAAY,CAAC,UAA4C;AAChG,QAAI,CAAC,aAAc;AACnB,UAAM,SAAS,MAAM;AACrB,QAAI,kBAAkB,YAAa,QAAO,KAAK;AAAA,EACjD,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,+BAA+B,MAAM,YAAY,CAAC,UAA+C;AACrG,QAAI,CAAC,aAAc;AACnB,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAe,MAAM,YAAY,CAAC,UAA2B,cAAuB;AACxF,QAAI,CAAC,aAAc,QAAO;AAC1B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,YAAY,SAAS;AAAA,QACnC,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAElB;AAAA,8BAAC,SAAI,WAAU,8CACZ,UACH;AAAA,UACA,oBAAC,SAAI,WAAU,oHACZ,6BAAmB,oBAAC,SAAI,WAAU,2EAA0E,GAC/G;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAAC,cAAc,4BAA4B,8BAA8B,eAAe,CAAC;AAG5F,MAAI,kBAAkB;AAGpB,UAAM,eAAe,wBACjB,CAAC,GAAG,uBAAuB,EAAE,KAAK,CAAC,GAAG,MAAM;AAC1C,YAAM,KAAK,eAAe,QAAQ,EAAE,EAAE;AACtC,YAAM,KAAK,eAAe,QAAQ,EAAE,EAAE;AACtC,cAAQ,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM;AAAA,IACrD,CAAC,IACD;AAEJ,UAAM,OAAwB,CAAC;AAC/B,UAAM,OAAwB,CAAC;AAC/B,eAAW,KAAK,cAAc;AAC5B,WAAK,EAAE,UAAU,OAAO,EAAG,MAAK,KAAK,CAAC;AAAA,UACjC,MAAK,KAAK,CAAC;AAAA,IAClB;AACA,UAAM,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAEpC,UAAM,qBAAqB,CAAC,UAA2B;AACrD,YAAM,QAA2B,CAAC;AAClC,iBAAW,KAAK,OAAO;AACrB,cAAM,sBAAsB,EAAE,SAAS;AACvC,YAAI,qBAAqB;AACvB,cAAI,uBAAuB;AACzB,kBAAM,iBACJ,oBAAC,SAA4B,WAAU,iCACrC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,aAAY;AAAA,gBACZ,WAAU;AAAA,gBAEV,8BAAC,SAAI;AAAA;AAAA,YACP,KARQ,GAAG,EAAE,EAAE,UASjB;AAEF,gBAAI,4BAA4B,EAAE,OAAO;AACvC,oBAAM;AAAA,gBACJ;AAAA,kBAAC;AAAA;AAAA,oBAEC,SAAS,EAAE;AAAA,oBACX,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK;AAAA,oBACzB,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBAEhB;AAAA;AAAA,kBANI,GAAG,EAAE,EAAE;AAAA,gBAOd;AAAA,cACF;AAAA,YACF,OAAO;AACL,oBAAM,KAAK,cAAc;AAAA,YAC3B;AACA;AAAA,UACF;AAEA,gBAAM,yBAA4C,CAAC;AACnD,cAAI,EAAE,WAAW;AACf,mCAAuB;AAAA,cACrB,oBAAC,SAA8B,WAAU,uCACtC,YAAE,UAAU,EAAE,QAAQ,UAAU,QAAQ,kBAAkB,uBAAuB,CAAC,KAD3E,GAAG,EAAE,EAAE,YAEjB;AAAA,YACF;AAAA,UACF;AACA,gBAAM,mBAAmB,0BAA0B;AACnD,cAAI,iBAAiB,OAAQ,wBAAuB,KAAK,GAAG,gBAAgB;AAE5E,cAAI,4BAA4B,EAAE,OAAO;AACvC,kBAAM,mBAAmB,kBAAkB;AAAA,cACzC,CAAC,KAAK,WAAW,MAAM,OAAO,SAAS;AAAA,gBACrC,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO;AAAA,kBACvC,CAAC,MAAM,UAAU,OAAO,MAAM,OAAO;AAAA,kBAAQ;AAAA,gBAC/C;AAAA,gBAAG;AAAA,cACL;AAAA,cAAG;AAAA,YACL;AACA,kBAAM,oBAAoB,kBAAkB;AAAA,cAC1C,CAAC,KAAK,WAAW,MAAM,OAAO,SAAS;AAAA,gBACrC,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO;AAAA,kBACvC,CAAC,MAAM,UAAU,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC,EAAE;AAAA,kBAAQ;AAAA,gBAC3E;AAAA,gBAAG;AAAA,cACL;AAAA,cAAG;AAAA,YACL;AACA,kBAAM;AAAA,cACJ;AAAA,gBAAC;AAAA;AAAA,kBAEC,KAAK,CAAC,WAAW;AACf,wBAAI,OAAQ,mBAAkB,QAAQ,IAAI,EAAE,IAAI,MAAM;AAAA,wBACjD,mBAAkB,QAAQ,OAAO,EAAE,EAAE;AAAA,kBAC5C;AAAA,kBACA,SAAS,EAAE;AAAA,kBACX,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK;AAAA,kBACzB,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,iBAAiB;AAAA,kBAEjB,8BAAC,SAAI,WAAU,aACZ,kCACH;AAAA;AAAA,gBAdK,EAAE;AAAA,cAeT;AAAA,YACF;AAAA,UACF,OAAO;AACL,kBAAM,KAAK,GAAG,sBAAsB;AAAA,UACtC;AACA;AAAA,QACF;AAEA,cAAM,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,UAAU,QAAQ,kBAAkB,uBAAuB,CAAC,IAAI;AAC1H,YAAI,EAAE,MAAM;AACV,cAAI,eAAe;AACjB,kBAAM,KAAK,oBAAC,MAAM,UAAN,EAA2B,2BAAP,EAAE,EAAmB,CAAiB;AAAA,UACxE;AACA;AAAA,QACF;AACA,cAAM,cAAc,mBAAmB,CAAC;AACxC,cAAM,iBAAiB,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,EAAG;AACpF,cAAM,kBAAkB,cAAc,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,EAAE;AAEjE,cAAM,eACJ,iCACG;AAAA,YAAE,cAAc,oBAAC,SAAI,WAAU,iCAAiC,YAAE,EAAE,aAAa,EAAE,WAAW,GAAE,IAAS;AAAA,UACzG,gBACC,oBAAC,SAAK,yBAAc,IAClB;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,cACX,gBAAgB;AAAA,cAChB,aAAY;AAAA,cACZ,WAAU;AAAA,cAET,sBAAY,SAAS,IAAI,aAAa,WAAW,IAAI,oBAAC,SAAI,WAAU,eAAc;AAAA;AAAA,UACrF;AAAA,WACF;AAGF,YAAI,4BAA4B,EAAE,OAAO;AACvC,gBAAM;AAAA,YACJ;AAAA,cAAC;AAAA;AAAA,gBAEC,KAAK,CAAC,WAAW;AACf,sBAAI,OAAQ,mBAAkB,QAAQ,IAAI,EAAE,IAAI,MAAM;AAAA,sBACjD,mBAAkB,QAAQ,OAAO,EAAE,EAAE;AAAA,gBAC5C;AAAA,gBACA,SAAS,EAAE;AAAA,gBACX,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK;AAAA,gBACzB,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY,YAAY;AAAA,gBACxB,iBAAiB;AAAA,gBAEjB,8BAAC,SAAI,WAAU,aACZ,wBACH;AAAA;AAAA,cAdK,EAAE;AAAA,YAeT;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,YACJ,qBAAC,SAAe,WAAU,iDACvB;AAAA,gBAAE,QACD,oBAAC,SAAI,WAAU,uBAAuB,YAAE,EAAE,OAAO,EAAE,KAAK,GAAE,IACxD;AAAA,cACH;AAAA,iBAJO,EAAE,EAKZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,mBAAmB,IAAI;AACzC,UAAM,cAAc,mBAAmB,IAAI;AAG3C,UAAM,cAAc,wBAChB,UAAU,IAAI,CAAC,MAAM,MACnB,oBAAC,qBAAyC,IAAI,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAClE,kBADqB,KAAK,CAAC,GAAG,MAAM,CAEvC,CACD,IACD;AACJ,UAAM,qBAAqB,YAAY,SAAS;AAEhD,WACE,qBAAC,SAAI,WAAU,aAAY,KAAK,SAAS,yBAAuB,2BAC7D;AAAA,OAAC,WACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,YACP,cAAc;AAAA,YACd,YAAY,CAAC,gBAAgB;AAAA,YAC7B,UAAU;AAAA;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,eAAe,SAAY,EAAE,QAAQ,SAAkB,OAAO,qBAAqB,cAAc,aAAa,MAAM,WAAW;AAAA,UACzI;AAAA;AAAA,MACF,IACE,qBACF,oBAAC,SAAI,WAAU,+BAA+B,8BAAmB,IAC/D;AAAA,MACH;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,gBAAgB;AAAA,UAChB,aAAY;AAAA,UACZ,WAAW,WAAW,gBAAgB;AAAA,UAErC;AAAA,YACC,qBAAC,UAAK,IAAI,QAAQ,UAAU,cAAc,WAAW,aAAa,iBAAiB,IAClF;AAAA,wCACC;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,MAAM;AAAA,kBACN,cAAc,CAAC,YAAY,UAAU,OAAkC;AAAA,kBACvE,UAAU,WAAW;AAAA,kBACrB,iBAAiB;AAAA;AAAA,cACnB,IACE;AAAA,cACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,qBACP,kDACA;AAAA,kBAEH;AAAA,4CACC,oBAAC,cAAW,SAAS,iBAAiB,oBAAoB,eAAe,WAAW,oBAClF,8BAAC,mBAAgB,OAAO,SAAS,UAAU,6BACzC,8BAAC,SAAI,WAAU,aAAa,uBAAY,GAC1C,GACF,IAEA,oBAAC,SAAI,WAAU,aAAa,uBAAY;AAAA,oBAEzC,qBAAqB,oBAAC,SAAI,WAAU,aAAY,8BAA0B,MAAE,uBAAY,IAAS;AAAA;AAAA;AAAA,cACpG;AAAA,cACC,aAAa,CAAC,OAAO,KAAK,MAAM,EAAE,SAAS,oBAAC,SAAI,WAAU,kCAAkC,qBAAU,IAAS;AAAA,cAC/G,qBAAqB,eAAe,OACnC;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,WAAW;AAAA,kBACX,SAAS;AAAA,oBACP;AAAA,oBACA,YAAY,CAAC,YAAY;AAAA,oBACzB,UAAU;AAAA;AAAA,oBACV;AAAA,oBACA,YAAY,CAAC,WAAW,aAAa;AAAA,oBACrC;AAAA,oBACA,QAAQ,EAAE,SAAkB,OAAO,qBAAqB,cAAc,aAAa,MAAM,WAAW;AAAA,kBACtG;AAAA;AAAA,cACF;AAAA,eAEF;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AAGA,SACE,qBAAC,SAAI,WAAU,aAAY,KAAK,SAAS,yBAAuB,2BAC7D;AAAA,KAAC,WACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,UACP,cAAc;AAAA,UACd,YAAY,CAAC,gBAAgB;AAAA,UAC7B,UAAU;AAAA;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,eAAe,SAAY,EAAE,QAAQ,SAAkB,OAAO,qBAAqB,cAAc,aAAa,MAAM,WAAW;AAAA,QACzI;AAAA;AAAA,IACF,IACE,qBACF,oBAAC,SAAI,WAAU,+BAA+B,8BAAmB,IAC/D;AAAA,IACH;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,gBAAgB;AAAA,QAChB,aAAY;AAAA,QACZ,WAAW,WAAW,gBAAgB;AAAA,QAErC;AAAA,UACC,oBAAC,SACD;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,WAAW,GAAG,WAAW,cAAc,yCAAyC,IAAI,iBAAiB;AAAA,cAEpG;AAAA,0CACC;AAAA,kBAAC;AAAA;AAAA,oBACC,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,MAAM;AAAA,oBACN,cAAc,CAAC,YAAY,UAAU,OAAkC;AAAA,oBACvE,UAAU,WAAW;AAAA,oBACrB,iBAAiB;AAAA;AAAA,gBACnB,IACE;AAAA,gBACJ,oBAAC,SAAI,WAAW,MACb,oBAAU,IAAI,CAAC,MAAM;AACpB,sBAAI,mBAAmB,IAAI,EAAE,EAAE,KAAK,uBAAuB,IAAI,EAAE,EAAE,EAAG,QAAO;AAC7E,wBAAM,SAAS,EAAE,UAAU;AAC3B,wBAAM,mBAAmB,uBAAuB,mBAAmB,MAAM,IAAI;AAC7E,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,OAAO;AAAA,sBACP,OAAO,OAAO,EAAE,EAAE;AAAA,sBAClB,OAAO,OAAO,EAAE,EAAE;AAAA,sBAClB,SAAS,iBAAiB,IAAI,EAAE,EAAE,KAAK;AAAA,sBACvC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,WAAW,CAAC,uBAAuB,CAAC,gBAAgB,QAAQ,gBAAgB,EAAE,OAAO,YAAY;AAAA,sBACjG,iBAAiB;AAAA,sBACjB;AAAA,sBACA,kBAAkB,mBAAmB;AAAA,sBACrC;AAAA,sBACA,cAAc,uBAAuB,IAAI,EAAE,EAAE;AAAA;AAAA,oBAdxC,EAAE;AAAA,kBAeT;AAAA,gBAEJ,CAAC,GACH;AAAA,gBACC,aAAa,CAAC,OAAO,KAAK,MAAM,EAAE,SAAS,oBAAC,SAAI,WAAU,kCAAkC,qBAAU,IAAS;AAAA,gBAC/G,qBAAqB,eAAe,OACnC;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,WAAW;AAAA,oBACX,SAAS;AAAA,sBACP;AAAA,sBACA,YAAY,CAAC,YAAY;AAAA,sBACzB,UAAU;AAAA;AAAA,sBACV;AAAA,sBACA,YAAY,CAAC,WAAW,aAAa;AAAA,sBACrC;AAAA,sBACA,QAAQ,EAAE,SAAkB,OAAO,qBAAqB,cAAc,aAAa,MAAM,WAAW;AAAA,oBACtG;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UAEJ,GACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACC;AAAA,IACA;AAAA,KACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,WAAW,MAAM,OAAgC,IAAI;AAE3D,QAAM,WAAW,MAAM,QAAQ,MAAM;AACnC,UAAM,IAAI,MAAM,YAAY,EAAE,KAAK;AACnC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACrG,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,aAAa,eAAe,EAAE,sCAAsC,WAAW;AAAA,QAC/E,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC;AAAA,QACA,0BAAuB;AAAA;AAAA,IACzB;AAAA,IACA,qBAAC,SAAI,WAAU,yCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,SAAS,EAAE;AAAA,UAC3B;AAAA;AAAA,MAED;AAAA,MACC,SAAS,IAAI,CAAC,QACb;AAAA,QAAC;AAAA;AAAA,UAEC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAW,iDACT,UAAU,IAAI,QAAQ,aAAa,EACrC;AAAA,UACA,SAAS,MAAM,SAAS,IAAI,KAAK;AAAA,UAEhC,cAAI;AAAA;AAAA,QARA,IAAI;AAAA,MASX,CACD;AAAA,OACH;AAAA,KACF;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GASG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,KAAK;AACtD,QAAM,eAAe,MAAM,OAAO,KAAK;AACvC,QAAM,gBAAgB,MAAM,OAAO,KAAK;AACxC,QAAM,aAAa,MAAM,MAAM;AAC/B,QAAM,kBAAkB,MAAM,YAAY,MAAM;AAC9C,QAAI,UAAU,MAAO;AACrB,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,OAAO,UAAU,KAAK,CAAC;AAE3B,QAAM,UAAU,MAAM;AAEpB,QAAI,CAAC,aAAa,WAAW,CAAC,cAAc,SAAS;AACnD,eAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,MAAM,YAAY,CAAC,MAA2C;AACjF,QAAI,SAAU;AACd,UAAM,OAAO,EAAE,OAAO;AACtB,kBAAc,UAAU;AACxB,aAAS,IAAI;AACb,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,QAAM,gBAAgB,MAAM,YAAY,CAAC,MAA6C;AACpF,QAAI,SAAU;AACd,QAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,QAAE,eAAe;AACjB,sBAAgB;AAChB,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,iBAAiB,UAAU,QAAQ,CAAC;AAExC,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,iBAAa,UAAU;AACvB,kBAAc,UAAU;AACxB,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,MAAI,cAAc,YAAY;AAC5B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ;AAAA,QACA,0BAAuB;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ;AAAA,QACA,0BAAuB;AAAA,QACvB;AAAA,QACA,MAAM,eAAe,YAAY,SAAS,IAAI,aAAa;AAAA;AAAA,IAC7D;AAAA,IACC,eAAe,YAAY,SAAS,KACnC,oBAAC,cAAS,IAAI,YACX,sBAAY,IAAI,CAAC,eAChB,oBAAC,YAAwB,OAAO,cAAnB,UAA+B,CAC7C,GACH;AAAA,KAEJ;AAEJ;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,kBAAkB,UAAU,UAAa,UAAU,OAAO,OAAO,KAAK,IAAI;AAChF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,eAAe;AAChE,QAAM,eAAe,MAAM,OAAO,KAAK;AACvC,QAAM,kBAAkB,MAAM,YAAY,MAAM;AAC9C,QAAI,UAAU,gBAAiB;AAC/B,UAAM,WAAW,UAAU,KAAK,SAAY,OAAO,KAAK;AACxD,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,OAAO,UAAU,eAAe,CAAC;AAErC,QAAM,UAAU,MAAM;AAEpB,QAAI,CAAC,aAAa,SAAS;AACzB,eAAS,eAAe;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,eAAe,MAAM,YAAY,CAAC,MAA2C;AACjF,UAAM,OAAO,EAAE,OAAO;AACtB,aAAS,IAAI;AACb,UAAM,WAAW,SAAS,KAAK,SAAY,OAAO,IAAI;AACtD,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,gBAAgB,MAAM,YAAY,CAAC,MAA6C;AACpF,QAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,QAAE,eAAe;AACjB,sBAAgB;AAChB,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,iBAAiB,QAAQ,CAAC;AAE9B,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,iBAAa,UAAU;AACvB,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,0BAAuB;AAAA;AAAA,EACzB;AAEJ;AAGA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,KAAK;AACtD,QAAM,eAAe,MAAM,OAAO,KAAK;AACvC,QAAM,kBAAkB,MAAM,YAAY,MAAM;AAC9C,QAAI,UAAU,MAAO;AACrB,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,OAAO,UAAU,KAAK,CAAC;AAE3B,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,aAAa,QAAS,UAAS,KAAK;AAAA,EAC3C,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,MAAM,YAAY,CAAC,MAA8C;AACpF,UAAM,OAAO,EAAE,OAAO;AACtB,aAAS,IAAI;AACb,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,MAAM,YAAY,MAAM;AAAE,iBAAa,UAAU;AAAA,EAAK,GAAG,CAAC,CAAC;AAC/E,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,iBAAa,UAAU;AACvB,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,0BAAuB;AAAA;AAAA,EACzB;AAEJ;AAKA,MAAM,iBAAiB,MAAM,KAAK,SAASO,gBAAe,EAAE,QAAQ,IAAI,SAAS,GAAY;AAC3F,SAAO,oBAAC,iBAAc,OAAc,UAAoB;AAC1D,GAAG,CAAC,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK;AAQ5C,MAAM,sBAAsB,MAAM,KAAK,SAASC,qBAAoB,EAAE,QAAQ,IAAI,SAAS,GAA6B;AACtH,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,MAAM,QAAmC,OAAO;AAAA,IAC7D,MAAM,EAAE,wBAAwB;AAAA,IAChC,QAAQ,EAAE,0BAA0B;AAAA,IACpC,WAAW,EAAE,6BAA6B;AAAA,IAC1C,eAAe,EAAE,wBAAwB;AAAA,IACzC,aAAa,EAAE,iCAAiC,eAAe;AAAA,IAC/D,SAAS,EAAE,6BAA6B,SAAS;AAAA,IACjD,UAAU,EAAE,8BAA8B,WAAW;AAAA,IACrD,UAAU,EAAE,8BAA8B,WAAW;AAAA,IACrD,UAAU,EAAE,4BAA4B;AAAA,IACxC,WAAW,EAAE,+BAA+B,WAAW;AAAA,IACvD,MAAM,EAAE,wBAAwB;AAAA,IAChC,eAAe,EAAE,iCAAiC;AAAA,IAClD,aAAa,EAAE,+BAA+B;AAAA,IAC9C,SAAS,EAAE,6BAA6B,aAAa;AAAA,IACrD,SAAS,EAAE,6BAA6B,SAAS;AAAA,IACjD,MAAM,EAAE,0BAA0B,MAAM;AAAA,EAC1C,IAAI,CAAC,CAAC,CAAC;AACP,SAAO,oBAAC,cAAW,OAAc,UAAoB,SAAQ,QAAO,QAAgB;AACtF,GAAG,CAAC,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK;AAI5C,MAAM,uBAAuB,MAAM,KAAK,SAASC,sBAAqB,EAAE,QAAQ,IAAI,SAAS,GAAkB;AAC7G,QAAM,IAAI,KAAK;AACf,QAAM,YAAY,EAAE,wBAAwB;AAC5C,QAAM,cAAc,EAAE,0BAA0B;AAChD,QAAM,iBAAiB,EAAE,6BAA6B;AACtD,QAAM,sBAAsB,EAAE,+BAA+B;AAC7D,QAAM,aAAa,EAAE,8BAA8B;AACnD,QAAM,QAAQ,MAAM,OAAmC,IAAI;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,KAAK;AACtD,QAAM,YAAY,MAAM,OAAO,KAAK;AAEpC,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,UAAU,QAAS,UAAS,KAAK;AAAA,EACxC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,OAAO,CAAC,QAAgB,QAAgB,WAAW;AACvD,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,UAAM,QAAQ,GAAG,kBAAkB;AACnC,UAAM,MAAM,GAAG,gBAAgB;AAC/B,UAAM,MAAM,MAAM,MAAM,OAAO,GAAG,KAAK;AACvC,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC3E,aAAS,IAAI;AACb,mBAAe,MAAM;AACnB,YAAM,QAAQ,QAAQ,OAAO,SAAS,IAAI,SAAS,MAAM;AACzD,SAAG,MAAM;AACT,SAAG,kBAAkB,OAAO,KAAK;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,CAAC,MAAgD;AACjE,UAAM,QAAQ,EAAE,WAAW,EAAE;AAC7B,QAAI,CAAC,MAAO;AACZ,UAAM,MAAM,EAAE,IAAI,YAAY;AAC9B,QAAI,QAAQ,KAAK;AAAE,QAAE,eAAe;AAAG,WAAK,IAAI;AAAA,IAAE;AAClD,QAAI,QAAQ,KAAK;AAAE,QAAE,eAAe;AAAG,WAAK,GAAG;AAAA,IAAE;AACjD,QAAI,QAAQ,KAAK;AAAE,QAAE,eAAe;AAAG,WAAK,IAAI;AAAA,IAAE;AAAA,EACpD;AAEA,SACE,qBAAC,SAAI,WAAU,yBACb;AAAA,yBAAC,SAAI,WAAU,8CACb;AAAA,0BAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,WAAU,8BAA6B,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,MAAM,KAAK,IAAI,GAAI,qBAAU;AAAA,MACvJ,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,WAAU,8BAA6B,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,MAAM,KAAK,GAAG,GAAI,uBAAY;AAAA,MACxJ,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,WAAU,8BAA6B,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,MAAM,KAAK,IAAI,GAAI,0BAAe;AAAA,OAC9J;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM;AAAE,oBAAU,UAAU;AAAM,mBAAS,EAAE,OAAO,KAAK;AAAA,QAAE;AAAA,QACtE,QAAQ,MAAM;AAAE,cAAI,UAAU,SAAS;AAAE,sBAAU,UAAU;AAAO,qBAAS,KAAK;AAAA,UAAE;AAAA,QAAE;AAAA,QACtF;AAAA,QACA,aAAa;AAAA;AAAA,IACf;AAAA,KACF;AAEJ,GAAG,CAAC,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK;AAmB5C,SAAS,8BAA8B,OAA2B;AAChE,SACE,MAAM,SAAS,UACf,MAAM,SAAS,cACf,MAAM,SAAS,cACf,MAAM,SAAS,cACf,MAAM,SAAS,YACf,MAAM,SAAS;AAEnB;AAUA,MAAM,qBAAqB,MAAM,KAAK,SAASC,oBAAmB;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,IAAI,KAAK;AACf,QAAM,oBAAoB,eAAe,EAAE,oCAAoC;AAC/E,QAAM,iBAAiB,EAAE,4BAA4B;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,WAAW,MAAM,QAAQ,MAAM;AACnC,UAAM,IAAI,MAAM,YAAY,EAAE,KAAK;AACnC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACrG,GAAG,CAAC,SAAS,KAAK,CAAC;AACnB,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,QAAgB;AACf,YAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI,GAAG,EAAG,KAAI,OAAO,GAAG;AAAA,UAC3B,KAAI,IAAI,GAAG;AAChB,eAAS,MAAM,KAAK,GAAG,CAAC;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AACA,SACE,qBAAC,SAAI,WAAU,UACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC;AAAA,QACA,0BAAuB;AAAA;AAAA,IACzB;AAAA,IACA,qBAAC,SAAI,WAAU,kDACZ;AAAA,eAAS,IAAI,CAAC,QAAQ;AACrB,cAAM,QAAQ,MAAM,SAAS,IAAI,KAAK;AACtC,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,OAAO,IAAI,KAAK;AAAA,YAC/B,WAAW,2DAA2D,QAAQ,aAAa,EAAE;AAAA,YAE7F,+BAAC,UAAK,WAAU,kCAOd;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAW,kGACT,QACI,wEACA,4BACN;AAAA,kBAEC,kBAAQ,oBAAC,SAAM,WAAU,YAAW,eAAY,QAAO,IAAK;AAAA;AAAA,cAC/D;AAAA,cACA,oBAAC,UAAM,cAAI,OAAM;AAAA,eACnB;AAAA;AAAA,UAzBK,IAAI;AAAA,QA0BX;AAAA,MAEJ,CAAC;AAAA,MACA,CAAC,SAAS,SACT,oBAAC,SAAI,WAAU,2CAA2C,0BAAe,IACvE;AAAA,OACN;AAAA,KACF;AAEJ,CAAC;AAED,MAAM,eAAe,MAAM;AAAA,EAAK,SAAS,iBAAiB;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsB;AACpB,UAAM,IAAI,KAAK;AACf,UAAM,gBAAgB,MAAM;AAAA,MAC1B,CAAC,cAAuB,SAAS,MAAM,IAAI,SAAS;AAAA,MACpD,CAAC,UAAU,MAAM,EAAE;AAAA,IACrB;AACA,UAAM,eAAe,MAAM;AAAA,MACzB,CAAC,UAAkB,cAAuB,SAAS,UAAU,SAAS;AAAA,MACtE,CAAC,QAAQ;AAAA,IACX;AACA,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,UAAM,YAAY,OAAO,SAAS,gBAAgB;AAClD,UAAM,WAAW,QAAQ,MAAM,QAAQ;AACvC,UAAM,WAAW,QAAQ,MAAM,QAAQ;AACvC,UAAM,iBAAiB,aAAa,CAAC;AAErC,UAAM,UAAU,MAAM;AACpB,UAAI,CAAC,aAAa,MAAM,SAAS,SAAU;AAC3C,uBAAiB,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACxC,GAAG,CAAC,OAAO,WAAW,gBAAgB,CAAC;AAEvC,UAAM,cAAc,SAAS;AAC7B,UAAM,gBAAgB,mBAAmB,aAAa,gBAAgB,KAAK;AAC3E,UAAM,wBAAwB,8BAA8B,KAAK;AACjE,UAAM,oBAAoB,MAAM,QAAQ,KAAK,IACzC,OAAO,MAAM,CAAC,KAAK,EAAE,IACrB,SAAS,OACP,KACA,OAAO,KAAK;AAClB,UAAM,yBAAyB,MAAM;AAAA,MACnC,MAAM,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,IAAI;AAAA,MACjE,CAAC,OAAO;AAAA,IACV;AACA,UAAM,oBAAoB,oBACtB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,iBAAiB,GAAG,QAC9D;AAEJ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,sBAAoB,MAAM;AAAA,QAC1B,QAAQ,wBACJ,CAAC,UAAU;AACT,gBAAM,cAAc,MAAM;AAC1B,cAAI,uBAAuB,QAAQ,MAAM,cAAc,SAAS,WAAW,EAAG;AAC9E,wBAAc,MAAM,EAAE;AAAA,QACxB,IACA;AAAA,QAEH;AAAA,gBAAM,SAAS,cAAc,MAAM,MAAM,KAAK,EAAE,SAAS,IACxD,qBAAC,WAAM,WAAU,6BACd;AAAA,kBAAM;AAAA,YACN,MAAM,YAAY,eAAe,oBAAC,UAAK,WAAU,0BAAyB,gBAAE,IAAU;AAAA,aACzF,IACE;AAAA,UACH,MAAM,SAAS,UACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,cACxC;AAAA,cACA,UAAU,CAAC,SAAS,cAAc,IAAI;AAAA,cACtC,WAAW;AAAA,cACX,UAAU;AAAA,cACV;AAAA,cACA,aAAa,MAAM,SAAS,SAAS,MAAM,cAAc;AAAA;AAAA,UAC3D;AAAA,UAED,MAAM,SAAS,cACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,cACxC;AAAA,cACA,UAAU,CAAC,SAAS,cAAc,IAAI;AAAA,cACtC,WAAW;AAAA,cACX,UAAU;AAAA,cACV;AAAA,cACA,WAAU;AAAA;AAAA,UACZ;AAAA,UAED,MAAM,SAAS,YACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,cACxE;AAAA,cACA,UAAU;AAAA,cACV,WAAW;AAAA,cACX,UAAU;AAAA;AAAA,UACZ;AAAA,UAED,MAAM,SAAS,UACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,YAAY,QAAQ,SAAS,KAAK,IAAI,iBAAiB,OAAO,QAAQ;AAAA,cAC9F,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,MAAM,YAAY,IAAI,MAAS;AAAA,cACpF;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS,SAAS;AAAA,cAClB,SAAS,SAAS;AAAA,cAClB,eAAe,SAAS;AAAA,cACxB,eAAe,SAAS;AAAA,cACxB,QAAQ,SAAS;AAAA;AAAA,UACnB;AAAA,UAED,MAAM,SAAS,oBACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK,KAAK,IAAI,iBAAiB,OAAO,QAAQ;AAAA,cAC9F,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,MAAM,oBAAoB,IAAI,MAAS;AAAA,cAC5F;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,SAAS;AAAA,cACrB,SAAS,SAAS;AAAA,cAClB,SAAS,SAAS;AAAA,cAClB,eAAe,SAAS;AAAA,cACxB,QAAQ,SAAS;AAAA;AAAA,UACnB;AAAA,UAED,MAAM,SAAS,gBACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,YAAY,QAAQ,SAAS,KAAK,IAAI,iBAAiB,OAAO,QAAQ;AAAA,cAC9F,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,MAAM,YAAY,IAAI,MAAS;AAAA,cACpF;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS,SAAS;AAAA,cAClB,SAAS,SAAS;AAAA,cAClB,eAAe,SAAS;AAAA,cACxB,eAAe,SAAS;AAAA,cACxB,QAAQ,SAAS;AAAA;AAAA,UACnB;AAAA,UAED,MAAM,SAAS,cACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK,KAAK,IAAI,iBAAiB,OAAO,QAAQ;AAAA,cAC9F,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,OAAO,KAAK,YAAY,IAAI,MAAS;AAAA,cAC5E;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,SAAS;AAAA,cACrB,SAAS,SAAS;AAAA,cAClB,SAAS,SAAS;AAAA,cAClB,eAAe,SAAS;AAAA,cACxB,QAAQ,SAAS;AAAA;AAAA,UACnB;AAAA,UAED,MAAM,SAAS,UACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,cAC3C,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,QAAQ,MAAS;AAAA,cACxD;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,SAAS;AAAA;AAAA,UACvB;AAAA,UAED,MAAM,SAAS,cACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,cACxC;AAAA,cACA,UAAU,CAAC,SAAS,cAAc,IAAI;AAAA,cACtC,WAAW;AAAA,cACX,WAAW,SAAS;AAAA,cACpB,WAAW,SAAS;AAAA,cACpB,MAAM,SAAS;AAAA,cACf;AAAA;AAAA,UACF;AAAA,UAED,MAAM,SAAS,cAAc,SAAS,WAAW,YAChD,oBAAC,wBAAqB,OAAO,OAAO,SAAS,EAAE,GAAG,UAAU,eAAe;AAAA,UAE5E,MAAM,SAAS,cAAc,SAAS,WAAW,UAChD,oBAAC,uBAAoB,OAAO,OAAO,SAAS,EAAE,GAAG,UAAU,eAAe;AAAA,UAE3E,MAAM,SAAS,eAAe,CAAC,SAAS,UAAW,QAAQ,WAAW,YAAY,QAAQ,WAAW,WACpG,oBAAC,kBAAe,OAAO,OAAO,SAAS,EAAE,GAAG,UAAU,eAAe;AAAA,UAEtE,MAAM,SAAS,UACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,cAClG,UAAU,CAAC,SAAS,cAAc,IAAI;AAAA,cACtC;AAAA,cACA,WAAW;AAAA,cACX,mCAAmC;AAAA,cACnC,aAAa,QAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AAAA,cAC1E,iBACE,OAAO,SAAS,gBAAgB,aAC5B,OAAO,UAAmB;AACxB,sBAAM,OAAO,MAAM,iBAAiB,OAAO,KAAK;AAChD,uBAAO,KAAK,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AAAA,cACnE,IACA;AAAA;AAAA,UAER;AAAA,UAED,MAAM,SAAS,cACd;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,EAAE;AAAA,cAC7D,UAAU,CAAC,SAAS,cAAc,IAAI;AAAA,cACtC;AAAA,cACA,WAAW;AAAA,cACX,aACE,SAAS,cACL,QAAQ,cACR,QAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AAAA,cAEnE,aACE,SAAS,cACL,QAAQ,YAAY,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE,IACzE;AAAA,cAEN,cAAc,SAAS;AAAA,cACvB,iBACE,OAAO,SAAS,gBAAgB,aAC5B,OAAO,UAAmB;AACxB,sBAAM,OAAO,MAAM,iBAAiB,OAAO,KAAK;AAChD,uBAAO,KAAK,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AAAA,cACnE,IACA;AAAA,cAEN,mBAAmB,SAAS,qBAAqB;AAAA,cACjD,WAAW,CAAC,MAAM;AAAA,cAClB;AAAA;AAAA,UACF;AAAA,UAED,MAAM,SAAS,cACd,qBAAC,WAAM,WAAU,iDACf;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,UAAU;AAAA,gBACnB,iBAAiB,CAAC,SAAS,SAAS,MAAM,IAAI,SAAS,IAAI;AAAA,gBAC3D,0BAAuB;AAAA,gBACvB;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,UAAK,WAAU,WAAW,gBAAM,OAAM;AAAA,aACzC;AAAA,UAED,MAAM,SAAS,YAAY,CAAC,SAAS,YACpC;AAAA,YAAC;AAAA;AAAA,cAQC,OAAO;AAAA,cACP,eAAe,CAAC,SAAS;AAGvB,oBAAI,CAAC,QAAQ,SAAS,uBAAuB;AAC3C,wBAAM,gBAAgB,MAAM,GAAG,WAAW,KAAK,KAAK,MAAM,GAAG,WAAW,KAAK;AAC7E,2BAAS,MAAM,IAAI,gBAAgB,OAAO,MAAS;AACnD;AAAA,gBACF;AACA,yBAAS,MAAM,IAAI,IAAI;AAAA,cACzB;AAAA,cACA;AAAA,cAEA;AAAA,oCAAC,iBAAc,0BAAuB,IACpC,8BAAC,eAAY,aAAa,EAAE,+BAA+B,QAAG,GAC3D,6BACH,GACF;AAAA,gBACA,qBAAC,iBACE;AAAA,mBAAC,MAAM,YAAY,SAAS,QAAQ,UAAU,MAC7C,oBAAC,cAAW,OAAO,uBAChB,YAAE,+BAA+B,qBAAW,GAC/C;AAAA,kBAED,QACE,OAAO,CAAC,QAAQ,IAAI,UAAU,EAAE,EAChC,IAAI,CAAC,QACJ,oBAAC,cAA2B,OAAO,IAAI,OACpC,cAAI,SADU,IAAI,KAErB,CACD;AAAA,mBACL;AAAA;AAAA;AAAA,YAtCK,GAAG,MAAM,EAAE,IAAI,iBAAiB,IAAI,sBAAsB;AAAA,UAuCjE;AAAA,UAED,MAAM,SAAS,YAAY,SAAS,YAAY,QAAQ,YAAY,QACnE;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,cAClG,UAAU,CAAC,SAAS,SAAS,MAAM,IAAI,IAAI;AAAA,cAC3C,WAAW;AAAA;AAAA,UACb;AAAA,UAED,MAAM,SAAS,YAAY,SAAS,YAAY,QAAQ,YAAY,QACnE,oBAAC,SAAI,WAAU,wBACZ,kBAAQ,IAAI,CAAC,QAAQ;AACpB,kBAAM,MAAM,MAAM,QAAQ,KAAK,IAC3B,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAC/D,CAAC;AACL,kBAAM,UAAU,IAAI,SAAS,IAAI,KAAK;AACtC,mBACE,qBAAC,WAAsB,WAAU,iDAC/B;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,iBAAiB,CAAC,UAAU;AAC1B,0BAAM,OAAO,IAAI,IAAI,GAAG;AACxB,wBAAI,UAAU,MAAM;AAClB,2BAAK,IAAI,IAAI,KAAK;AAAA,oBACpB,OAAO;AACL,2BAAK,OAAO,IAAI,KAAK;AAAA,oBACvB;AACA,6BAAS,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,kBACrC;AAAA,kBACA;AAAA;AAAA,cACF;AAAA,cACA,oBAAC,UAAK,WAAU,WAAW,cAAI,OAAM;AAAA,iBAd3B,IAAI,KAehB;AAAA,UAEJ,CAAC,GACH;AAAA,UAED,MAAM,SAAS,cACd;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,OACE,MAAM,QAAQ,KAAK,IACf,OAAO,MAAM,CAAC,KAAK,EAAE,IACrB,SAAS,OACP,KACA,OAAO,KAAK;AAAA,cAEpB,UAAU,CAAC,aAAa,SAAS,MAAM,IAAI,QAAQ;AAAA,cACnD,WAAW;AAAA;AAAA,UACb;AAAA,UAED,MAAM,SAAS,YACd,gCACG,gBAAM,UAAU;AAAA,YACf,IAAI,MAAM;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC,GACH;AAAA,UAED,MAAM,cACL,qBAAC,SAAI,WAAU,wDACb;AAAA,gCAAC,QAAK,WAAU,+BAA8B;AAAA,YAC9C,oBAAC,SAAK,gBAAM,aAAY;AAAA,aAC1B,IACE;AAAA,UACH,QAAQ,oBAAC,SAAI,WAAU,kCAAkC,iBAAM,IAAS;AAAA;AAAA;AAAA,IAC3E;AAAA,EAEJ;AAAA,EACA,CAAC,MAAM,SACL,KAAK,MAAM,OAAO,KAAK,MAAM,MAC7B,KAAK,MAAM,SAAS,KAAK,MAAM,QAC/B,KAAK,MAAM,UAAU,KAAK,MAAM,SAChC,KAAK,MAAM,gBAAgB,KAAK,MAAM,eACtC,KAAK,MAAM,aAAa,KAAK,MAAM,YACnC,KAAK,iBAAiB,KAAK,gBAC3B,KAAK,UAAU,KAAK,SACpB,KAAK,UAAU,KAAK,SACpB,KAAK,YAAY,KAAK,WACtB,KAAK,qBAAqB,KAAK,oBAC/B,KAAK,cAAc,KAAK,aACxB,KAAK,oBAAoB,KAAK,mBAC9B,KAAK,aAAa,KAAK,YACvB,KAAK,kBAAkB,KAAK,iBAC5B,KAAK,qBAAqB,KAAK,oBAC/B,KAAK,qBAAqB,KAAK,oBAC/B,KAAK,aAAa,KAAK,aACtB,KAAK,MAAM,SAAS,YAClB,KAAK,WAAW,KAAK,UACpB,KAAK,MAAM,cAAe,KAAK,MAA0B;AAC/D;",
|
|
6
6
|
"names": ["normalized", "entityId", "groups", "entityIds", "code", "bucket", "setValue", "provided", "MarkdownEditor", "HtmlRichEditorField", "SimpleMarkdownEditor", "ListboxMultiSelect"]
|
|
7
7
|
}
|