@timeax/digital-service-engine 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/canvas/events.ts","../../src/utils/retry-queue.ts","../../src/react/canvas/comments.ts","../../src/react/canvas/editor.ts","../../src/core/normalise.ts","../../src/core/validate/shared.ts","../../src/core/node-map.ts","../../src/core/visibility.ts","../../src/core/validate/steps/visibility.ts","../../src/core/validate/steps/structure.ts","../../src/core/validate/steps/identity.ts","../../src/core/validate/steps/option-maps.ts","../../src/core/validate/steps/service-vs-input.ts","../../src/core/validate/steps/utility.ts","../../src/utils/index.ts","../../src/utils/util.ts","../../src/core/validate/steps/rates.ts","../../src/core/validate/steps/constraints.ts","../../src/core/validate/steps/custom.ts","../../src/core/validate/steps/global-utility-guard.ts","../../src/core/validate/steps/unbound.ts","../../src/core/validate/steps/fallbacks.ts","../../src/core/validate/policies/collect-service-items.ts","../../src/core/validate/policies/ops.ts","../../src/core/validate/policies/apply-policies.ts","../../src/core/builder.ts","../../src/core/rate-coherence.ts","../../src/core/validate/index.ts","../../src/core/fallback.ts","../../src/core/tag-relations.ts","../../src/core/policy.ts","../../src/core/service-filter.ts","../../src/utils/prune-fallbacks.ts","../../src/utils/build-order-snapshot.ts","../../src/core/fallback-editor.ts","../../src/react/canvas/editor/editor-ids.ts","../../src/react/canvas/editor/editor-duplicate.ts","../../src/react/canvas/editor/editor-notices.ts","../../src/react/canvas/editor/editor-nodes.ts","../../src/react/canvas/editor/editor-utils.ts","../../src/react/canvas/editor/editor-constraints.ts","../../src/react/canvas/editor/editor-field-rules.ts","../../src/react/canvas/editor/editor-relations.ts","../../src/react/canvas/editor/editor-service-filter.ts","../../src/react/canvas/editor/editor-placement.ts","../../src/react/canvas/editor/editor-catalog.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/inputs/form-context.tsx","../../src/react/inputs/registry.ts","../../src/react/inputs/provider.tsx","../../src/react/inputs/wrapper.tsx","../../src/react/hooks/use-order-flow.ts","../../src/react/hooks/order-flow-provider.tsx","../../src/react/hooks/evalute-field-validation.ts","../../src/react/inputs/entries/text.tsx","../../src/react/inputs/entries/shared.ts","../../src/react/inputs/entries/textarea.tsx","../../src/react/inputs/entries/phone.tsx","../../src/react/inputs/entries/toggle-group.tsx","../../src/react/inputs/entries/number.tsx","../../src/react/inputs/entries/password.tsx","../../src/react/inputs/entries/slider.tsx","../../src/react/inputs/entries/toggle.tsx","../../src/react/inputs/entries/treeselect.tsx","../../src/react/inputs/entries/multiselect.tsx","../../src/react/inputs/entries/select.tsx","../../src/react/inputs/entries/radio.tsx","../../src/react/inputs/entries/checkbox.tsx","../../src/react/inputs/entries/chips.tsx","../../src/react/inputs/entries/color.tsx","../../src/react/inputs/entries/date.tsx","../../src/react/inputs/entries/keyvalue.tsx","../../src/react/inputs/entries/editor.tsx","../../src/react/inputs/entries/lister.tsx","../../src/react/inputs/entries/file.tsx","../../src/react/inputs/entries/index.ts","../../src/react/fallback-editor/useFallbackEditor.ts","../../src/react/fallback-editor/FallbackEditorProvider.tsx","../../src/react/fallback-editor/FallbackEditor.tsx","../../src/react/fallback-editor/VirtualServiceList.tsx","../../src/react/fallback-editor/FallbackDetailsPanel.tsx","../../src/react/fallback-editor/FallbackEditorHeader.tsx","../../src/react/fallback-editor/FallbackSettingsPanel.tsx","../../src/react/fallback-editor/FallbackServiceSidebar.tsx","../../src/react/fallback-editor/FallbackRegistrationsPanel.tsx","../../src/react/fallback-editor/FallbackAddCandidatesDialog.tsx","../../src/react/fallback-editor/FallbackAddRegistrationDialog.tsx"],"sourcesContent":["// Lightweight, typed event bus\r\nexport type EventMap = Record<string, unknown>;\r\n\r\nexport class EventBus<E extends EventMap> {\r\n private listeners = new Map<keyof E, Set<(p: any) => void>>();\r\n\r\n on<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const set = this.listeners.get(event) ?? new Set();\r\n set.add(handler as any);\r\n this.listeners.set(event, set);\r\n return () => {\r\n set.delete(handler as any);\r\n };\r\n }\r\n\r\n once<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const off = this.on(event, (p) => {\r\n off();\r\n handler(p);\r\n });\r\n return off;\r\n }\r\n\r\n emit<K extends keyof E>(event: K, payload: E[K]): void {\r\n const set = this.listeners.get(event);\r\n if (!set || set.size === 0) return;\r\n for (const h of Array.from(set)) try {\r\n (h as any)(payload);\r\n } catch { /* swallow */\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}","// noinspection JSIgnoredPromiseFromCall\r\n\r\nexport type RetryStatus = 'scheduled' | 'retrying' | 'succeeded' | 'failed' | 'cancelled';\r\n\r\nexport type RetryOptions = {\r\n enabled?: boolean; // default true\r\n maxAttempts?: number; // default 5\r\n baseDelayMs?: number; // default 800\r\n maxDelayMs?: number; // default 20_000\r\n jitter?: boolean; // default true\r\n /** Run the first attempt immediately (no initial delay) */\r\n immediateFirst?: boolean;\r\n};\r\n\r\nexport type RetryJob = {\r\n /** Stable id for de-duplication (e.g., \"comments:create_thread:loc_abc\") */\r\n id: string;\r\n /** Called on each attempt; return true to signal success, false/throw to retry */\r\n perform: (attempt: number) => Promise<boolean>;\r\n onStatus?: (status: RetryStatus, meta?: { attempt: number; nextDelayMs?: number; error?: unknown }) => void;\r\n};\r\n\r\nexport class RetryQueue {\r\n private readonly opts: Required<RetryOptions>;\r\n private jobs = new Map<string, { job: RetryJob; attempt: number; timer?: any; cancelled?: boolean }>();\r\n private paused = false;\r\n\r\n constructor(opts: RetryOptions = {}) {\r\n this.opts = {\r\n enabled: opts.enabled ?? true,\r\n maxAttempts: opts.maxAttempts ?? 5,\r\n baseDelayMs: opts.baseDelayMs ?? 800,\r\n maxDelayMs: opts.maxDelayMs ?? 20_000,\r\n jitter: opts.jitter ?? true,\r\n immediateFirst: opts.immediateFirst ?? false,\r\n };\r\n }\r\n\r\n pause() {\r\n this.paused = true;\r\n }\r\n\r\n resume() {\r\n this.paused = false;\r\n this.flush();\r\n }\r\n\r\n /** Enqueue or no-op if a job with same id already exists */\r\n enqueue(job: RetryJob): boolean {\r\n if (!this.opts.enabled) return false;\r\n if (this.jobs.has(job.id)) return false;\r\n this.jobs.set(job.id, {job, attempt: 0});\r\n job.onStatus?.('scheduled', {attempt: 0});\r\n this.kick(job.id);\r\n return true;\r\n }\r\n\r\n /** Force retry now (resets backoff); returns false if not found */\r\n triggerNow(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.timer = undefined;\r\n this.kick(id, true);\r\n return true;\r\n }\r\n\r\n cancel(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n return true;\r\n }\r\n\r\n pendingIds(): string[] {\r\n return Array.from(this.jobs.keys());\r\n }\r\n\r\n size(): number {\r\n return this.jobs.size;\r\n }\r\n\r\n isQueued(id: string): boolean {\r\n return this.jobs.has(id);\r\n }\r\n\r\n drain(): void {\r\n for (const [id, rec] of this.jobs.entries()) {\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n }\r\n }\r\n\r\n private flush() {\r\n for (const id of this.jobs.keys()) this.kick(id);\r\n }\r\n\r\n private delayFor(attempt: number): number {\r\n const {baseDelayMs, maxDelayMs, jitter} = this.opts;\r\n const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, Math.max(0, attempt - 1)));\r\n if (!jitter) return exp;\r\n const r = Math.random() * 0.4 + 0.8; // 0.8x .. 1.2x\r\n return Math.min(maxDelayMs, Math.floor(exp * r));\r\n }\r\n\r\n private async kick(id: string, immediate = false) {\r\n const rec = this.jobs.get(id);\r\n if (!rec || rec.cancelled) return;\r\n\r\n if (this.paused && !immediate) return;\r\n\r\n const attempt = rec.attempt + 1;\r\n const run = async () => {\r\n if (rec.cancelled) return;\r\n rec.job.onStatus?.('retrying', {attempt});\r\n try {\r\n const ok = await rec.job.perform(attempt);\r\n if (ok) {\r\n rec.job.onStatus?.('succeeded', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n } catch (err) {\r\n // fallthrough to schedule next\r\n rec.job.onStatus?.('failed', {attempt, error: err});\r\n }\r\n\r\n if (attempt >= this.opts.maxAttempts) {\r\n rec.job.onStatus?.('failed', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n\r\n rec.attempt = attempt;\r\n const delay = this.delayFor(attempt);\r\n rec.job.onStatus?.('scheduled', {attempt, nextDelayMs: delay});\r\n rec.timer = setTimeout(() => this.kick(id), delay);\r\n };\r\n\r\n if (immediate) await run();\r\n else {\r\n // First attempt: respect immediateFirst option; otherwise, schedule immediately\r\n const delay = this.opts.immediateFirst && attempt === 1 ? 0 : this.delayFor(attempt);\r\n\r\n if (delay) {\r\n rec.job.onStatus?.('scheduled', {attempt: 0, nextDelayMs: delay});\r\n rec.timer = setTimeout(run, delay);\r\n } else {\r\n void run();\r\n }\r\n }\r\n }\r\n}","// src/react/canvas/comments.ts\nimport type { EventBus } from \"@/react\";\nimport type { CanvasEvents } from \"@/schema/canvas-types\";\nimport type {\n CommentsBackend,\n BackendError,\n BackendScope,\n} from \"../workspace/context/backend\";\nimport {\n RetryQueue,\n type RetryOptions as RetryOpts,\n} from \"../../utils/retry-queue\";\nimport {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nlet __seq = 0;\nconst newLocalId = (p = \"loc\"): string =>\n `${p}_${Date.now().toString(36)}_${(++__seq).toString(36)}`;\n\ntype SyncState = \"pending\" | \"synced\" | \"error\";\ntype SyncThread = CommentThread & { _sync?: SyncState };\n\ntype CommentsDeps = {\n backend?: CommentsBackend<CommentThread, CommentMessage, CommentAnchor>;\n getScope?: () => BackendScope | undefined;\n retry?: RetryOpts;\n};\n\nexport class CommentsAPI {\n private threads = new Map<ThreadId, SyncThread>();\n private bus: EventBus<CanvasEvents>;\n private deps: CommentsDeps;\n private retry: RetryQueue;\n\n constructor(bus: EventBus<CanvasEvents>, deps: CommentsDeps = {}) {\n this.bus = bus;\n this.deps = deps;\n this.retry = new RetryQueue(deps.retry);\n }\n\n private scope(): BackendScope | undefined {\n return this.deps.getScope?.();\n }\n\n private emitSync(\n op: CanvasEvents[\"comment:sync\"][\"op\"],\n threadId: string,\n messageId: string | undefined,\n status: CanvasEvents[\"comment:sync\"][\"status\"],\n meta: {\n attempt: number;\n nextDelayMs?: number;\n error?: BackendError | unknown;\n },\n ): void {\n this.bus.emit(\"comment:sync\", {\n op,\n threadId,\n messageId,\n status,\n attempt: meta.attempt,\n nextDelayMs: meta.nextDelayMs,\n error: meta.error,\n });\n }\n\n /* ─── Persistence bridge ───────────────────────────── */\n\n async loadAll(): Promise<void> {\n if (!this.deps.backend) return;\n\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend.listThreads(scope);\n\n if (!res.ok) {\n this.bus.emit(\"error\", {\n message: res.error.message,\n code: res.error.code,\n meta: res.error.meta,\n });\n return;\n }\n\n this.threads.clear();\n for (const th of res.value) {\n this.threads.set(th.id, { ...(th as CommentThread), _sync: \"synced\" });\n }\n\n // signal refresh (kept as-is)\n this.bus.emit(\"comment:thread:update\", { thread: undefined as any });\n }\n\n /* ─── Query ─────────────────────────────────────────── */\n\n list(): CommentThread[] {\n return Array.from(this.threads.values())\n .sort((a, b) => a.createdAt - b.createdAt)\n .map((t) => t as CommentThread);\n }\n\n get(id: ThreadId): CommentThread | undefined {\n return this.threads.get(id) as CommentThread | undefined;\n }\n\n /* ─── Mutations (optimistic if backend present) ─────── */\n\n async create(\n anchor: CommentAnchor,\n initialBody: string,\n meta?: Record<string, unknown>,\n ): Promise<ThreadId> {\n const now = Date.now();\n const localId = newLocalId(\"t\");\n const msgId = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const local: SyncThread = {\n id: localId,\n anchor,\n resolved: false,\n createdAt: now,\n updatedAt: now,\n messages: [{ id: msgId, body: initialBody, createdAt: now }],\n meta,\n _sync: hasBackend ? \"pending\" : \"synced\",\n };\n\n this.threads.set(localId, local);\n this.bus.emit(\"comment:thread:create\", { thread: local as any });\n\n if (!this.deps.backend) return localId;\n\n const performOnce = async (): Promise<ThreadId> => {\n const scope = this.scope();\n if (!scope) return localId;\n\n const res = await this.deps.backend!.createThread(scope, {\n anchor,\n body: initialBody,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n // Swap local→server on success (kept behavior)\n this.threads.delete(localId);\n\n const serverTh: SyncThread = {\n ...(res.value as CommentThread),\n _sync: \"synced\",\n };\n\n this.threads.set(serverTh.id, serverTh);\n this.bus.emit(\"comment:thread:update\", { thread: serverTh as any });\n\n return serverTh.id;\n };\n\n try {\n const serverId = await performOnce();\n return serverId;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:create_thread:${branchKey}:${localId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"create_thread\",\n localId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n local._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Create failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: local as any });\n\n return localId;\n }\n }\n\n async reply(\n threadId: ThreadId,\n body: string,\n meta?: Record<string, unknown>,\n ): Promise<CommentId> {\n const th = this.ensure(threadId);\n const now = Date.now();\n const localMid = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const localMsg: CommentMessage = {\n id: localMid,\n body,\n createdAt: now,\n meta,\n };\n\n th.messages.push(localMsg);\n th.updatedAt = now;\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:message:create\", {\n threadId,\n message: localMsg as any,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return localMid;\n\n const performOnce = async (): Promise<CommentId> => {\n const scope = this.scope();\n if (!scope) return localMid;\n\n const res = await this.deps.backend!.addMessage(scope, {\n threadId: th.id,\n body,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n const serverMsg = res.value as CommentMessage;\n const idx = th.messages.findIndex((m) => m.id === localMid);\n if (idx >= 0) th.messages[idx] = serverMsg;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return serverMsg.id;\n };\n\n try {\n const serverMid = await performOnce();\n return serverMid;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:add_message:${branchKey}:${threadId}:${localMid}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"add_message\",\n threadId,\n localMid,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Reply failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return localMid;\n }\n }\n\n async editMessage(\n threadId: ThreadId,\n messageId: CommentId,\n body: string,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const orig = th.messages.find((m) => m.id === messageId);\n if (!orig) return;\n\n const previous = { ...orig };\n orig.body = body;\n orig.editedAt = Date.now();\n th.updatedAt = orig.editedAt;\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.editMessage(scope, {\n threadId: th.id,\n messageId,\n body,\n });\n\n if (!res.ok) throw res.error;\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = res.value as CommentMessage;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:edit_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"edit_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = previous;\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Edit failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteMessage(\n threadId: ThreadId,\n messageId: CommentId,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const backup = [...th.messages];\n\n th.messages = th.messages.filter((m) => m.id !== messageId);\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteMessage(scope, {\n threadId: th.id,\n messageId,\n });\n\n if (!res.ok) throw res.error;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.messages = backup;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async move(threadId: ThreadId, anchor: CommentAnchor): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.anchor;\n\n th.anchor = anchor;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:move\", { thread: th as any });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.moveThread(scope, {\n threadId: th.id,\n anchor,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:move_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"move_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.anchor = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Move failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async resolve(threadId: ThreadId, value = true): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.resolved;\n\n th.resolved = value;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:resolve\", { thread: th as any, resolved: value });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.resolveThread(scope, {\n threadId: th.id,\n resolved: value,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:resolve_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"resolve_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.resolved = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Resolve failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteThread(threadId: ThreadId): Promise<void> {\n const prev = this.threads.get(threadId);\n if (!prev) return;\n\n this.threads.delete(threadId);\n this.bus.emit(\"comment:thread:delete\", { threadId });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteThread(scope, { threadId });\n if (!res.ok) throw res.error;\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n // rollback deletion so user can retry\n this.threads.set(threadId, prev);\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete thread failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: prev as any });\n }\n }\n\n // Optional helpers for UI controls\n retryJob(jobId: string): boolean {\n return this.retry.triggerNow(jobId);\n }\n\n cancelJob(jobId: string): boolean {\n return this.retry.cancel(jobId);\n }\n\n pendingJobs(): string[] {\n return this.retry.pendingIds();\n }\n\n /* ─── internal ────────────────────────────────────────── */\n private ensure(threadId: ThreadId): SyncThread {\n const th = this.threads.get(threadId);\n if (!th) throw new Error(`Comment thread not found: ${threadId}`);\n return th;\n }\n}","import { cloneDeep } from \"lodash-es\";\nimport { Builder, normalise } from \"@/core\";\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n Command,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n FieldValidationRule,\n ServiceIdRef,\n ServiceCatalogState,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport type { PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DuplicateOptions,\n EditorModuleContext,\n FieldRef,\n NodeRef,\n OptionRef,\n QuantityRule,\n ServiceCheck,\n TagRef,\n WireKind,\n} from \"./editor/editor-types\";\nimport { duplicate } from \"./editor/editor-duplicate\";\nimport { addNotice, removeNotice, updateNotice } from \"./editor/editor-notices\";\nimport {\n addField,\n addOption,\n addTag,\n editLabel,\n editName,\n getNode,\n reLabel,\n remove,\n removeField,\n removeOption,\n removeTag,\n setFieldName,\n setService,\n updateField,\n updateOption,\n updateTag,\n} from \"./editor/editor-nodes\";\nimport {\n clearConstraint,\n clearConstraintOverride,\n setConstraint,\n} from \"./editor/editor-constraints\";\nimport {\n clearFieldQuantityRule,\n clearFieldValidation,\n getFieldQuantityRule,\n getFieldValidation,\n setFieldQuantityRule,\n setFieldValidation,\n} from \"./editor/editor-field-rules\";\nimport {\n connect,\n disconnect,\n exclude,\n include,\n} from \"./editor/editor-relations\";\nimport { filterServicesForVisibleGroup } from \"./editor/editor-service-filter\";\nimport { genId, uniqueId, uniqueOptionId } from \"./editor/editor-ids\";\nimport { placeNode, placeOption } from \"./editor/editor-placement\";\nimport {\n addCatalogGroup,\n addSmartCatalogGroup,\n assignServicesToCatalogGroup,\n createEmptyCatalog,\n moveCatalogNode as moveCatalogNodeState,\n removeCatalogNode as removeCatalogNodeState,\n resolveSmartCatalogGroup,\n setActiveCatalogNode as setActiveCatalogNodeState,\n setCatalogExpanded,\n setCatalogViewMode,\n setSelectedCatalogService,\n toggleCatalogExpanded,\n toggleCatalogPinned,\n updateCatalogNode as updateCatalogNodeState,\n} from \"./editor/editor-catalog\";\n\nconst MAX_LIMIT = 100;\n\nexport type { TagRef, FieldRef, OptionRef, NodeRef, DuplicateOptions };\n\nexport class Editor {\n private readonly builder: Builder;\n private readonly api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1;\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n private catalog?: ServiceCatalogState;\n\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n ...opts,\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\n\n isOptionId(id: string) {\n return this.builder.isOptionId(id);\n }\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label);\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\");\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n return duplicate(this.moduleCtx(), ref, opts);\n }\n\n reLabel(id: string, nextLabel: string): void {\n return reLabel(this.moduleCtx(), id, nextLabel);\n }\n\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n return setFieldName(this.moduleCtx(), fieldId, nextName);\n }\n\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n return placeNode(this.moduleCtx(), id, opts);\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n return placeOption(this.moduleCtx(), optionId, opts);\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n return addOption(this.moduleCtx(), fieldId, input);\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n return updateOption(this.moduleCtx(), optionId, patch);\n }\n\n removeOption(optionId: string) {\n return removeOption(this.moduleCtx(), optionId);\n }\n\n editLabel(id: string, label: string): void {\n return editLabel(this.moduleCtx(), id, label);\n }\n\n editName(fieldId: string, name: string | undefined) {\n return editName(this.moduleCtx(), fieldId, name);\n }\n\n setService(\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n ): void {\n return setService(this.moduleCtx(), id, input);\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n return addTag(this.moduleCtx(), partial);\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n return updateTag(this.moduleCtx(), id, patch);\n }\n\n removeTag(id: string) {\n return removeTag(this.moduleCtx(), id);\n }\n\n addNotice(input: Omit<ServicePropsNotice, \"id\"> & { id?: string }): string {\n return addNotice(this.moduleCtx(), input);\n }\n\n updateNotice(id: string, patch: Partial<ServicePropsNotice>): void {\n return updateNotice(this.moduleCtx(), id, patch);\n }\n\n removeNotice(id: string): void {\n return removeNotice(this.moduleCtx(), id);\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n return addField(this.moduleCtx(), partial);\n }\n\n updateField(id: string, patch: Partial<Field>) {\n return updateField(this.moduleCtx(), id, patch);\n }\n\n removeField(id: string) {\n return removeField(this.moduleCtx(), id);\n }\n\n remove(id: string) {\n return remove(this.moduleCtx(), id);\n }\n\n getNode(id: string) {\n return getNode(this.moduleCtx(), id);\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n return getFieldQuantityRule(this.moduleCtx(), id);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n return setFieldQuantityRule(this.moduleCtx(), id, rule);\n }\n\n clearFieldQuantityRule(id: string): void {\n return clearFieldQuantityRule(this.moduleCtx(), id);\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n return include(this.moduleCtx(), receiverId, idOrIds);\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n return exclude(this.moduleCtx(), receiverId, idOrIds);\n }\n\n connect(kind: WireKind, fromId: string, toId: string): void {\n return connect(this.moduleCtx(), kind, fromId, toId);\n }\n\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n return disconnect(this.moduleCtx(), kind, fromId, toId);\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n return setConstraint(this.moduleCtx(), tagId, flag, value);\n }\n\n clearConstraintOverride(tagId: string, flag: string) {\n return clearConstraintOverride(this.moduleCtx(), tagId, flag);\n }\n\n clearConstraint(tagId: string, flag: string) {\n return clearConstraint(this.moduleCtx(), tagId, flag);\n }\n\n getFieldValidation(id: string): FieldValidationRule[] | undefined {\n return getFieldValidation(this.moduleCtx(), id);\n }\n\n setFieldValidation(id: string, rules: unknown): void {\n return setFieldValidation(this.moduleCtx(), id, rules);\n }\n\n clearFieldValidation(id: string): void {\n return clearFieldValidation(this.moduleCtx(), id);\n }\n\n getCatalog(): ServiceCatalogState | undefined {\n return cloneDeep(this.catalog);\n }\n\n setCatalog(next?: ServiceCatalogState): void {\n this.replaceCatalog(next, \"catalog:set\");\n }\n\n clearCatalog(): void {\n this.replaceCatalog(undefined, \"catalog:clear\");\n }\n\n ensureCatalog(): ServiceCatalogState {\n const next = this.catalog\n ? cloneDeep(this.catalog)\n : createEmptyCatalog();\n this.catalog = cloneDeep(next);\n return next;\n }\n\n createCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: CatalogServiceId[];\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-group\");\n return next.activeNodeId!;\n }\n\n createSmartCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addSmartCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-smart-group\");\n return next.activeNodeId!;\n }\n\n updateCatalogNode(\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n ): void {\n this.replaceCatalog(\n updateCatalogNodeState(this.catalog, id, patch),\n \"catalog:update-node\",\n );\n }\n\n removeCatalogNode(id: CatalogId, opts?: { cascade?: boolean }): void {\n this.replaceCatalog(\n removeCatalogNodeState(this.catalog, id, opts),\n \"catalog:remove-node\",\n );\n }\n\n moveCatalogNode(\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n ): void {\n this.replaceCatalog(\n moveCatalogNodeState(this.catalog, nodeId, opts),\n \"catalog:move-node\",\n );\n }\n\n assignServicesToCatalogGroup(\n nodeId: CatalogId,\n serviceIds: CatalogServiceId[],\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n ): void {\n this.replaceCatalog(\n assignServicesToCatalogGroup(\n this.catalog,\n nodeId,\n serviceIds,\n mode,\n ),\n \"catalog:assign-services\",\n );\n }\n\n setActiveCatalogNode(id?: CatalogId): void {\n const next = setActiveCatalogNodeState(this.catalog, id);\n this.catalog = cloneDeep(next);\n\n this.emit(\n \"catalog:active-change\" as any,\n {\n activeNodeId: id,\n } as any,\n );\n\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n reason: \"catalog:set-active\",\n } as any,\n );\n }\n\n setCatalogViewMode(mode: ServiceCatalogState[\"viewMode\"]): void {\n this.replaceCatalog(\n setCatalogViewMode(this.catalog, mode),\n \"catalog:set-view-mode\",\n );\n }\n\n setSelectedCatalogService(serviceId?: CatalogServiceId): void {\n this.replaceCatalog(\n setSelectedCatalogService(this.catalog, serviceId),\n \"catalog:set-selected-service\",\n );\n }\n\n toggleCatalogExpanded(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogExpanded(this.catalog, id),\n \"catalog:toggle-expanded\",\n );\n }\n\n setCatalogExpanded(id: CatalogId, expanded: boolean): void {\n this.replaceCatalog(\n setCatalogExpanded(this.catalog, id, expanded),\n \"catalog:set-expanded\",\n );\n }\n\n toggleCatalogPinned(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogPinned(this.catalog, id),\n \"catalog:toggle-pinned\",\n );\n }\n\n resolveSmartCatalogGroup(\n nodeId: CatalogId,\n candidates: CatalogServiceId[],\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n ): CatalogServiceId[] {\n const next = resolveSmartCatalogGroup(\n this.catalog,\n nodeId,\n candidates,\n matchers,\n );\n\n this.replaceCatalog(next, \"catalog:resolve-smart-group\");\n\n const node = next?.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n return node?.resolvedServiceIds?.slice() ?? [];\n }\n\n private replaceCatalog(\n next: ServiceCatalogState | undefined,\n reason = \"catalog:set\",\n ) {\n this.catalog = cloneDeep(next);\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n snapshot: this.makeSnapshot(reason),\n reason,\n } as any,\n );\n }\n private replaceProps(next: ServiceProps): void {\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return;\n const snap = this.makeSnapshot(command);\n this.pushHistory(snap);\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach) {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"validate\",\n command,\n snapshot: snap,\n });\n } else {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"mutation\",\n command,\n snapshot: snap,\n });\n }\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n snapshot: snap,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n catalog: cloneDeep(this.catalog),\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection) {\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n }\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: s.props, reason, snapshot: s });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n this.api.emit(event as any, payload as any);\n }\n\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n return filterServicesForVisibleGroup(this.moduleCtx(), candidates, ctx);\n }\n\n private moduleCtx(): EditorModuleContext {\n return {\n builder: this.builder,\n api: this.api,\n opts: this.opts,\n getProps: () => this.builder.getProps(),\n isTagId: (id) => this.isTagId(id),\n isFieldId: (id) => this.isFieldId(id),\n isOptionId: (id) => this.isOptionId(id),\n transact: (label, fn) => this.transact(label, fn),\n exec: (cmd) => this.exec(cmd),\n undo: () => this.undo(),\n patchProps: (mut) => this.patchProps(mut),\n replaceProps: (next) => this.replaceProps(next),\n emit: (event, payload) => this.emit(event, payload),\n makeSnapshot: (why) => this.makeSnapshot(why),\n loadSnapshot: (s, reason) => this.loadSnapshot(s, reason),\n getNode: (id) => getNode(this.moduleCtx(), id),\n uniqueId: (base) => uniqueId(this.moduleCtx(), base),\n uniqueOptionId: (fieldId, base) =>\n uniqueOptionId(this.moduleCtx(), fieldId, base),\n genId: (prefix) => genId(this.moduleCtx(), prefix as any),\n setLastPolicyDiagnostics: (value) => {\n this._lastPolicyDiagnostics = value;\n },\n };\n }\n}\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n FieldValidationRule,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\n\nexport type NormaliseOptions = {\n /** default pricing role for fields/options when missing */\n defaultPricingRole?: PricingRole; // default: 'base',\n constraints?: string[];\n};\n\nexport function normalise(\n input: unknown,\n opts: NormaliseOptions = {},\n): ServiceProps {\n const defRole: PricingRole = opts.defaultPricingRole ?? \"base\";\n const constraints = opts.constraints ?? [\"refill\", \"cancel\", \"dripfeed\"];\n const obj = toObject(input);\n\n // ── Canonical top-level keys only\n const rawFilters = Array.isArray((obj as any).filters)\n ? (obj as any).filters\n : [];\n const rawFields = Array.isArray((obj as any).fields)\n ? (obj as any).fields\n : [];\n\n const includes_for_buttons = toStringArrayMap(\n (obj as any).includes_for_buttons,\n );\n const excludes_for_buttons = toStringArrayMap(\n (obj as any).excludes_for_buttons,\n );\n const notices = toNoticeArray((obj as any).notices);\n\n // Tags & fields\n let filters: Tag[] = rawFilters.map((t: any) => coerceTag(t, constraints));\n const fields: Field[] = rawFields.map((f: any) => coerceField(f, defRole));\n\n // ── Ensure a root tag exists (id: 't:root')\n if (!filters.some((t) => t.id === \"t:root\")) {\n filters = [{ id: \"t:root\", label: \"Root\" }, ...filters];\n }\n\n // Canonical fallbacks only\n const fallbacks = coerceFallbacks((obj as any).fallbacks);\n\n const out: ServiceProps = {\n filters,\n fields,\n order_for_tags: (obj as any).order_for_tags,\n ...(isNonEmpty(includes_for_buttons) && { includes_for_buttons }),\n ...(isNonEmpty(excludes_for_buttons) && { excludes_for_buttons }),\n ...(fallbacks &&\n (isNonEmpty(fallbacks.nodes) || isNonEmpty(fallbacks.global)) && {\n fallbacks,\n }),\n ...(notices.length > 0 && { notices }),\n schema_version:\n typeof (obj as any).schema_version === \"string\"\n ? (obj as any).schema_version\n : \"1.0\",\n };\n\n propagateConstraints(out, constraints);\n return out;\n}\n\n/* ───────────────────────── Constraint propagation ───────────────────────── */\n\n/**\n * Propagate constraint flags down the tag tree:\n * - Any flag defined on an ancestor overrides the child's local value.\n * - Writes back the effective value to each tag.constraints.\n * - Records provenance in tag.constraints_origin[flag] = <originTagId>.\n * - Records child overrides in tag.constraints_overrides[flag] = { from, to, origin }.\n *\n * IMPORTANT: Children inherit the **effective** value from their parent,\n * not the parent's raw local. This ensures overridden values keep propagating.\n */\nfunction propagateConstraints(props: ServiceProps, flagKeys: string[]): void {\n const tags = Array.isArray(props.filters) ? props.filters : [];\n if (!tags.length) return;\n\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, Tag[]>();\n\n for (const t of tags) {\n const pid = t.bind_id;\n if (!pid || !byId.has(pid)) continue;\n if (!children.has(pid)) children.set(pid, []);\n children.get(pid)!.push(t);\n }\n\n const roots = tags.filter((t) => !t.bind_id || !byId.has(t.bind_id));\n const starts = roots.length ? roots : tags;\n\n type Inherited = Partial<Record<string, { val: boolean; origin: string }>>;\n const visited = new Set<string>();\n\n const visit = (tag: Tag, inherited: Inherited) => {\n if (visited.has(tag.id)) return;\n visited.add(tag.id);\n\n // If the tag already has overrides, it means it was already normalised once.\n // We should use the 'from' value as our local baseline for this pass\n // so that we don't lose the original local intent.\n const local = cloneDeep(tag.constraints ?? {});\n if (tag.constraints_overrides) {\n for (const [k, over] of Object.entries(tag.constraints_overrides)) {\n if (over) local[k] = over.from;\n }\n }\n\n const next: Partial<Record<string, boolean>> = {};\n const origin: Partial<Record<string, string>> = {};\n const overrides: NonNullable<Tag[\"constraints_overrides\"]> = {};\n\n for (const k of flagKeys) {\n const inh = inherited[k];\n const prev = local[k];\n\n if (inh) {\n if (prev === undefined || prev === inh.val) {\n next[k] = inh.val;\n origin[k] = inh.origin;\n } else {\n next[k] = inh.val;\n origin[k] = inh.origin;\n overrides[k] = {\n from: prev as boolean,\n to: inh.val,\n origin: inh.origin,\n };\n }\n } else if (prev !== undefined) {\n next[k] = prev as boolean;\n origin[k] = tag.id;\n }\n }\n\n tag.constraints = Object.keys(next).length ? next : undefined;\n tag.constraints_origin = Object.keys(origin).length ? origin : undefined;\n tag.constraints_overrides = Object.keys(overrides).length ? overrides : undefined;\n\n const passDown: Inherited = { ...inherited };\n for (const k of flagKeys) {\n if (next[k] !== undefined && origin[k] !== undefined) {\n passDown[k] = { val: next[k] as boolean, origin: origin[k]! };\n }\n }\n for (const c of children.get(tag.id) ?? []) visit(c, passDown);\n };\n\n for (const r of starts) visit(r, {});\n}\n\n/* ───────────────────────────── coercers ───────────────────────────── */\n\nfunction coerceTag(src: any, flagKeys: string[]): Tag {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const bind_id = str(src.bind_id) || (id == \"t:root\" ? undefined : \"t:root\");\n const service_id = toServiceIdOrUndefined(src.service_id);\n\n const includes = toStringArray(src.includes);\n const excludes = toStringArray(src.excludes);\n\n let constraints: Record<string, boolean> | undefined = undefined;\n if (src.constraints && typeof src.constraints === \"object\") {\n constraints = {};\n for (const k of flagKeys) {\n const v = (src.constraints as any)[k];\n if (v !== undefined) {\n constraints[k] = bool(v)!;\n }\n }\n if (Object.keys(constraints).length === 0) {\n constraints = undefined;\n }\n }\n\n const constraints_overrides =\n src.constraints_overrides && typeof src.constraints_overrides === \"object\"\n ? (src.constraints_overrides as Tag[\"constraints_overrides\"])\n : undefined;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const tag: Tag = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(bind_id && { bind_id }),\n ...(service_id !== undefined && { service_id }),\n ...(constraints && { constraints }),\n ...(constraints_overrides && { constraints_overrides }),\n ...(includes.length && { includes: dedupe(includes) }),\n ...(excludes.length && { excludes: dedupe(excludes) }),\n ...(meta && { meta }),\n };\n return tag;\n}\nfunction coerceField(src: any, defRole: PricingRole): Field {\n if (!src || typeof src !== \"object\") src = {};\n\n const bind_id = normaliseBindId(src.bind_id);\n const type = str(src.type) || \"text\";\n const id = str(src.id);\n const name = typeof src.name === \"string\" ? src.name : undefined;\n\n // BaseFieldUI (trimmed)\n const label = str(src.label) || \"\";\n const required = !!src.required;\n\n // host-defined UI schema + defaults (pass-through if objects)\n const ui =\n src.ui && typeof src.ui === \"object\"\n ? (src.ui as Record<string, unknown>)\n : undefined;\n const defaults =\n src.defaults && typeof src.defaults === \"object\"\n ? (src.defaults as Record<string, unknown>)\n : undefined;\n\n // field-level role (used as default for options)\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : defRole;\n\n // options\n const srcHasOptions = Array.isArray(src.options) && src.options.length > 0;\n const options = srcHasOptions\n ? (src.options as any[]).map((o) => coerceOption(o, pricing_role))\n : undefined;\n\n // custom component (only for type === 'custom')\n const component =\n type === \"custom\" ? str(src.component) || undefined : undefined;\n\n // meta (pass-through)\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? { ...(src.meta as any) }\n : undefined;\n\n // button rule:\n // - option-based fields are always buttons\n // - otherwise, respect explicit boolean true\n const button: boolean = srcHasOptions ? true : src.button === true;\n const validation = normalizeFieldValidation(src.validation);\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toServiceIdOrUndefined(src.service_id);\n const field_service_id =\n button &&\n pricing_role !== \"utility\" &&\n field_service_id_raw !== undefined\n ? field_service_id_raw\n : undefined;\n\n const field: Field = {\n id,\n type,\n ...(bind_id !== undefined && { bind_id }),\n ...(name && { name }),\n ...(options && options.length && { options }),\n ...(component && { component }),\n pricing_role,\n label,\n required,\n ...(ui && { ui: ui as any }),\n ...(defaults && { defaults }),\n ...(meta && { meta }),\n ...(validation && { validation }),\n ...(button ? { button } : {}),\n ...(field_service_id !== undefined && { service_id: field_service_id }),\n };\n\n return field;\n}\n\nfunction coerceOption(src: any, inheritRole: PricingRole): FieldOption {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const service_id = toServiceIdOrUndefined(src.service_id);\n const value =\n typeof src.value === \"string\" || typeof src.value === \"number\"\n ? (src.value as string | number)\n : undefined;\n\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : inheritRole;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const option: FieldOption = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(value !== undefined && { value }),\n ...(service_id !== undefined && { service_id }),\n pricing_role,\n ...(meta && { meta }),\n };\n return option;\n}\n\n/* ───────────────────────── fallbacks (canonical only) ───────────────────────── */\n\nfunction coerceFallbacks(src: any): ServiceFallback | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n\n const out: ServiceFallback = {};\n const g = (src as any).global;\n const n = (src as any).nodes;\n\n if (g && typeof g === \"object\") {\n const rg: Record<string, ServiceIdRef[]> = {};\n for (const [k, v] of Object.entries(g)) {\n const key = String(k);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rg[key] = clean;\n }\n if (Object.keys(rg).length) out.global = rg;\n }\n\n if (n && typeof n === \"object\") {\n const rn: Record<string, ServiceIdRef[]> = {};\n for (const [nodeId, v] of Object.entries(n)) {\n const key = String(nodeId);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rn[key] = clean;\n }\n if (Object.keys(rn).length) out.nodes = rn;\n }\n\n return out.nodes || out.global ? out : undefined;\n}\n\n/* ───────────────────────── utilities ───────────────────────── */\n\nfunction toObject(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\")\n return input as Record<string, unknown>;\n throw new TypeError(\"normalise(): expected an object payload\");\n}\n\nfunction normaliseBindId(bind: unknown): string | string[] | undefined {\n if (typeof bind === \"string\" && bind.trim()) return bind.trim();\n if (Array.isArray(bind)) {\n const arr = dedupe(bind.map((b) => String(b).trim()).filter(Boolean));\n if (arr.length === 0) return undefined;\n if (arr.length === 1) return arr[0];\n return arr;\n }\n return undefined;\n}\n\nfunction toStringArrayMap(src: any): Record<string, string[]> | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!k) continue;\n const arr = toStringArray(v);\n if (arr.length) out[k] = dedupe(arr);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction toStringArray(v: any): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x)).filter((s) => !!s && s.trim().length > 0);\n}\n\nfunction toNoticeArray(v: any): ServicePropsNotice[] {\n if (!Array.isArray(v)) return [];\n return v\n .filter((item) => item && typeof item === \"object\")\n .map((item) => cloneDeep(item as ServicePropsNotice));\n}\n\nfunction toServiceIdOrUndefined(v: any): ServiceIdRef | undefined {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? v : undefined;\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n}\n\nfunction str(v: any): string | undefined {\n if (typeof v === \"string\" && v.trim().length > 0) return v.trim();\n return undefined;\n}\n\nfunction bool(v: any): boolean | undefined {\n if (v === undefined) return undefined;\n return !!v;\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nfunction isNonEmpty<T extends Record<string, any> | undefined>(\n obj: T,\n): obj is NonNullable<T> {\n return !!obj && Object.keys(obj).length > 0;\n}\n\nfunction toServiceIdArray(v: any): ServiceIdRef[] {\n if (!Array.isArray(v)) return [];\n return v\n .map((x) =>\n typeof x === \"number\" || typeof x === \"string\" ? x : String(x),\n )\n .filter(\n (x) => x !== \"\" && x !== null && x !== undefined,\n ) as ServiceIdRef[];\n}\n\n\nfunction normalizeFieldValidationRule(\n input: unknown,\n): FieldValidationRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n\n const op = v.op;\n if (\n op !== \"eq\" &&\n op !== \"neq\" &&\n op !== \"gt\" &&\n op !== \"gte\" &&\n op !== \"lt\" &&\n op !== \"lte\" &&\n op !== \"between\" &&\n op !== \"in\" &&\n op !== \"nin\" &&\n op !== \"truthy\" &&\n op !== \"falsy\" &&\n op !== \"match\"\n ) {\n return undefined;\n }\n\n const valueBy =\n v.valueBy === \"value\" || v.valueBy === \"length\" || v.valueBy === \"eval\"\n ? v.valueBy\n : undefined;\n\n const out: FieldValidationRule = {\n op,\n ...(valueBy ? { valueBy } : {}),\n };\n\n if (\"value\" in v) out.value = v.value;\n if (typeof v.min === \"number\" && Number.isFinite(v.min)) out.min = v.min;\n if (typeof v.max === \"number\" && Number.isFinite(v.max)) out.max = v.max;\n if (Array.isArray(v.values)) out.values = [...v.values];\n if (typeof v.pattern === \"string\" && v.pattern.trim()) out.pattern = v.pattern;\n if (typeof v.flags === \"string\") out.flags = v.flags;\n if (typeof v.message === \"string\" && v.message.trim()) out.message = v.message;\n\n if (valueBy === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n\n return out;\n}\n\nexport function normalizeFieldValidation(\n input: unknown,\n): FieldValidationRule[] | undefined {\n if (Array.isArray(input)) {\n const rules = input\n .map(normalizeFieldValidationRule)\n .filter(Boolean) as FieldValidationRule[];\n return rules.length ? rules : undefined;\n }\n\n const one = normalizeFieldValidationRule(input);\n return one ? [one] : undefined;\n}\n","// src/core/validate/shared.ts\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\nimport { NodeMap } from \"@/core/node-map\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly nodeMap: NodeMap;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n selectedKeys: Set<string>;\n\n readonly tags: Tag[];\n readonly fields: Field[];\n invalidRateFieldIds: Set<string>;\n\n readonly tagById: Map<string, Tag>;\n readonly fieldById: Map<string, Field>;\n\n fieldsVisibleUnder: (tagId: string) => Field[];\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function isServiceIdRef(v: unknown): v is import(\"@/schema\").ServiceIdRef {\n return (\n (typeof v === \"string\" && v.trim().length > 0) ||\n (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isServiceIdRef(o.service_id));\n}\n\nexport function isBoundTo(f: Field, tagId: string): boolean {\n const b: string | string[] | undefined = f.bind_id;\n if (!b) return false;\n return Array.isArray(b) ? b.includes(tagId) : b === tagId;\n}\n\nexport function getByPath(obj: unknown, path: string | undefined): unknown {\n if (!path) return undefined;\n\n const parts: string[] = path.split(\".\");\n let cur: any = obj;\n\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n\n return cur;\n}\n\nexport type WhereClause = NonNullable<\n NonNullable<import(\"@/schema/validation\").DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nexport function jsonStable(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nexport function eqValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n return jsonStable(a) === jsonStable(b);\n}\n\nexport function includesValue(\n arr: readonly unknown[],\n needle: unknown,\n): boolean {\n for (const v of arr) {\n if (eqValue(v, needle)) return true;\n }\n return false;\n}\n\nexport function matchesWhere(\n svc: Record<string, unknown>,\n where: readonly WhereClause[] | undefined,\n): boolean {\n if (!where || where.length === 0) return true;\n\n const root: Record<string, unknown> = { service: svc };\n\n for (const clause of where) {\n const path: string = clause.path;\n const op: string = clause.op ?? \"eq\";\n const value: unknown = clause.value;\n\n const cur: unknown = getByPath(root, path);\n\n if (op === \"exists\") {\n if (cur === undefined || cur === null) return false;\n continue;\n }\n if (op === \"truthy\") {\n if (!cur) return false;\n continue;\n }\n if (op === \"falsy\") {\n if (cur) return false;\n continue;\n }\n\n if (op === \"in\" || op === \"nin\") {\n const list: unknown[] = Array.isArray(value) ? value : [];\n const hit: boolean = includesValue(list, cur);\n if (op === \"in\" && !hit) return false;\n if (op === \"nin\" && hit) return false;\n continue;\n }\n\n if (op === \"neq\") {\n if (eqValue(cur, value)) return false;\n continue;\n }\n\n if (op === \"sw\") {\n const s: string = String(cur ?? \"\");\n const prefix: string = String(value ?? \"\");\n if (!s.startsWith(prefix)) return false;\n continue;\n }\n\n // default \"eq\"\n if (!eqValue(cur, value)) return false;\n }\n\n return true;\n}\n\nexport function serviceFlagState(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean | undefined {\n const flags: unknown = (svc as any).flags;\n const entry: unknown =\n flags && typeof flags === \"object\" ? (flags as any)[flagId] : undefined;\n\n const enabled: unknown =\n entry && typeof entry === \"object\" ? (entry as any).enabled : undefined;\n\n if (enabled === true) return true;\n if (enabled === false) return false;\n\n return undefined;\n}\n\nexport function isServiceFlagEnabled(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean {\n return serviceFlagState(svc, flagId) === true;\n}\n\n// src/core/validate/error.ts\nexport function withAffected(\n details: Record<string, unknown> | undefined,\n ids: string[] | undefined,\n): Record<string, unknown> | undefined {\n if (!ids || ids.length <= 1) return details;\n return { ...(details ?? {}), affectedIds: ids };\n}\n","// src/core/node-map.ts\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\";\n\nexport type NodeRef =\n | { kind: \"tag\"; id: string; node: Tag }\n | { kind: \"field\"; id: string; node: Field }\n | {\n kind: \"option\";\n id: string;\n node: FieldOption;\n fieldId: string; // parent field id\n };\n\nexport type NodeMap = Map<string, NodeRef>;\n\n/**\n * Build a node map keyed by *actual ids* (no prefix assumptions).\n * Rule: ids are unique across tags/fields/options.\n *\n * If you ever violate uniqueness, the first wins by default; we can hard-throw if you want.\n */\nexport function buildNodeMap(props: ServiceProps): NodeMap {\n const map: NodeMap = new Map();\n\n for (const t of props.filters ?? []) {\n if (!map.has(t.id)) map.set(t.id, { kind: \"tag\", id: t.id, node: t });\n }\n\n for (const f of props.fields ?? []) {\n if (!map.has(f.id)) map.set(f.id, { kind: \"field\", id: f.id, node: f });\n\n for (const o of f.options ?? []) {\n if (!map.has(o.id))\n map.set(o.id, {\n kind: \"option\",\n id: o.id,\n node: o,\n fieldId: f.id,\n });\n }\n }\n\n return map;\n}\n\n/**\n * Resolve a trigger id into either:\n * - a direct node id (tag/field/option)\n * - or a composite \"fieldId::optionId\" trigger (used for maps)\n *\n * IMPORTANT:\n * - We do NOT strip any prefixes like \"o:\".\n * - \"o:on\" is a perfectly valid *option id* if your data uses it.\n */\nexport type TriggerRef =\n | {\n kind: \"composite\";\n triggerKey: string;\n fieldId: string;\n optionId: string;\n }\n | { kind: NodeKind; triggerKey: string; id: string; fieldId?: string };\n\nexport function resolveTrigger(\n trigger: string,\n nodeMap: NodeMap,\n): TriggerRef | undefined {\n // Composite: fieldId::optionId (maps key by composite)\n const idx = trigger.indexOf(\"::\");\n if (idx !== -1) {\n const fieldId = trigger.slice(0, idx);\n const optionId = trigger.slice(idx + 2);\n return { kind: \"composite\", triggerKey: trigger, fieldId, optionId };\n }\n\n // Direct node id (tag/field/option)\n const direct = nodeMap.get(trigger);\n if (!direct) return undefined;\n\n if (direct.kind === \"option\") {\n return {\n kind: \"option\",\n triggerKey: trigger,\n id: direct.id,\n fieldId: direct.fieldId,\n };\n }\n\n return { kind: direct.kind, triggerKey: trigger, id: direct.id };\n}\n","// src/core/visibility.ts\r\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\r\nimport { buildNodeMap, type NodeMap, resolveTrigger } from \"./node-map\";\r\n\r\nexport type VisibilityOptions = {\r\n selectedKeys?: Set<string>;\r\n};\r\n\r\n/**\r\n * Single source of truth: selection-aware + lineage-aware visible field ids under a tag.\r\n * Returns ordered IDs.\r\n */\r\nexport function visibleFieldIdsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): string[] {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n if (!tag) return [];\r\n\r\n // Build node map (id => {kind,node,...})\r\n const nodeMap: NodeMap = buildNodeMap(props);\r\n\r\n // ---- lineage with depth: self=0, parent=1, grandparent=2 ...\r\n const lineageDepth = new Map<string, number>();\r\n {\r\n const guard = new Set<string>();\r\n let cur: Tag | undefined = tag;\r\n let d = 0;\r\n while (cur && !guard.has(cur.id)) {\r\n lineageDepth.set(cur.id, d++);\r\n guard.add(cur.id);\r\n const parentId: string | undefined = cur.bind_id;\r\n cur = parentId ? tagById.get(parentId) : undefined;\r\n }\r\n }\r\n\r\n const isTagInLineage = (id: string) => lineageDepth.has(id);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n\r\n const ownerDepthForField = (f: Field): number | undefined => {\r\n const b = f.bind_id;\r\n if (!b) return undefined;\r\n\r\n if (typeof b === \"string\") return lineageDepth.get(b);\r\n\r\n let best: number | undefined = undefined;\r\n for (const id of b) {\r\n const d = lineageDepth.get(id);\r\n if (d == null) continue;\r\n if (best == null || d < best) best = d;\r\n }\r\n return best;\r\n };\r\n\r\n const ownerDepthForTriggerKey = (\r\n triggerKey: string,\r\n ): number | undefined => {\r\n const t = resolveTrigger(triggerKey, nodeMap);\r\n if (!t) return undefined;\r\n\r\n // Composite trigger: fieldId::optionId\r\n if (t.kind === \"composite\") {\r\n const f = fieldById.get(t.fieldId);\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Field trigger (button field id)\r\n if (t.kind === \"field\") {\r\n const f = fieldById.get(t.id);\r\n if (!f || f.button !== true) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Option trigger (option id)\r\n if (t.kind === \"option\") {\r\n const f = t.fieldId ? fieldById.get(t.fieldId) : undefined;\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Tag trigger not used as a “button trigger”\r\n return undefined;\r\n };\r\n\r\n // ---- current tag includes/excludes (NOT inherited)\r\n const tagInclude = new Set(tag.includes ?? []);\r\n const tagExclude = new Set(tag.excludes ?? []);\r\n\r\n // ---- selection triggers (buttons + options)\r\n const selected = opts.selectedKeys ?? new Set<string>();\r\n const incMap = props.includes_for_buttons ?? {};\r\n const excMap = props.excludes_for_buttons ?? {};\r\n\r\n // Only apply triggers that belong to (self ∪ ancestors).\r\n // Preserve insertion order from the Set.\r\n const relevantTriggersInOrder: string[] = [];\r\n for (const key of selected) {\r\n const d = ownerDepthForTriggerKey(key);\r\n if (d == null) continue;\r\n relevantTriggersInOrder.push(key);\r\n }\r\n\r\n // ---- base candidates: bound fields inherited + current tag includes\r\n const visible = new Set<string>();\r\n\r\n const isBoundToLineage = (f: Field): boolean => {\r\n const b = f.bind_id;\r\n if (!b) return false;\r\n if (typeof b === \"string\") return isTagInLineage(b);\r\n for (const id of b) if (isTagInLineage(id)) return true;\r\n return false;\r\n };\r\n\r\n for (const f of fields) {\r\n if (isBoundToLineage(f)) visible.add(f.id);\r\n if (tagInclude.has(f.id)) visible.add(f.id);\r\n }\r\n\r\n // apply current tag excludes\r\n for (const id of tagExclude) visible.delete(id);\r\n\r\n // ---- button decisions with precedence:\r\n // closest depth wins; if same depth and conflict => exclude wins\r\n type ButtonDecision = { depth: number; kind: \"include\" | \"exclude\" };\r\n const decide = new Map<string, ButtonDecision>();\r\n\r\n const applyDecision = (fieldId: string, next: ButtonDecision) => {\r\n const prev = decide.get(fieldId);\r\n if (!prev) return void decide.set(fieldId, next);\r\n\r\n if (next.depth < prev.depth) return void decide.set(fieldId, next);\r\n if (next.depth > prev.depth) return;\r\n\r\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\r\n decide.set(fieldId, next);\r\n }\r\n };\r\n\r\n // determinism: revealed order (in trigger order)\r\n const revealedOrder: string[] = [];\r\n const revealedSeen = new Set<string>();\r\n\r\n for (const triggerKey of relevantTriggersInOrder) {\r\n const depth = ownerDepthForTriggerKey(triggerKey);\r\n if (depth == null) continue;\r\n\r\n for (const id of incMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"include\" });\r\n\r\n if (!revealedSeen.has(id)) {\r\n revealedSeen.add(id);\r\n revealedOrder.push(id);\r\n }\r\n }\r\n\r\n for (const id of excMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"exclude\" });\r\n }\r\n }\r\n\r\n // apply button decisions (buttons override tag state)\r\n for (const [fid, d] of decide) {\r\n if (d.kind === \"include\") visible.add(fid);\r\n else visible.delete(fid);\r\n }\r\n\r\n // natural order (props.fields order)\r\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\r\n\r\n // order_for_tags pins first (ordering only)\r\n const order = props.order_for_tags?.[tagId];\r\n if (order && order.length) {\r\n const ordered = order.filter((fid) => visible.has(fid));\r\n const orderedSet = new Set(ordered);\r\n const rest = base.filter((fid) => !orderedSet.has(fid));\r\n return [...ordered, ...rest];\r\n }\r\n\r\n // otherwise: revealed-first (only final-visible)\r\n return base;\r\n}\r\n\r\n/** Convenience: returns ordered Field[] instead of ids. */\r\nexport function visibleFieldsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): Field[] {\r\n const ids = visibleFieldIdsUnder(props, tagId, opts);\r\n const fieldById = new Map((props.fields ?? []).map((f) => [f.id, f]));\r\n return ids.map((id) => fieldById.get(id)).filter(Boolean) as Field[];\r\n}\r\n","// src/core/validate/steps/visibility.ts\n\nimport type { Field, Tag } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { visibleFieldsUnder } from \"@/core/visibility\";\n\n/**\n * v.selectedKeys is a Set<string> (per your note).\n * We keep the validator's \"fieldsVisibleUnder\" hook, but route all visibility\n * through the core visibility engine (single source of truth).\n */\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n return visibleFieldsUnder(v.props, tagId, {\n selectedKeys: v.selectedKeys,\n });\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Simulation-enabled validateVisibility */\n/* -------------------------------------------------------------------------- */\n\nexport type SimulateVisibilityOptions = {\n /**\n * When true, performs an in-depth selection simulation starting from root tag(s),\n * exploring states by selecting one selectable trigger at a time and re-validating.\n */\n simulate?: boolean;\n\n /**\n * Safety valve: max number of unique selection states validated.\n * Default: 500\n */\n maxStates?: number;\n\n /**\n * Safety valve: max depth of added selections from the base context.\n * Default: 6\n */\n maxDepth?: number;\n\n /**\n * If true, simulate starting from each root tag (tags without bind_id).\n * Otherwise, simulate only the first inferred root.\n */\n simulateAllRoots?: boolean;\n\n /**\n * If true, only simulate triggers that exist in includes_for_buttons/excludes_for_buttons\n * (massive branching reduction). Default: true.\n *\n * NOTE: Only enable this if selecting triggers has no other side effects besides\n * includes/excludes visibility effects.\n */\n onlyEffectfulTriggers?: boolean;\n};\n\nfunction stableKeyOfSelection(keys: Set<string>): string {\n return Array.from(keys).sort().join(\"|\");\n}\n\nfunction resolveRootTags(tags: Tag[]): Tag[] {\n const roots = tags.filter((t) => !(t as any).bind_id);\n return roots.length ? roots : tags.slice(0, 1);\n}\n\nfunction isEffectfulTrigger(v: ValidationCtx, trigger: string): boolean {\n const inc = v.props.includes_for_buttons ?? {};\n const exc = v.props.excludes_for_buttons ?? {};\n return (inc[trigger]?.length ?? 0) > 0 || (exc[trigger]?.length ?? 0) > 0;\n}\n\nfunction collectSelectableTriggersInContext(\n v: ValidationCtx,\n tagId: string,\n selectedKeys: Set<string>,\n onlyEffectful: boolean,\n): string[] {\n const visible = visibleFieldsUnder(v.props, tagId, {\n selectedKeys: selectedKeys,\n });\n\n const triggers: string[] = [];\n\n for (const f of visible) {\n // button-field trigger\n if ((f as any).button === true) {\n const t = f.id;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n\n // option triggers (canonical: \"fieldId::optionId\")\n for (const o of f.options ?? []) {\n const t = `${f.id}::${o.id}`;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n }\n\n // deterministic expansion order\n triggers.sort();\n return triggers;\n}\n\n/**\n * The actual visibility rules (your previous validateVisibility body),\n * extracted so we can run it once per simulated selection state.\n */\nfunction runVisibilityRulesOnce(v: ValidationCtx): void {\n // duplicate visible labels (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const seen: Map<string, string> = new Map<string, string>();\n\n for (const f of visible) {\n const label: string = (f.label ?? \"\").trim();\n if (!label) continue;\n\n if (seen.has(label)) {\n const otherId: string | undefined = seen.get(label);\n\n v.errors.push({\n code: \"duplicate_visible_label\",\n severity: \"error\",\n message: `Duplicate visible label \"${label}\" under tag \"${t.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { tagId: t.id, other: otherId, label },\n otherId ? [t.id, f.id, otherId] : [t.id, f.id],\n ),\n });\n } else {\n seen.set(label, f.id);\n }\n }\n }\n\n // Quantity marker rule: at most one marker per visible group (tag) (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const markers: string[] = [];\n\n for (const f of visible) {\n const q: unknown = (f.meta as any)?.quantity;\n if (q) markers.push(f.id);\n }\n\n if (markers.length > 1) {\n v.errors.push({\n code: \"quantity_multiple_markers\",\n severity: \"error\",\n message: `Multiple quantity markers found under tag \"${t.id}\". Only one is allowed per visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, markers }, [\n t.id,\n ...markers,\n ]),\n });\n }\n }\n\n // utility_without_base per visible tag group (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n\n let hasBase: boolean = false;\n let hasUtility: boolean = false;\n const utilityOptionIds: string[] = [];\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const role: string =\n o.pricing_role ?? (f as any).pricing_role ?? \"base\";\n\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") {\n hasUtility = true;\n utilityOptionIds.push(o.id);\n }\n }\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"error\",\n message: `Utility-priced options exist under tag \"${t.id}\" but no base-priced options were found in the same visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, utilityOptionIds }, [\n t.id,\n ...utilityOptionIds,\n ]),\n });\n }\n }\n}\n\n/**\n * De-dup only the errors added during simulation, so output stays stable.\n */\nfunction dedupeErrorsInPlace(v: ValidationCtx, startIndex: number): void {\n const seen = new Set<string>();\n\n const keyOfErr = (e: any) => {\n const tagId = e?.details?.tagId ?? e?.details?.affected?.tagId ?? \"\";\n const other = e?.details?.other ?? \"\";\n return `${e?.code ?? \"\"}::${e?.nodeId ?? \"\"}::${tagId}::${other}::${e?.message ?? \"\"}`;\n };\n\n const kept: any[] = [];\n for (let i = startIndex; i < v.errors.length; i++) {\n const e = v.errors[i];\n const k = keyOfErr(e);\n if (seen.has(k)) continue;\n seen.add(k);\n kept.push(e);\n }\n\n v.errors.splice(startIndex, v.errors.length - startIndex, ...kept);\n}\n\n/**\n * validateVisibility(v, { simulate: true }) will:\n * - Start from the root tag context\n * - Compute visible fields under that root given current selection\n * - Enumerate selectable triggers (button fields + option triggers)\n * - DFS: add one trigger, re-validate, then from that new context add any\n * newly-visible triggers, repeat… until depth/cap limits.\n */\nexport function validateVisibility(\n v: ValidationCtx,\n options: SimulateVisibilityOptions = {},\n): void {\n const simulate = options.simulate === true;\n\n if (!simulate) {\n runVisibilityRulesOnce(v);\n return;\n }\n\n const maxStates = Math.max(1, options.maxStates ?? 500);\n const maxDepth = Math.max(0, options.maxDepth ?? 6);\n const onlyEffectful = options.onlyEffectfulTriggers !== false; // default true\n\n const roots = resolveRootTags(v.tags);\n const rootTags = options.simulateAllRoots ? roots : roots.slice(0, 1);\n\n // snapshot original selection Set\n const originalSelected = new Set(v.selectedKeys ?? []);\n\n // we only dedupe what simulation adds\n const errorsStart = v.errors.length;\n\n // visited pruning by selection signature\n const visited = new Set<string>();\n\n type State = { rootTagId: string; selected: Set<string>; depth: number };\n const stack: State[] = [];\n\n // seed states (one per simulated root)\n for (const rt of rootTags) {\n stack.push({\n rootTagId: rt.id,\n selected: new Set(originalSelected),\n depth: 0,\n });\n }\n\n let validatedStates = 0;\n\n while (stack.length) {\n if (validatedStates >= maxStates) break;\n\n const state = stack.pop()!;\n const sig = stableKeyOfSelection(state.selected);\n\n if (visited.has(sig)) continue;\n visited.add(sig);\n\n // apply selection for this state\n v.selectedKeys = state.selected;\n\n // validate once under this selection context\n validatedStates++;\n runVisibilityRulesOnce(v);\n\n // stop expanding deeper\n if (state.depth >= maxDepth) continue;\n\n // expand next possible triggers based on current visible context\n const triggers = collectSelectableTriggersInContext(\n v,\n state.rootTagId,\n state.selected,\n onlyEffectful,\n );\n\n // DFS, deterministic: push reverse so earlier triggers explored first\n for (let i = triggers.length - 1; i >= 0; i--) {\n const trig = triggers[i]!;\n if (state.selected.has(trig)) continue;\n\n const next = new Set(state.selected);\n next.add(trig);\n\n stack.push({\n rootTagId: state.rootTagId,\n selected: next,\n depth: state.depth + 1,\n });\n }\n }\n\n // restore original selection\n v.selectedKeys = originalSelected;\n\n // dedupe errors from simulation tail\n dedupeErrorsInPlace(v, errorsStart);\n\n // If you want a diagnostic warning when capped, you can add it here.\n // Example (non-breaking): add a \"warning\" severity error.\n // if (validatedStates >= maxStates) { ... }\n}\n","// src/core/validate/steps/structure.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateStructure(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // root present\n if (!tags.some((t) => t.id === \"t:root\")) {\n v.errors.push({\n code: \"root_missing\",\n severity: \"error\",\n message: 'Missing required root tag with id \"root\".',\n });\n }\n\n // cycles in tag parentage\n const visiting: Set<string> = new Set<string>();\n const visited: Set<string> = new Set<string>();\n\n const hasCycleFrom = (id: string): boolean => {\n if (visiting.has(id)) return true;\n if (visited.has(id)) return false;\n\n visiting.add(id);\n\n const parent: string | undefined = v.tagById.get(id)?.bind_id;\n if (parent && v.tagById.has(parent) && hasCycleFrom(parent))\n return true;\n\n visiting.delete(id);\n visited.add(id);\n return false;\n };\n\n for (const t of tags) {\n if (hasCycleFrom(t.id)) {\n v.errors.push({\n code: \"cycle_in_tags\",\n severity: \"error\",\n message: `Cycle detected in tag parentage starting at tag \"${t.id}\".`,\n nodeId: t.id,\n details: { tagId: t.id },\n });\n break;\n }\n }\n\n // tag.bind_id must point to existing tag (if present)\n for (const t of tags) {\n if (t.bind_id && !v.tagById.has(t.bind_id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Tag \"${t.id}\" binds to missing parent tag \"${t.bind_id}\".`,\n nodeId: t.id,\n details: withAffected({ ref: t.bind_id }, [t.id]),\n });\n }\n }\n\n // field.bind_id must reference tags\n for (const f of fields) {\n const b = f.bind_id;\n\n if (Array.isArray(b)) {\n for (const id of b) {\n if (!v.tagById.has(id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${id}\".`,\n nodeId: f.id,\n details: withAffected({ ref: id }, [f.id]),\n });\n }\n }\n } else if (typeof b === \"string\") {\n if (!v.tagById.has(b)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${b}\".`,\n nodeId: f.id,\n details: withAffected({ ref: b }, [f.id]),\n });\n }\n }\n }\n\n void isFiniteNumber; // keeps parity if you had helper usage in the original file\n}\n","// src/core/validate/steps/identity.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption, withAffected } from \"../shared\";\n\nexport function validateIdentity(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // duplicate ids across tags + fields\n {\n const firstSeen: Map<string, string> = new Map<string, string>(); // id -> first kind (\"tag\"|\"field\")\n const seen: Set<string> = new Set<string>();\n\n for (const t of tags) {\n if (seen.has(t.id)) {\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${t.id}\" found (tag).`,\n nodeId: t.id,\n // we only know the id itself; no other id to point at\n });\n } else {\n seen.add(t.id);\n firstSeen.set(t.id, \"tag\");\n }\n }\n\n for (const f of fields) {\n if (seen.has(f.id)) {\n const kind: string = firstSeen.get(f.id) ?? \"tag/field\";\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${f.id}\" found (field) — already used by a ${kind}.`,\n nodeId: f.id,\n });\n } else {\n seen.add(f.id);\n firstSeen.set(f.id, \"field\");\n }\n }\n }\n\n // tag labels unique + required\n {\n const seen: Map<string, string> = new Map<string, string>(); // label -> tagId\n\n for (const t of tags) {\n if (!t.label || !t.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Tag \"${t.id}\" is missing a label.`,\n nodeId: t.id,\n details: { kind: \"tag\" },\n });\n continue;\n }\n\n const k: string = t.label;\n\n if (seen.has(k)) {\n const otherId: string | undefined = seen.get(k);\n v.errors.push({\n code: \"duplicate_tag_label\",\n severity: \"error\",\n message: `Duplicate tag label \"${k}\" found on tag \"${t.id}\".`,\n nodeId: t.id,\n details: withAffected(\n { other: otherId, label: k },\n otherId ? [t.id, otherId] : undefined,\n ),\n });\n } else {\n seen.set(k, t.id);\n }\n }\n }\n\n // field labels required; names unique among user-input fields\n {\n const seenNames: Map<string, string> = new Map<string, string>(); // name -> fieldId\n\n for (const f of fields) {\n if (!f.label || !f.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Field \"${f.id}\" is missing a label.`,\n nodeId: f.id,\n details: { kind: \"field\" },\n });\n }\n\n const isUserInput: boolean = !!f.name && !hasAnyServiceOption(f);\n\n if (isUserInput && f.name) {\n const k: string = f.name;\n\n if (seenNames.has(k)) {\n const otherId: string | undefined = seenNames.get(k);\n v.errors.push({\n code: \"duplicate_field_name\",\n severity: \"error\",\n message: `Duplicate field name \"${k}\" found on field \"${f.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { other: otherId, name: k },\n otherId ? [f.id, otherId] : undefined,\n ),\n });\n } else {\n seenNames.set(k, f.id);\n }\n }\n }\n }\n\n // option labels required\n for (const f of fields) {\n for (const o of f.options ?? []) {\n if (!o.label || !o.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Option \"${o.id}\" (field \"${f.id}\") is missing a label.`,\n nodeId: o.id,\n details: { kind: \"option\", fieldId: f.id },\n });\n }\n }\n }\n}\n","// src/core/validate/steps/option-maps.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\ntype ParsedFallback = { fieldId: string; optionId: string };\n\n/** Fallback parser for legacy \"fieldId::optionId\" keys */\nfunction parseFieldOptionKey(key: string): ParsedFallback | null {\n const idx = key.indexOf(\"::\");\n if (idx === -1) return null;\n\n const fieldId = key.slice(0, idx).trim();\n const optionId = key.slice(idx + 2).trim();\n\n if (!fieldId || !optionId) return null;\n return { fieldId, optionId };\n}\n\nfunction hasOption(v: ValidationCtx, fid: string, oid: string): boolean {\n const f = v.fieldById.get(fid);\n if (!f) return false;\n return !!(f.options ?? []).find((o) => o.id === oid);\n}\n\nexport function validateOptionMaps(v: ValidationCtx): void {\n const incMap: Record<string, string[]> = v.props.includes_for_buttons ?? {};\n const excMap: Record<string, string[]> = v.props.excludes_for_buttons ?? {};\n\n const badKeyMessage = (key: string): string =>\n `Invalid trigger-map key \"${key}\". Expected a known node id (option or button-field), or \"fieldId::optionId\" pointing to an existing option.`;\n\n /**\n * Valid trigger keys:\n * - nodeMap has key:\n * - kind:\"option\" => ok\n * - kind:\"field\" => ok only if field.button === true\n * - kind:\"tag\" => invalid\n * - else fallback: \"fieldId::optionId\" must point to an existing option under that field\n */\n const validateTriggerKey = (\n key: string,\n ): {\n ok: boolean;\n nodeId?: string; // for error anchoring\n affected?: string[]; // for withAffected\n } => {\n const ref = v.nodeMap.get(key);\n\n if (ref) {\n if (ref.kind === \"option\") {\n // option trigger id is ref.id (key), and we know its parent field\n return {\n ok: true,\n nodeId: ref.fieldId,\n affected: [ref.fieldId, ref.id],\n };\n }\n\n if (ref.kind === \"field\") {\n const isButton = (ref.node as any).button === true;\n if (!isButton)\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n return { ok: true, nodeId: ref.id, affected: [ref.id] };\n }\n\n // tags cannot be triggers\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n }\n\n // fallback: fieldId::optionId\n const p = parseFieldOptionKey(key);\n if (!p) return { ok: false };\n\n if (!hasOption(v, p.fieldId, p.optionId))\n return {\n ok: false,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n\n return {\n ok: true,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n };\n\n // bad_option_key (keeping the code name for compatibility)\n for (const k of Object.keys(incMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n for (const k of Object.keys(excMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n // option_include_exclude_conflict: SAME RAW KEY in both maps\n for (const k of Object.keys(incMap)) {\n if (!(k in excMap)) continue;\n\n const r = validateTriggerKey(k);\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Trigger-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n}\n","// src/core/validate/steps/service-vs-input.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption } from \"../shared\";\n\nexport function validateServiceVsUserInput(v: ValidationCtx): void {\n for (const f of v.fields) {\n const anySvc: boolean = hasAnyServiceOption(f);\n const hasName: boolean = !!(f.name && f.name.trim());\n\n if (f.type === \"custom\" && anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" cannot map service options.`,\n nodeId: f.id,\n details: { reason: \"custom_cannot_map_service\" },\n });\n }\n\n if (!hasName) {\n // treated as service-backed → require at least one service option\n if (!anySvc) {\n v.errors.push({\n code: \"service_field_missing_service_id\",\n severity: \"error\",\n message: `Service-backed field \"${f.id}\" has no \"name\" and must provide at least one option with a service_id.`,\n nodeId: f.id,\n });\n }\n } else {\n // user-input → options must not carry service_id\n if (anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `User-input field \"${f.id}\" has a name and must not include any options with service_id.`,\n nodeId: f.id,\n });\n }\n }\n }\n}\n","// src/core/validate/steps/utility.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, isServiceIdRef, withAffected } from \"../shared\";\n\nexport function validateUtilityMarkers(v: ValidationCtx): void {\n const ALLOWED_UTILITY_MODES: Set<string> = new Set<string>([\n \"flat\",\n \"per_quantity\",\n \"per_value\",\n \"percent\",\n ]);\n\n // option-level\n for (const f of v.fields) {\n const optsArr = Array.isArray(f.options) ? f.options : [];\n for (const o of optsArr) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n const hasService: boolean = isServiceIdRef(o.service_id);\n const util: unknown = (o.meta as any)?.utility;\n\n if (role === \"utility\" && hasService) {\n v.errors.push({\n code: \"utility_with_service_id\",\n severity: \"error\",\n message: `Utility-priced option \"${o.id}\" (field \"${f.id}\") must not reference a service_id.`,\n nodeId: o.id,\n details: withAffected(\n {\n fieldId: f.id,\n optionId: o.id,\n service_id: o.service_id,\n },\n [f.id, o.id],\n ),\n });\n }\n\n if (util) {\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") is missing a valid rate.`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id },\n [f.id, o.id],\n ),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id, mode },\n [f.id, o.id],\n ),\n });\n }\n }\n }\n }\n\n // field-level\n for (const f of v.fields) {\n const util: unknown = (f.meta as any)?.utility;\n if (!util) continue;\n\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" is missing a valid rate.`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id }, [f.id]),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id, mode }, [f.id]),\n });\n }\n }\n}\n","import { Field } from \"@/schema\";\n\n/**\n * Heuristic: multi-select if type hints ('multiselect'|'checkbox') or meta.multi === true.\n * Hosts can rely on meta.multi if using custom type strings.\n */\nexport function isMultiField(f: Field): boolean {\n const t = (f.type || \"\").toLowerCase();\n const metaMulti = !!f.meta?.multi;\n return t === \"multiselect\" || t === \"checkbox\" || metaMulti;\n}\n","import type {\n DgpServiceCapability,\n DgpServiceMap,\n ServiceIdRef,\n} from \"@/schema\";\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\n): boolean {\n const cap = getServiceCapability(svcMap, candidate);\n if (!cap) return false;\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\n\nexport function getServiceCapability(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef | undefined,\n): DgpServiceCapability | undefined {\n if (candidate === undefined || candidate === null) return undefined;\n\n const direct = (svcMap as any)[candidate] as DgpServiceCapability | undefined;\n if (direct) return direct;\n\n const byString = (svcMap as any)[String(candidate)] as\n | DgpServiceCapability\n | undefined;\n if (byString) return byString;\n\n if (typeof candidate === \"string\") {\n const maybeNumber = Number(candidate);\n if (Number.isFinite(maybeNumber)) {\n return (svcMap as any)[maybeNumber] as DgpServiceCapability | undefined;\n }\n }\n\n return undefined;\n}\n\nexport function normalizeRatePolicy(policy: RatePolicy | undefined): RatePolicy {\n if (!policy) return { kind: \"lte_primary\", pct: 5 };\n if (policy.kind === \"eq_primary\") return policy;\n const pct = Math.max(0, Number(policy.pct ?? 0));\n return { ...policy, pct };\n}\n\nexport function passesRatePolicy(\n policy: RatePolicy | undefined,\n primaryRate: number,\n candidateRate: number,\n): boolean {\n if (!Number.isFinite(primaryRate) || !Number.isFinite(candidateRate)) {\n return false;\n }\n\n const rp = normalizeRatePolicy(policy);\n switch (rp.kind) {\n case \"eq_primary\":\n return candidateRate === primaryRate;\n case \"lte_primary\": {\n const floor = primaryRate * (1 - rp.pct / 100);\n return candidateRate <= primaryRate && candidateRate >= floor;\n }\n case \"within_pct\":\n return candidateRate <= primaryRate * (1 + rp.pct / 100);\n case \"at_least_pct_lower\":\n return candidateRate <= primaryRate * (1 - rp.pct / 100);\n }\n}\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n primary: ServiceIdRef,\n policy: FallbackSettings,\n): boolean {\n const cand = getServiceCapability(svcMap, candidate);\n const prim = getServiceCapability(svcMap, primary);\n if (!cand || !prim) return false;\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n return passesRatePolicy(policy.ratePolicy, pRate, cRate);\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\nexport function validateRates(v: ValidationCtx): void {\n const ratePolicy = normalizeRatePolicy(\n v.options.fallbackSettings?.ratePolicy,\n );\n\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Array<{ optionId: string; serviceId: string; rate: number }> =\n [];\n\n for (const o of f.options ?? []) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role !== \"base\") continue;\n\n const sid: unknown = o.service_id;\n if (!isServiceIdRef(sid)) continue;\n\n const cap = getServiceCapability(v.serviceMap, sid);\n const rate = cap?.rate;\n if (typeof rate === \"number\" && Number.isFinite(rate)) {\n baseRates.push({\n optionId: o.id,\n serviceId: String(sid),\n rate,\n });\n }\n }\n\n if (baseRates.length <= 1) continue;\n\n const primary = baseRates.reduce((best, current) =>\n current.rate > best.rate ? current : best,\n );\n\n const offenders = baseRates.filter(\n (candidate) =>\n candidate.optionId !== primary.optionId &&\n !passesRatePolicy(ratePolicy, primary.rate, candidate.rate),\n );\n\n if (offenders.length > 0) {\n v.invalidRateFieldIds.add(f.id);\n const affectedIds: string[] = [\n f.id,\n ...baseRates.map((entry) => entry.optionId),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" violate rate policy \"${ratePolicy.kind}\".`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n primaryOptionId: primary.optionId,\n primaryRate: primary.rate,\n rates: baseRates.map((entry) => entry.rate),\n optionIds: baseRates.map((entry) => entry.optionId),\n offenderOptionIds: offenders.map((entry) => entry.optionId),\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/constraints.ts\nimport type { ValidationCtx } from \"../shared\";\nimport {\n isServiceIdRef,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\nimport { getServiceCapability } from \"@/utils/util\";\n\ntype ConstraintBag = Record<string, boolean | undefined>;\n\nfunction constraintKeysInChain(v: ValidationCtx, tagId: string): string[] {\n const keys: string[] = [];\n const seenKeys: Set<string> = new Set<string>();\n\n let cur: string | undefined = tagId;\n const seenTags: Set<string> = new Set<string>();\n\n while (cur && !seenTags.has(cur)) {\n seenTags.add(cur);\n\n const t = v.tagById.get(cur);\n const c: unknown = t?.constraints;\n\n if (c && typeof c === \"object\") {\n for (const k of Object.keys(c as any)) {\n if (!seenKeys.has(k)) {\n seenKeys.add(k);\n keys.push(k);\n }\n }\n }\n\n cur = t?.bind_id;\n }\n\n return keys;\n}\n\nfunction effectiveConstraints(v: ValidationCtx, tagId: string): ConstraintBag {\n const out: ConstraintBag = {};\n const keys: string[] = constraintKeysInChain(v, tagId);\n\n for (const key of keys) {\n let cur: string | undefined = tagId;\n const seen: Set<string> = new Set<string>();\n\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n\n const t = v.tagById.get(cur);\n const val: unknown = (t?.constraints as any)?.[key];\n\n if (val === true || val === false) {\n out[key] = val;\n break;\n }\n\n cur = t?.bind_id;\n }\n }\n\n return out;\n}\n\nexport function validateConstraints(v: ValidationCtx): void {\n // Enforce tag constraints on visible options' services\n for (const t of v.tags) {\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n const hasAnyRequired: boolean = Object.values(eff).some(\n (x) => x === true,\n );\n if (!hasAnyRequired) continue;\n\n const visible = v.fieldsVisibleUnder(t.id);\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, o.service_id);\n if (!svc || typeof svc !== \"object\") continue;\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Service option \"${o.id}\" under tag \"${t.id}\" does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: withAffected(\n {\n flag: k,\n serviceId: o.service_id,\n fieldId: f.id,\n optionId: o.id,\n },\n [t.id, f.id, o.id],\n ),\n });\n }\n }\n }\n }\n }\n\n // Unsupported constraint vs tag's mapped service capabilities\n for (const t of v.tags) {\n const sid: unknown = t.service_id;\n if (!isServiceIdRef(sid)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, sid);\n if (!svc || typeof svc !== \"object\") continue;\n\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Tag \"${t.id}\" maps to service \"${String(\n sid,\n )}\" which does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: { flag: k, serviceId: sid },\n });\n }\n }\n }\n\n // constraint_overridden diagnostics\n for (const t of v.tags) {\n const ov: unknown = t.constraints_overrides;\n if (!ov || typeof ov !== \"object\") continue;\n\n for (const k of Object.keys(ov as Record<string, unknown>)) {\n const row: any = (ov as any)[k];\n if (!row) continue;\n\n const from: boolean = row.from === true;\n const to: boolean = row.to === true;\n const origin: string = String(row.origin ?? \"\");\n\n v.errors.push({\n code: \"constraint_overridden\",\n severity: \"warning\",\n message: origin\n ? `Constraint \"${k}\" on tag \"${t.id}\" was overridden by ancestor \"${origin}\" (${String(from)} → ${String(\n to,\n )}).`\n : `Constraint \"${k}\" on tag \"${t.id}\" was overridden by an ancestor (${String(from)} → ${String(to)}).`,\n nodeId: t.id,\n details: withAffected(\n { flag: k, from, to, origin },\n origin ? [t.id, origin] : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/custom.ts\nimport type { ValidationCtx } from \"../shared\";\n\nexport function validateCustomFields(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (f.type !== \"custom\") continue;\n\n if (!f.component || !String(f.component).trim()) {\n v.errors.push({\n code: \"custom_component_missing\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" is missing a valid component reference.`,\n nodeId: f.id,\n });\n }\n }\n}\n","// src/core/validate/steps/global-utility-guard.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef } from \"../shared\";\n\nexport function validateGlobalUtilityGuard(v: ValidationCtx): void {\n if (!v.options.globalUtilityGuard) return;\n\n let hasUtility: boolean = false;\n let hasBase: boolean = false;\n\n for (const f of v.fields) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") hasUtility = true;\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"warning\",\n message:\n \"Global utility guard: utility-priced options exist but no base-priced options were found.\",\n nodeId: \"global\",\n details: { scope: \"global\" },\n });\n }\n}\n","// src/core/validate/steps/unbound.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\nexport function validateUnboundFields(v: ValidationCtx): void {\n const boundFieldIds: Set<string> = new Set<string>();\n\n for (const f of v.fields) {\n if (f.bind_id) boundFieldIds.add(f.id);\n }\n\n const includedByTag: Set<string> = new Set<string>();\n for (const t of v.tags) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n }\n\n const includedByOption: Set<string> = new Set<string>();\n for (const arr of Object.values(v.props.includes_for_buttons ?? {})) {\n for (const id of arr ?? []) includedByOption.add(id);\n }\n\n for (const f of v.fields) {\n if (\n !boundFieldIds.has(f.id) &&\n !includedByTag.has(f.id) &&\n !includedByOption.has(f.id)\n ) {\n v.errors.push({\n code: \"field_unbound\",\n severity: \"error\",\n message: `Field \"${f.id}\" is unbound: it is not bound to any tag and not included by tags or option maps.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n bound: false,\n // exposing these helps editors explain \"why\"\n includedByTag: includedByTag.has(f.id),\n includedByOption: includedByOption.has(f.id),\n },\n [f.id],\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/fallbacks.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { collectFailedFallbacks } from \"@/core\";\n\nfunction codeForReason(\n reason: string,\n):\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\" {\n switch (reason) {\n case \"unknown_service\":\n return \"fallback_unknown_service\";\n case \"no_primary\":\n return \"fallback_no_primary\";\n case \"rate_violation\":\n return \"fallback_rate_violation\";\n case \"constraint_mismatch\":\n return \"fallback_constraint_mismatch\";\n case \"cycle\":\n return \"fallback_cycle\";\n default:\n return \"fallback_bad_node\";\n }\n}\n\nfunction messageFor(\n code:\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\",\n d: {\n nodeId?: string;\n primary?: unknown;\n candidate?: unknown;\n tagContext?: unknown;\n scope?: unknown;\n },\n): string {\n const n = d.nodeId ? `node \"${String(d.nodeId)}\"` : \"node\";\n switch (code) {\n case \"fallback_unknown_service\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" is unknown for ${n}.`;\n case \"fallback_no_primary\":\n return `Fallback rule has no primary service for ${n}.`;\n case \"fallback_rate_violation\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" violates the base-rate rules for ${n}.`;\n case \"fallback_constraint_mismatch\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" does not satisfy required constraints for ${n}.`;\n case \"fallback_cycle\":\n return `Fallback rules contain a cycle for ${n}.`;\n default:\n return `Fallback rule is invalid for ${n}.`;\n }\n}\n\nexport function validateFallbacks(v: ValidationCtx): void {\n const mode: string = v.options.fallbackSettings?.mode ?? \"strict\";\n if (!v.props.fallbacks) return;\n\n // collect non-fatal diagnostics first\n const diags = collectFailedFallbacks(v.props, v.options.serviceMap ?? {}, {\n ...v.options.fallbackSettings,\n mode: \"dev\",\n });\n\n if (mode !== \"strict\") return;\n\n for (const d of diags) {\n if (d.scope === \"global\") continue;\n\n const code = codeForReason(\n String((d as any).reason ?? \"fallback_bad_node\"),\n );\n\n const nodeId: string | undefined = (d as any).nodeId\n ? String((d as any).nodeId)\n : undefined;\n\n // Best-effort affected ids:\n // - Always include nodeId (if present)\n // - Include tagContext if it looks like a tag id (string)\n const tagContext: unknown = (d as any).tagContext;\n const affectedIds: string[] = [];\n if (nodeId) affectedIds.push(nodeId);\n if (\n typeof tagContext === \"string\" &&\n tagContext &&\n tagContext !== nodeId\n )\n affectedIds.push(tagContext);\n\n v.errors.push({\n code,\n severity: \"error\",\n message: messageFor(code, {\n nodeId,\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n }),\n nodeId,\n details: withAffected(\n {\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n}\n","// src/core/validate/policies/collect-service-items.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n IdType,\n} from \"@/schema/provider\";\nimport type { DynamicRule } from \"@/schema/validation\";\n\nimport { matchesWhere } from \"../shared\";\n\nexport type ServiceItem = Readonly<{\n /** Scope tag context (only meaningful for visible_group / tag-filtered global) */\n tagId?: string;\n\n /** Reference metadata (used for affectedIds + debugging) */\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n /** Canonical service id reference */\n serviceId: IdType;\n\n /** Pricing role context */\n role: \"base\" | \"utility\";\n\n /** Projection target (always present with at least { id }) */\n service: Record<string, unknown>;\n\n /** Aggregated affected ids (node/service refs that contributed to this item) */\n affectedIds: string[];\n}>;\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\ntype CollectMode = \"global\" | \"visible_group\";\n\nexport type CollectServiceItemsArgs = Readonly<{\n mode: CollectMode;\n\n props: ServiceProps;\n serviceMap: DgpServiceMap;\n\n /** For global: pass all tags, and usually props.fields */\n tags?: readonly Tag[];\n fields?: readonly Field[];\n\n /** For visible_group */\n tag?: Tag;\n tagId?: string;\n\n /** Host-defined filter surface */\n filter?: DynamicRule[\"filter\"];\n\n /**\n * visible_group fallbacks:\n * - include node-scoped fallbacks for these node ids (tag.id, option.id, etc.)\n */\n visibleNodeIds?: readonly string[];\n\n /**\n * visible_group fallbacks:\n * - include global fallbacks for these primary ids (services in the group)\n */\n visiblePrimaries?: readonly IdType[];\n}>;\n\nfunction asArray<T>(v: T | readonly T[] | undefined): readonly T[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v as any];\n}\n\nfunction isServiceIdRef(v: unknown): v is IdType {\n return (\n typeof v === \"string\" || (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nfunction svcSnapshot(\n serviceMap: DgpServiceMap,\n sid: IdType,\n): Record<string, unknown> {\n const svc: DgpServiceCapability | undefined = (serviceMap as any)[sid];\n if (!svc) return { id: sid };\n\n const meta: Record<string, unknown> =\n svc.meta && typeof svc.meta === \"object\" ? (svc.meta as any) : {};\n\n return {\n ...svc,\n id: sid,\n ...meta,\n } as unknown as Record<string, unknown>;\n}\n\nfunction pushItem(\n out: Map<string, ServiceItem>,\n next: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n serviceId: IdType;\n role: \"base\" | \"utility\";\n affectedIds: readonly string[];\n service: Record<string, unknown>;\n }>,\n): void {\n // dedupe by (serviceId, role) to preserve role semantics\n const key: string = `${String(next.serviceId)}|${next.role}`;\n\n const existing: ServiceItem | undefined = out.get(key);\n if (!existing) {\n out.set(key, {\n tagId: next.tagId,\n fieldId: next.fieldId,\n optionId: next.optionId,\n nodeId: next.nodeId,\n serviceId: next.serviceId,\n role: next.role,\n service: next.service,\n affectedIds: Array.from(new Set(next.affectedIds)),\n });\n return;\n }\n\n const mergedIds: string[] = Array.from(\n new Set<string>([...existing.affectedIds, ...next.affectedIds]),\n );\n\n // Prefer preserving an existing tagId if present; otherwise use new\n out.set(key, {\n ...existing,\n tagId: existing.tagId ?? next.tagId,\n affectedIds: mergedIds,\n });\n}\n\nfunction fieldRoleOf(\n f: Field,\n o?: { pricing_role?: string | undefined },\n): \"base\" | \"utility\" {\n const roleRaw: string | undefined =\n (o?.pricing_role as any) ?? (f.pricing_role as any) ?? \"base\";\n return roleRaw === \"utility\" ? \"utility\" : \"base\";\n}\n\nfunction applyFilterAllowLists(\n tagId: string | undefined,\n fieldId: string | undefined,\n filter: DynamicRule[\"filter\"] | undefined,\n): boolean {\n const tagAllow: readonly string[] | undefined = asArray(filter?.tag_id);\n const fieldAllow: readonly string[] | undefined = asArray(filter?.field_id);\n\n if (tagAllow) {\n if (!tagId) return false;\n if (!tagAllow.includes(tagId)) return false;\n }\n\n if (fieldAllow) {\n if (!fieldId) return false;\n if (!fieldAllow.includes(fieldId)) return false;\n }\n\n return true;\n}\n\nexport function collectServiceItems(\n args: CollectServiceItemsArgs,\n): ServiceItem[] {\n const filter: DynamicRule[\"filter\"] | undefined = args.filter;\n const roleFilter: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n (filter?.role as any) ?? \"both\";\n const where: readonly WhereClause[] | undefined = filter?.where;\n\n const out: Map<string, ServiceItem> = new Map<string, ServiceItem>();\n\n const addServiceRef = (\n ref: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n serviceId: IdType;\n role: \"base\" | \"utility\";\n\n affectedIds: readonly string[];\n }>,\n ): void => {\n if (roleFilter !== \"both\" && ref.role !== roleFilter) return;\n if (!applyFilterAllowLists(ref.tagId, ref.fieldId, filter)) return;\n\n const svc: DgpServiceCapability | undefined = (args.serviceMap as any)[\n ref.serviceId\n ];\n\n // IMPORTANT (per your 1:A): unknown services are INCLUDED; where-filter only applies when svc exists.\n if (where && svc && !matchesWhere(svc as any, where)) return;\n\n pushItem(out, {\n ...ref,\n service: svcSnapshot(args.serviceMap, ref.serviceId),\n });\n };\n\n // ────────────────────────────────────────────────────────────────\n // 1) TAG SERVICES (tag.service_id)\n // ────────────────────────────────────────────────────────────────\n if (args.mode === \"global\") {\n for (const t of args.tags ?? []) {\n const sid: unknown = (t as any).service_id;\n if (!isServiceIdRef(sid)) continue;\n\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n } else if (args.mode === \"visible_group\") {\n const t: Tag | undefined = args.tag;\n const sid: unknown = t ? (t as any).service_id : undefined;\n\n if (t && isServiceIdRef(sid)) {\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 2) FIELD SERVICES (field.service_id) + OPTION SERVICES\n // - fields can be button fields with service_id\n // - multi-field options can map to services\n // ────────────────────────────────────────────────────────────────\n const fields: readonly Field[] = args.fields ?? [];\n\n for (const f of fields) {\n // field.service_id (button field)\n const fSid: unknown = (f as any).service_id;\n if (isServiceIdRef(fSid)) {\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n serviceId: fSid,\n role: \"base\",\n affectedIds: [`field:${f.id}`, `service:${String(fSid)}`],\n });\n }\n\n // option services\n for (const o of f.options ?? []) {\n const oSid: unknown = (o as any).service_id;\n if (!isServiceIdRef(oSid)) continue;\n\n const role: \"base\" | \"utility\" = fieldRoleOf(f, o);\n\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n optionId: o.id,\n serviceId: oSid,\n role,\n affectedIds: [\n `field:${f.id}`,\n `option:${o.id}`,\n `service:${String(oSid)}`,\n ],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 3) FALLBACK SERVICES (node + global)\n // Global: include ALL fallbacks everywhere\n // Visible group: include:\n // - nodes fallbacks for visibleNodeIds (tag + visible option ids)\n // - global fallbacks for visiblePrimaries (primary ids in group)\n // ────────────────────────────────────────────────────────────────\n const fb: ServiceProps[\"fallbacks\"] | undefined = args.props.fallbacks;\n if (!fb) return Array.from(out.values());\n\n const addFallbackNode = (nodeId: string, list: unknown): void => {\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId,\n serviceId: cand,\n role: \"base\",\n affectedIds: [`fallback-node:${nodeId}`, `service:${String(cand)}`],\n });\n }\n };\n\n const addFallbackGlobal = (primaryKey: string, list: unknown): void => {\n const primaryId: IdType = primaryKey;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: primaryId,\n role: \"base\",\n affectedIds: [\n `fallback-global-primary:${primaryKey}`,\n `service:${String(primaryId)}`,\n ],\n });\n\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: cand,\n role: \"base\",\n affectedIds: [\n `fallback-global:${primaryKey}`,\n `service:${String(cand)}`,\n ],\n });\n }\n };\n\n const includeAllFallbacks: boolean = args.mode === \"global\";\n const includeGroupFallbacks: boolean = args.mode === \"visible_group\";\n\n // node-scoped fallbacks\n const nodes: Record<string, IdType[] | undefined> | undefined =\n fb.nodes && typeof fb.nodes === \"object\"\n ? (fb.nodes as any)\n : undefined;\n\n if (nodes) {\n if (includeAllFallbacks) {\n for (const [nodeId, list] of Object.entries(nodes)) {\n addFallbackNode(nodeId, list);\n }\n } else if (includeGroupFallbacks) {\n const allowNodes: Set<string> = new Set<string>(\n Array.isArray(args.visibleNodeIds)\n ? (args.visibleNodeIds as string[])\n : [],\n );\n\n for (const nodeId of allowNodes) {\n addFallbackNode(nodeId, (nodes as any)[nodeId]);\n }\n }\n }\n\n // global fallbacks: primary -> candidates\n const globalFb: Record<string, IdType[] | undefined> | undefined =\n fb.global && typeof fb.global === \"object\"\n ? (fb.global as any)\n : undefined;\n\n if (globalFb) {\n if (includeAllFallbacks) {\n for (const [primaryKey, list] of Object.entries(globalFb)) {\n addFallbackGlobal(primaryKey, list);\n }\n } else if (includeGroupFallbacks) {\n const allowPrimaries: Set<string> = new Set<string>(\n (args.visiblePrimaries ?? []).map((x) => String(x)),\n );\n\n for (const primaryKey of allowPrimaries) {\n const list: unknown = (globalFb as any)[primaryKey];\n if (list === undefined) continue;\n addFallbackGlobal(primaryKey, list);\n }\n }\n }\n\n return Array.from(out.values());\n}\n","// src/core/validate/policies/ops.ts\nimport type { DynamicRule } from \"@/schema/validation\";\n\nexport function evalPolicyOp(\n op: DynamicRule[\"op\"],\n values: unknown[],\n rule: DynamicRule,\n): boolean {\n switch (op) {\n case \"all_equal\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"no_mix\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"unique\": {\n const seen: Set<string> = new Set<string>();\n for (const v of values) {\n const k: string = JSON.stringify(v);\n if (seen.has(k)) return false;\n seen.add(k);\n }\n return true;\n }\n case \"all_true\": {\n return values.every((v) => v === true);\n }\n case \"any_true\": {\n return values.some((v) => v === true);\n }\n case \"max_count\": {\n const limit: number =\n typeof rule.value === \"number\" ? rule.value : Infinity;\n return values.length <= limit;\n }\n case \"min_count\": {\n const min: number = typeof rule.value === \"number\" ? rule.value : 0;\n return values.length >= min;\n }\n default:\n return true;\n }\n}\n","// src/core/validate/policies/apply-policies.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap, IdType } from \"@/schema/provider\";\nimport type { DynamicRule, ValidationError } from \"@/schema/validation\";\n\nimport { getByPath } from \"../shared\";\nimport { collectServiceItems, type ServiceItem } from \"./collect-service-items\";\nimport { evalPolicyOp } from \"./ops\";\n\nfunction uniq<T>(arr: readonly T[]): T[] {\n return Array.from(new Set<T>(arr));\n}\n\nfunction stableSeverity(\n s: DynamicRule[\"severity\"] | undefined,\n): \"error\" | \"warning\" | \"info\" {\n if (s === \"warning\") return \"warning\";\n if (s === \"error\") return \"error\";\n return \"error\";\n}\n\nfunction defaultPolicyMessage(rule: DynamicRule): string {\n if (typeof rule.message === \"string\" && rule.message.trim())\n return rule.message;\n if (typeof rule.label === \"string\" && rule.label.trim())\n return rule.label.trim();\n return `Policy \"${rule.id}\" violated`;\n}\n\nfunction affectedFromItems(items: readonly ServiceItem[]): string[] {\n const ids: string[] = [];\n for (const it of items) {\n for (const x of it.affectedIds ?? []) ids.push(x);\n ids.push(`service:${String(it.serviceId)}`);\n }\n return uniq(ids);\n}\n\nfunction visibleGroupNodeIds(tag: Tag, fields: readonly Field[]): string[] {\n const ids: string[] = [tag.id];\n\n for (const f of fields) {\n for (const o of f.options ?? []) {\n ids.push(o.id);\n }\n }\n\n return uniq(ids);\n}\n\nfunction visibleGroupPrimaries(tag: Tag, fields: readonly Field[]): IdType[] {\n const prim: IdType[] = [];\n\n const tagSid: unknown = (tag as any).service_id;\n if (\n typeof tagSid === \"string\" ||\n (typeof tagSid === \"number\" && Number.isFinite(tagSid))\n ) {\n prim.push(tagSid);\n }\n\n for (const f of fields) {\n const fsid: unknown = (f as any).service_id;\n if (\n typeof fsid === \"string\" ||\n (typeof fsid === \"number\" && Number.isFinite(fsid))\n ) {\n prim.push(fsid);\n }\n\n for (const o of f.options ?? []) {\n const osid: unknown = (o as any).service_id;\n if (\n typeof osid === \"string\" ||\n (typeof osid === \"number\" && Number.isFinite(osid))\n ) {\n prim.push(osid);\n }\n }\n }\n\n return uniq(prim);\n}\n\nexport function applyPolicies(\n errors: ValidationError[],\n props: ServiceProps,\n serviceMap: DgpServiceMap,\n policies: DynamicRule[] | undefined,\n fieldsVisibleUnder: (tagId: string) => Field[],\n tags: Tag[],\n): void {\n if (!policies?.length) return;\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n for (const t of tags) tagById.set(t.id, t);\n\n for (const rule of policies) {\n const projPath: string = rule.projection ?? \"service.id\";\n const severity: \"error\" | \"warning\" | \"info\" = stableSeverity(\n rule.severity,\n );\n const message: string = defaultPolicyMessage(rule);\n\n // ────────────────────────────────────────────────────────────────\n // GLOBAL: \"all services - everywhere, anywhere\"\n // - includes tags, fields (field.service_id + option.service_id), fallbacks (nodes + global)\n // - if rule.filter.tag_id is present, global becomes \"union of those visible groups\"\n // (still strict within the selected universe)\n // ────────────────────────────────────────────────────────────────\n if (rule.scope === \"global\") {\n const tagAllow: readonly string[] | undefined = Array.isArray(\n rule.filter?.tag_id,\n )\n ? (rule.filter?.tag_id as string[])\n : rule.filter?.tag_id\n ? [rule.filter.tag_id as string]\n : undefined;\n\n let items: ServiceItem[] = [];\n\n if (tagAllow && tagAllow.length) {\n // Union of selected visible-groups (including tag itself + group fallbacks)\n const merged: Map<string, ServiceItem> = new Map<\n string,\n ServiceItem\n >();\n\n for (const id of tagAllow) {\n const t: Tag | undefined = tagById.get(id);\n if (!t) continue;\n\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n const nodeIds: string[] = visibleGroupNodeIds(\n t,\n visibleFields,\n );\n const primaries: IdType[] = visibleGroupPrimaries(\n t,\n visibleFields,\n );\n\n const sub: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n for (const it of sub) {\n const k: string = `${String(it.serviceId)}|${it.role}`;\n const existing: ServiceItem | undefined = merged.get(k);\n if (!existing) {\n merged.set(k, it);\n } else {\n merged.set(k, {\n ...existing,\n affectedIds: uniq([\n ...existing.affectedIds,\n ...it.affectedIds,\n ]),\n });\n }\n }\n }\n\n items = Array.from(merged.values());\n } else {\n // Truly everything, anywhere:\n const allFields: Field[] = props.fields ?? [];\n\n items = collectServiceItems({\n mode: \"global\",\n props,\n serviceMap,\n tags,\n fields: allFields,\n filter: rule.filter,\n });\n }\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: \"global\",\n details: {\n ruleId: rule.id,\n scope: \"global\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n\n continue;\n }\n\n // ────────────────────────────────────────────────────────────────\n // VISIBLE GROUP: \"all current visible nodes under tagId including the tag\"\n // + include node-scoped fallbacks for the tag + visible option ids\n // + include global fallbacks for primaries present in that group\n // ────────────────────────────────────────────────────────────────\n for (const t of tags) {\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n\n const nodeIds: string[] = visibleGroupNodeIds(t, visibleFields);\n const primaries: IdType[] = visibleGroupPrimaries(t, visibleFields);\n\n const items: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n if (!items.length) continue;\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: t.id,\n details: {\n ruleId: rule.id,\n scope: \"visible_group\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n }\n }\n}\n","// src/core/builder.ts\nimport {normalise} from \"./normalise\";\nimport {validate} from \"./validate\";\n\nimport type {\n DgpServiceMap,\n EdgeKind,\n Field,\n GraphEdge,\n GraphNode,\n GraphSnapshot,\n NodeKind,\n ServiceProps,\n Tag,\n ValidationError,\n ValidatorOptions,\n} from \"@/schema\";\nimport {visibleFieldIdsUnder} from \"@/core/visibility\";\nimport {buildNodeMap, NodeMap} from \"@/core/node-map\";\nimport {cloneDeep} from \"lodash-es\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\n /**\n * Field ids whose options should be shown as nodes in the graph.\n * If a field id is NOT in this set, its options are not materialized as nodes:\n * - include/exclude wires keyed by an option id will be drawn from the FIELD instead.\n */\n showOptionNodes?: Set<string> | string[];\n};\n\nexport interface Builder {\n /** Replace current payload (injects root if missing, rebuilds indexes) */\n load(props: ServiceProps): void;\n\n /** Graph for visualisation */\n tree(): GraphSnapshot;\n\n /** Deterministic save payload (drops unbound utility fields, prunes dead maps) */\n cleanedProps(): ServiceProps;\n\n /** Validation errors for current state */\n errors(): ValidationError[];\n\n /**\n * Compute IDs of fields visible under a tag.\n * If selectedOptionKeys provided, applies option-level include/exclude.\n * NOTE: keys are “button ids”: either option.id or field.id for option-less buttons.\n */\n visibleFields(tagId: string, selectedOptionKeys?: string[]): string[];\n\n /** Update builder options (validator context etc.) */\n setOptions(patch: Partial<BuilderOptions>): void;\n\n /** Access the current props (already normalised) */\n getProps(): ServiceProps;\n\n /** Service map for validation/rules */\n getServiceMap(): DgpServiceMap;\n\n getConstraints(): {\n id: string;\n label: string;\n description: string;\n value: string;\n }[];\n\n isTagId(id: string): boolean;\n isFieldId(id: string): boolean;\n isOptionId(id: string): boolean;\n getNodeMap(): NodeMap;\n}\n\nexport function createBuilder(opts: BuilderOptions = {}): Builder {\n return new BuilderImpl(opts);\n}\n\n/* ────────────────────────────────────────────────────────────────────────── */\n\nclass BuilderImpl implements Builder {\n private props: ServiceProps = {\n filters: [],\n fields: [],\n schema_version: \"1.0\",\n };\n private tagById = new Map<string, Tag>();\n private fieldById = new Map<string, Field>();\n private optionOwnerById = new Map<string, { fieldId: string }>(); // option.id → fieldId\n\n private options: BuilderOptions;\n private _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n isTagId(id: string) {\n return this.tagById.has(id);\n }\n isFieldId(id: string) {\n return this.fieldById.has(id);\n }\n isOptionId(id: string) {\n return this.optionOwnerById.has(id);\n }\n\n load(raw: ServiceProps): void {\n const next = normalise(raw, {\n defaultPricingRole: \"base\",\n constraints: this.getConstraints().map((item) => item.label),\n });\n this.props = next;\n this.rebuildIndexes();\n }\n\n getProps(): ServiceProps {\n return this.props;\n }\n\n setOptions(patch: Partial<BuilderOptions>): void {\n this.options = { ...this.options, ...patch };\n }\n\n getServiceMap(): DgpServiceMap {\n return this.options.serviceMap ?? {};\n }\n\n getConstraints() {\n const serviceMap = this.getServiceMap();\n\n const out = new Set<{\n label: string;\n id: string;\n value: string;\n description: string;\n }>();\n const guard = new Set<string>();\n\n for (const svc of Object.values(serviceMap)) {\n const flags = svc.flags ?? {};\n for (const flagId of Object.keys(flags)) {\n if (guard.has(flagId)) continue;\n guard.add(flagId);\n out.add({\n id: flagId,\n value: flagId,\n label: flagId,\n description: flags[flagId].description,\n });\n }\n }\n\n // if you want deterministic ordering in UI:\n return Array.from(out);\n }\n\n /* ───── querying ─────────────────────────────────────────────────────── */\n\n tree(): GraphSnapshot {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const showSet = toStringSet(this.options.showOptionNodes);\n\n // 1) tags as nodes\n for (const t of this.props.filters) {\n nodes.push({ id: t.id, kind: \"tag\" as NodeKind, label: t.label });\n }\n\n // 2) tag hierarchy edges\n for (const t of this.props.filters) {\n if (t.bind_id) {\n edges.push({\n from: t.bind_id,\n to: t.id,\n kind: \"child\" as EdgeKind,\n });\n }\n }\n\n // 3) fields as nodes\n for (const f of this.props.fields) {\n nodes.push({\n id: f.id,\n kind: \"field\" as NodeKind,\n label: f.label,\n bind_type:\n f.pricing_role === \"utility\"\n ? \"utility\"\n : f.bind_id\n ? \"bound\"\n : null,\n });\n }\n\n // 4) field bind edges\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) {\n for (const tagId of b)\n edges.push({\n from: tagId,\n to: f.id,\n kind: \"bind\" as EdgeKind,\n });\n } else if (typeof b === \"string\") {\n edges.push({ from: b, to: f.id, kind: \"bind\" as EdgeKind });\n }\n }\n\n // 5) Option nodes (only for fields in showOptionNodes)\n for (const f of this.props.fields) {\n const showOptions = showSet.has(f.id);\n if (!showOptions) continue;\n if (!Array.isArray(f.options)) continue;\n\n for (const o of f.options) {\n nodes.push({\n id: o.id,\n kind: \"option\",\n label: o.label,\n });\n // field → option edge\n const e: any = {\n from: f.id,\n to: o.id,\n kind: \"option\" as EdgeKind,\n meta: { ownerField: f.id },\n };\n edges.push(e as GraphEdge);\n }\n }\n\n // 6) tag includes/excludes\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"include\" as EdgeKind });\n }\n for (const id of t.excludes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"exclude\" as EdgeKind });\n }\n }\n\n // 7) button-level includes/excludes (keys are button IDs: option.id OR field.id)\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n\n const pushButtonEdge = (\n keyId: string,\n targetFieldId: string,\n kind: EdgeKind,\n ) => {\n const owner = this.optionOwnerById.get(keyId);\n const ownerFieldId =\n owner?.fieldId ??\n (this.fieldById.has(keyId) ? keyId : undefined);\n if (!ownerFieldId) return; // dangling key, ignore\n\n // If the key is an option AND its field is being shown, draw from the option\n const fromNode =\n owner && showSet.has(owner.fieldId)\n ? keyId // option node → visible, draw from option\n : ownerFieldId; // else draw from the field\n\n const meta: any = owner\n ? showSet.has(owner.fieldId)\n ? {\n via: \"option-visible\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : {\n via: \"option-hidden\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : { via: \"field-button\" };\n\n const e: any = { from: fromNode, to: targetFieldId, kind, meta };\n edges.push(e as GraphEdge);\n };\n\n for (const [keyId, arr] of Object.entries(incMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"include\" as EdgeKind);\n }\n for (const [keyId, arr] of Object.entries(excMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"exclude\" as EdgeKind);\n }\n\n return { nodes, edges };\n }\n\n cleanedProps(): ServiceProps {\n // Build quick indexes\n const fieldIds = new Set(this.props.fields.map((f) => f.id));\n const optionIds = new Set<string>();\n this.optionOwnerById.forEach((_v, oid) => optionIds.add(oid));\n\n // 1) drop utility fields that are truly \"orphaned\"\n // (unbound + not included by tag or button includes + not referenced as a key)\n const includedByTag = new Set<string>();\n const excludedAnywhere = new Set<string>();\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n for (const id of t.excludes ?? []) excludedAnywhere.add(id);\n }\n\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n const includedByButtons = new Set<string>(); // field ids that might be pulled in\n const referencedKeys = new Set<string>(); // keys in maps (field button or option id)\n const referencedOwnerFields = new Set<string>();\n\n for (const [key, arr] of Object.entries(incMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n includedByButtons.add(fid);\n }\n }\n for (const [key, arr] of Object.entries(excMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n // exclusion targets don’t “include”, but record that these field ids are referenced\n // (so we don’t accidentally drop something host intentionally excludes/controls)\n // not strictly necessary, but conservative:\n void fid;\n }\n }\n\n const boundIds = new Set<string>();\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) b.forEach((id) => boundIds.add(id));\n else if (typeof b === \"string\") boundIds.add(b);\n }\n\n const fields = this.props.fields.filter((f) => {\n const isUtility = (f.pricing_role ?? \"base\") === \"utility\";\n if (!isUtility) return true;\n\n const bound = !!f.bind_id;\n const included =\n includedByTag.has(f.id) || includedByButtons.has(f.id);\n const referenced =\n referencedOwnerFields.has(f.id) || referencedKeys.has(f.id);\n const excluded = excludedAnywhere.has(f.id);\n\n // keep if bound OR included OR referenced by maps; drop if truly orphaned or globally excluded\n return bound || included || referenced || !excluded;\n });\n\n // 2) prune button maps: keep only valid keys and existing field targets\n const allowedTargets = new Set(fields.map((f) => f.id)); // targets must be existing fields\n\n const pruneButtons = (src?: Record<string, string[]>) => {\n if (!src) return undefined;\n const out: Record<string, string[]> = {};\n for (const [key, arr] of Object.entries(src)) {\n // key must be an existing option.id OR field.id\n const keyIsValid = optionIds.has(key) || fieldIds.has(key);\n if (!keyIsValid) continue;\n\n const cleaned = (arr ?? []).filter((fid) =>\n allowedTargets.has(fid),\n );\n if (cleaned.length) out[key] = Array.from(new Set(cleaned));\n }\n return Object.keys(out).length ? out : undefined;\n };\n\n const includes_for_buttons = pruneButtons(\n this.props.includes_for_buttons,\n );\n const excludes_for_buttons = pruneButtons(\n this.props.excludes_for_buttons,\n );\n\n // 3) return canonical object\n const out: ServiceProps = {\n filters: this.props.filters.slice(),\n fields,\n ...(includes_for_buttons && { includes_for_buttons }),\n ...(excludes_for_buttons && { excludes_for_buttons }),\n schema_version: this.props.schema_version ?? \"1.0\",\n // keep fallbacks & other maps as-is\n ...(this.props.fallbacks\n ? { fallbacks: this.props.fallbacks }\n : {}),\n };\n return out;\n }\n\n errors(): ValidationError[] {\n return validate(this.props, this.options);\n }\n\n getOptions() {\n return cloneDeep(this.options);\n }\n\n visibleFields(tagId: string, selectedKeys?: string[]): string[] {\n return visibleFieldIdsUnder(this.props, tagId, {\n selectedKeys: new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n ),\n });\n }\n\n getNodeMap(): NodeMap {\n if (!this._nodemap) this._nodemap = buildNodeMap(this.getProps());\n ///--\n return this._nodemap;\n }\n\n /* ───── internals ──────────────────────────────────────────────────── */\n\n private rebuildIndexes(): void {\n this.tagById.clear();\n this.fieldById.clear();\n this.optionOwnerById.clear();\n this._nodemap = null;\n\n for (const t of this.props.filters) this.tagById.set(t.id, t);\n for (const f of this.props.fields) {\n this.fieldById.set(f.id, f);\n if (Array.isArray(f.options)) {\n for (const o of f.options)\n this.optionOwnerById.set(o.id, { fieldId: f.id });\n }\n }\n }\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\nfunction toStringSet(v: Set<string> | string[] | undefined): Set<string> {\n if (!v) return new Set();\n if (v instanceof Set) return new Set(Array.from(v).map(String));\n return new Set((v as string[]).map(String));\n}\n","import type {\n DgpServiceMap,\n Field,\n PricingRole,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { RatePolicy } from \"@/schema/validation\";\nimport { Builder } from \"./builder\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\nimport { isMultiField } from \"@/utils\";\n\ntype BaseMember = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n service_id: ServiceIdRef;\n rate: number;\n};\n\ntype FieldReference = {\n refKind: \"single\" | \"multi\";\n nodeId: string;\n fieldId: string;\n label?: string;\n rate: number;\n service_id?: ServiceIdRef;\n members: BaseMember[];\n};\n\ntype Anchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SimulationAnchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SharedDiagnostic = {\n scope: \"visible_group\";\n tagId: string;\n nodeId: string;\n message: string;\n simulationAnchor?: SimulationAnchor;\n invalidFieldIds: string[];\n};\n\nexport type RateCoherenceDiagnostic =\n | (SharedDiagnostic & {\n kind: \"contextual\";\n primary: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n offender: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n policy: RatePolicy[\"kind\"];\n policyPct?: number;\n })\n | (SharedDiagnostic & {\n kind: \"internal_field\";\n fieldId: string;\n });\n\nexport function validateRateCoherenceDeep(params: {\n builder: Builder;\n services: DgpServiceMap;\n tagId: string;\n ratePolicy?: RatePolicy;\n invalidFieldIds?: Iterable<string>;\n}): RateCoherenceDiagnostic[] {\n const { builder, services, tagId } = params;\n const ratePolicy = normalizeRatePolicy(params.ratePolicy);\n const props = builder.getProps() as ServiceProps;\n const invalidFieldIds = new Set(params.invalidFieldIds ?? []);\n\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const tagById = new Map((props.filters ?? []).map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n const baselineFieldIds = builder.visibleFields(tagId, []);\n const baselineFields = baselineFieldIds\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const anchors = collectAnchors(baselineFields);\n const diagnostics: RateCoherenceDiagnostic[] = [];\n const seen = new Set<string>();\n\n for (const anchor of anchors) {\n const selectedKeys =\n anchor.kind === \"option\"\n ? [`${anchor.fieldId}::${anchor.id}`]\n : [anchor.fieldId];\n\n const visibleFields = builder\n .visibleFields(tagId, selectedKeys)\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const visibleInvalidFieldIds = visibleFields\n .map((field) => field.id)\n .filter((fieldId) => invalidFieldIds.has(fieldId));\n\n for (const fieldId of visibleInvalidFieldIds) {\n const key = `internal|${tagId}|${fieldId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n kind: \"internal_field\",\n scope: \"visible_group\",\n tagId,\n fieldId,\n nodeId: fieldId,\n message: `Field \"${fieldId}\" is internally invalid under rate policy \"${ratePolicy.kind}\".`,\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: [fieldId],\n });\n }\n\n const references = visibleFields.flatMap((field) =>\n collectFieldReferences(field, services),\n );\n if (references.length <= 1) continue;\n\n const primary = references.reduce((best, current) => {\n if (current.rate !== best.rate) {\n return current.rate > best.rate ? current : best;\n }\n const bestKey = `${best.fieldId}|${best.nodeId}`;\n const currentKey = `${current.fieldId}|${current.nodeId}`;\n return currentKey < bestKey ? current : best;\n });\n\n for (const candidate of references) {\n if (candidate.nodeId === primary.nodeId) continue;\n if (candidate.fieldId === primary.fieldId) continue;\n if (passesRatePolicy(ratePolicy, primary.rate, candidate.rate)) {\n continue;\n }\n\n const key = contextualKey(tagId, primary, candidate, ratePolicy);\n if (seen.has(key)) continue;\n seen.add(key);\n\n diagnostics.push({\n kind: \"contextual\",\n scope: \"visible_group\",\n tagId,\n nodeId: candidate.nodeId,\n primary: toDiagnosticRef(primary),\n offender: toDiagnosticRef(candidate),\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n message: explainRateMismatch(\n ratePolicy,\n primary,\n candidate,\n describeLabel(tag),\n ),\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: visibleInvalidFieldIds,\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction collectAnchors(fields: Field[]): Anchor[] {\n const anchors: Anchor[] = [];\n\n for (const field of fields) {\n if (!isButton(field)) continue;\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n anchors.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n });\n }\n continue;\n }\n\n anchors.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n });\n }\n\n return anchors;\n}\n\nfunction collectFieldReferences(\n field: Field,\n services: DgpServiceMap,\n): FieldReference[] {\n const members = collectBaseMembers(field, services);\n if (members.length === 0) return [];\n\n if (isMultiField(field)) {\n const averageRate =\n members.reduce((sum, member) => sum + member.rate, 0) /\n members.length;\n return [\n {\n refKind: \"multi\",\n nodeId: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n rate: averageRate,\n members,\n },\n ];\n }\n\n return members.map((member) => ({\n refKind: \"single\",\n nodeId: member.id,\n fieldId: field.id,\n label: member.label,\n rate: member.rate,\n service_id: member.service_id,\n members: [member],\n }));\n}\n\nfunction collectBaseMembers(\n field: Field,\n services: DgpServiceMap,\n): BaseMember[] {\n const members: BaseMember[] = [];\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n const role = normalizeRole(option.pricing_role ?? field.pricing_role, \"base\");\n if (role !== \"base\") continue;\n if (option.service_id === undefined || option.service_id === null) {\n continue;\n }\n const cap = getServiceCapability(services, option.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n continue;\n }\n members.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n service_id: option.service_id,\n rate: cap.rate,\n });\n }\n return members;\n }\n\n const role = normalizeRole(field.pricing_role, \"base\");\n if (role !== \"base\") return members;\n if (field.service_id === undefined || field.service_id === null) return members;\n\n const cap = getServiceCapability(services, field.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n return members;\n }\n\n members.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n service_id: field.service_id,\n rate: cap.rate,\n });\n return members;\n}\n\nfunction isButton(field: Field): boolean {\n if ((field as any).button === true) return true;\n return Array.isArray(field.options) && field.options.length > 0;\n}\n\nfunction normalizeRole(\n role: PricingRole | undefined,\n fallback: PricingRole,\n): PricingRole {\n return role === \"base\" || role === \"utility\" ? role : fallback;\n}\n\nfunction toDiagnosticRef(reference: FieldReference) {\n return {\n nodeId: reference.nodeId,\n fieldId: reference.fieldId,\n label: reference.label,\n refKind: reference.refKind,\n service_id: reference.service_id,\n rate: reference.rate,\n };\n}\n\nfunction contextualKey(\n tagId: string,\n primary: FieldReference,\n candidate: FieldReference,\n ratePolicy: RatePolicy,\n): string {\n const pctKey = \"pct\" in ratePolicy ? `:${ratePolicy.pct}` : \"\";\n return [\n \"contextual\",\n tagId,\n primary.fieldId,\n primary.nodeId,\n candidate.fieldId,\n candidate.nodeId,\n `${ratePolicy.kind}${pctKey}`,\n ].join(\"|\");\n}\n\nfunction describeLabel(tag?: Tag): string {\n return tag?.label ?? tag?.id ?? \"tag\";\n}\n\nfunction explainRateMismatch(\n policy: RatePolicy,\n primary: FieldReference,\n candidate: FieldReference,\n where: string,\n): string {\n const primaryLabel = `${primary.label ?? primary.nodeId} (${primary.rate})`;\n const candidateLabel = `${candidate.label ?? candidate.nodeId} (${candidate.rate})`;\n\n switch (policy.kind) {\n case \"eq_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must exactly match ${primaryLabel}.`;\n case \"lte_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must stay within ${policy.pct}% below and never above ${primaryLabel}.`;\n case \"within_pct\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be within ${policy.pct}% of ${primaryLabel}.`;\n case \"at_least_pct_lower\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be at least ${policy.pct}% lower than ${primaryLabel}.`;\n }\n}\n","// src/core/validate/index.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nimport {\n createFieldsVisibleUnder,\n validateVisibility,\n} from \"./steps/visibility\";\nimport { validateStructure } from \"./steps/structure\";\nimport { validateIdentity } from \"./steps/identity\";\nimport { validateOptionMaps } from \"./steps/option-maps\";\nimport { validateServiceVsUserInput } from \"./steps/service-vs-input\";\nimport { validateUtilityMarkers } from \"./steps/utility\";\nimport { validateRates } from \"./steps/rates\";\nimport { validateConstraints } from \"./steps/constraints\";\nimport { validateCustomFields } from \"./steps/custom\";\nimport { validateGlobalUtilityGuard } from \"./steps/global-utility-guard\";\nimport { validateUnboundFields } from \"./steps/unbound\";\nimport { validateFallbacks } from \"./steps/fallbacks\";\n\nimport { applyPolicies } from \"./policies/apply-policies\";\nimport type { ValidationCtx } from \"./shared\";\nimport { buildNodeMap } from \"@/core/node-map\";\nimport { createBuilder } from \"@/core/builder\";\nimport { validateRateCoherenceDeep } from \"@/core/rate-coherence\";\n\n/**\n * We read simulation options from ctx without changing the public ValidatorOptions type.\n * (So UI can pass these without needing schema/type changes immediately.)\n */\ntype VisibilitySimOpts = Readonly<{\n simulate?: boolean;\n maxStates?: number;\n maxDepth?: number;\n simulateAllRoots?: boolean;\n onlyEffectfulTriggers?: boolean;\n}>;\n\nfunction readVisibilitySimOpts(ctx: ValidatorOptions): VisibilitySimOpts {\n const c = ctx as any;\n\n const simulate =\n c.simulateVisibility === true ||\n c.visibilitySimulate === true ||\n c.simulate === true;\n\n const maxStates =\n typeof c.maxVisibilityStates === \"number\"\n ? c.maxVisibilityStates\n : typeof c.visibilityMaxStates === \"number\"\n ? c.visibilityMaxStates\n : typeof c.maxStates === \"number\"\n ? c.maxStates\n : undefined;\n\n const maxDepth =\n typeof c.maxVisibilityDepth === \"number\"\n ? c.maxVisibilityDepth\n : typeof c.visibilityMaxDepth === \"number\"\n ? c.visibilityMaxDepth\n : typeof c.maxDepth === \"number\"\n ? c.maxDepth\n : undefined;\n\n const simulateAllRoots =\n c.simulateAllRoots === true || c.visibilitySimulateAllRoots === true;\n\n const onlyEffectfulTriggers =\n c.onlyEffectfulTriggers === false\n ? false\n : c.visibilityOnlyEffectfulTriggers !== false; // default true\n\n return {\n simulate,\n maxStates,\n maxDepth,\n simulateAllRoots,\n onlyEffectfulTriggers,\n };\n}\n\n/**\n * Core synchronous validate.\n */\nexport function validate(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): ValidationError[] {\n const errors: ValidationError[] = [];\n const serviceMap: DgpServiceMap = ctx.serviceMap ?? {};\n const selectedKeys: Set<string> = new Set<string>(\n ctx.selectedOptionKeys ?? [],\n );\n\n const tags: Tag[] = Array.isArray(props.filters) ? props.filters : [];\n const fields: Field[] = Array.isArray(props.fields) ? props.fields : [];\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n const fieldById: Map<string, Field> = new Map<string, Field>();\n\n for (const t of tags) tagById.set(t.id, t);\n for (const f of fields) fieldById.set(f.id, f);\n\n const v: ValidationCtx = {\n props,\n nodeMap: ctx.nodeMap ?? buildNodeMap(props),\n options: ctx,\n errors,\n serviceMap,\n selectedKeys,\n tags,\n fields,\n invalidRateFieldIds: new Set<string>(),\n tagById,\n fieldById,\n fieldsVisibleUnder: (_tagId: string): Field[] => [],\n };\n\n // 1) structure\n validateStructure(v);\n\n // 2) identity + labels\n validateIdentity(v);\n\n // 3) option maps\n validateOptionMaps(v);\n\n // 4) visibility helpers + visibility rules (optionally simulated)\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n\n const visSim = readVisibilitySimOpts(ctx);\n validateVisibility(v, visSim);\n\n // --------- Dynamic policies (super-admin) --------------------------\n applyPolicies(\n v.errors,\n v.props,\n v.serviceMap,\n v.options.policies,\n v.fieldsVisibleUnder,\n v.tags,\n );\n\n // 5) service vs user-input rules\n validateServiceVsUserInput(v);\n\n // 6) utility marker rules\n validateUtilityMarkers(v);\n\n // 7) rates & pricing roles\n validateRates(v);\n\n if (Object.keys(serviceMap).length > 0 && tags.length > 0) {\n const builder = createBuilder({ serviceMap });\n builder.load(props);\n\n for (const tag of tags) {\n const diags = validateRateCoherenceDeep({\n builder,\n services: serviceMap,\n tagId: tag.id,\n ratePolicy: ctx.fallbackSettings?.ratePolicy,\n invalidFieldIds: v.invalidRateFieldIds,\n });\n\n for (const diag of diags) {\n if (diag.kind !== \"contextual\") continue;\n errors.push({\n code: \"rate_coherence_violation\",\n severity: \"error\",\n message: diag.message,\n nodeId: diag.nodeId,\n details: {\n tagId: diag.tagId,\n simulationAnchor: diag.simulationAnchor,\n primary: diag.primary,\n offender: diag.offender,\n policy: diag.policy,\n policyPct: diag.policyPct,\n invalidFieldIds: diag.invalidFieldIds,\n },\n });\n }\n }\n }\n\n // 8) constraints vs capabilities + inheritance\n validateConstraints(v);\n\n // 9) custom field rules\n validateCustomFields(v);\n\n // 10) optional global utility guard\n validateGlobalUtilityGuard(v);\n\n // 11) unbound fields\n validateUnboundFields(v);\n\n // 12) fallbacks strict-mode conversion\n validateFallbacks(v);\n\n return v.errors;\n}\n\n/**\n * UI-friendly async wrapper:\n * - yields to microtask queue\n * - then yields to the next animation frame (so paint can happen)\n * - then runs validate()\n */\nexport async function validateAsync(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): Promise<ValidationError[]> {\n // microtask yield\n await Promise.resolve();\n\n // next paint/frame yield (browser environments)\n if (typeof requestAnimationFrame === \"function\") {\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n } else {\n // non-browser fallback\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n }\n\n return validate(props, ctx);\n}\n","// src/core/utils/fallback.ts\r\nimport type {\r\n ServiceProps,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n NodeIdRef,\r\n} from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\r\nexport type FailedFallbackContext = {\r\n scope: \"node\" | \"global\";\r\n nodeId?: string; // when scope='node'\r\n primary: ServiceIdRef;\r\n candidate: ServiceIdRef;\r\n tagContext?: string; // tag.id when evaluating constraints\r\n reason:\r\n | \"unknown_service\"\r\n | \"no_primary\"\r\n | \"rate_violation\"\r\n | \"constraint_mismatch\"\r\n | \"cycle\"\r\n | \"no_tag_context\";\r\n details?: Record<string, unknown>;\r\n};\r\n\r\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\r\nexport function resolveServiceFallback(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n}): ServiceIdRef | null {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const tried: ServiceIdRef[] = [];\r\n\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n const primaryRate = rateOf(services, primary);\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n if (tried.includes(cand)) continue;\r\n tried.push(cand);\r\n\r\n const candCap = services[Number(cand)] ?? services[cand as any];\r\n if (!candCap) continue;\r\n\r\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(tagId, params, candCap);\r\n if (!ok) continue;\r\n }\r\n return cand;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function collectFailedFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings,\r\n): FailedFallbackContext[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\r\n const out: FailedFallbackContext[] = [];\r\n const fb = props.fallbacks ?? {};\r\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\r\n\r\n // Node-scoped (tags or options)\r\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n if (!primary) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary: \"\" as any,\r\n candidate: \"\" as any,\r\n reason: \"no_primary\",\r\n });\r\n continue;\r\n }\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n continue;\r\n }\r\n // Tag contexts\r\n if (tagContexts.length === 0) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"no_tag_context\",\r\n });\r\n continue;\r\n }\r\n let anyPass = false;\r\n let anyFail = false;\r\n for (const tagId of tagContexts) {\r\n const ok = s.requireConstraintFit\r\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\r\n : true;\r\n if (ok) anyPass = true;\r\n else {\r\n anyFail = true;\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n tagContext: tagId,\r\n reason: \"constraint_mismatch\",\r\n });\r\n }\r\n }\r\n // If none passed, we already added per-context mismatches above\r\n void anyPass;\r\n void anyFail;\r\n }\r\n }\r\n\r\n // Global (soft; no tag context)\r\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction rateOf(\r\n map: DgpServiceMap,\r\n id: ServiceIdRef | undefined,\r\n): number | undefined {\r\n if (id === undefined || id === null) return undefined;\r\n const c = getCap(map, id);\r\n return c?.rate ?? undefined;\r\n}\r\n\r\nfunction passesRate(\n policy: Required<FallbackSettings>[\"ratePolicy\"],\n primaryRate?: number,\n candRate?: number,\n): boolean {\n if (typeof candRate !== \"number\" || !Number.isFinite(candRate))\n return false;\n if (typeof primaryRate !== \"number\" || !Number.isFinite(primaryRate))\n return false;\n return passesRatePolicy(normalizeRatePolicy(policy), primaryRate, candRate);\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\r\n // New structure: flags[flagId].enabled\r\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\r\n if (fromFlags === true) return true;\r\n if (fromFlags === false) return false;\r\n\r\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\r\n const legacy: unknown = (cap as any)[flagId];\r\n return legacy === true;\r\n}\r\n\r\nfunction satisfiesTagConstraints(\r\n tagId: string,\r\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\r\n cap: DgpServiceCapability,\r\n): boolean {\r\n const tag = ctx.props.filters.find((t) => t.id === tagId);\r\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\r\n if (!eff) return true;\r\n\r\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\r\n for (const [key, value] of Object.entries(eff)) {\r\n if (value === true && !isCapFlagEnabled(cap, key)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction primaryForNode(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n reasonNoPrimary?: string;\r\n} {\r\n // Tag node?\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\r\n }\r\n // Option node: locate its parent field\r\n const field = props.fields.find(\r\n (f) =>\r\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\r\n );\r\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\r\n const opt = field.options!.find((o) => o.id === nodeId)!;\r\n const contexts = bindIdsToArray(field.bind_id);\r\n return { primary: opt.service_id as any, tagContexts: contexts };\r\n}\r\n\r\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}\r\n\r\n/**\r\n * Return all fallback candidates that are eligible for the given primary,\r\n * respecting:\r\n * - node-scoped list first (if nodeId provided), then global list for `primary`\r\n * - rate policy vs. primary\r\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\r\n * - excludes (including primary automatically)\r\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\r\n * - unique (dedupe) and optional limit\r\n */\r\nexport function getEligibleFallbacks(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped list first\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\r\n unique?: boolean; // default true\r\n limit?: number; // optional cap\r\n}): ServiceIdRef[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const excludes = new Set<string>((params.exclude ?? []).map(String));\r\n excludes.add(String(primary)); // never return the primary itself\r\n const unique = params.unique ?? true;\r\n\r\n // Gather source lists: node → global\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n if (!lists.length) return [];\r\n\r\n const primaryRate = rateOf(services, primary);\r\n const seen = new Set<string>();\r\n const eligible: ServiceIdRef[] = [];\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n const key = String(cand);\r\n if (excludes.has(key)) continue;\r\n if (unique && seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const cap = getCap(services, cand);\r\n if (!cap) continue;\r\n\r\n // Rate policy must pass\r\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\r\n\r\n // Tag constraint fit is only enforced if we know tagId and setting requires it\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(\r\n tagId,\r\n { props: params.props, services },\r\n cap,\r\n );\r\n if (!ok) continue;\r\n }\r\n\r\n eligible.push(cand);\r\n }\r\n }\r\n\r\n // Selection strategy\r\n if (s.selectionStrategy === \"cheapest\") {\r\n eligible.sort((a, b) => {\r\n const ra = rateOf(services, a) ?? Infinity;\r\n const rb = rateOf(services, b) ?? Infinity;\r\n return ra - rb;\r\n });\r\n }\r\n // 'priority' keeps original order\r\n\r\n // Optional limit\r\n if (typeof params.limit === \"number\" && params.limit >= 0) {\r\n return eligible.slice(0, params.limit);\r\n }\r\n return eligible;\r\n}\r\n\r\nexport function getFallbackRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: NodeIdRef,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n} {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n return { primary, tagContexts };\r\n}\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(builder: Builder): NodeIndex {\n const props = builder.getProps();\n const nodeMap = builder.getNodeMap();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (\n fieldId: string,\n tagId: string,\n ): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean,\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(\n explicit ? node : { ...node, isInherited: true },\n );\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n const id = typeof input === \"object\" ? input.id : input;\n\n const cached = nodeCache.get(id);\n if (cached) return cached;\n\n const node = nodeMap.get(id);\n\n if (!node) return mkUnknown(id);\n\n if (node.kind === \"tag\") return getTag(id) ?? mkUnknown(id);\n if (node.kind == \"field\") return getField(id) ?? mkUnknown(id);\n if (node.kind == \"option\") return getOption(id) ?? mkUnknown(id);\n\n return mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n","// src/core/policy.ts\nimport type { DynamicRule, ValidatorOptions } from \"@/schema/validation\";\n\nexport type PolicyDiagnostic = {\n ruleIndex: number;\n ruleId?: string;\n severity: \"error\" | \"warning\";\n message: string;\n path?: string; // e.g. \"filter.role\", \"op\"\n};\n\nconst ALLOWED_SCOPES = new Set<DynamicRule[\"scope\"]>([\n \"global\",\n \"visible_group\",\n]);\nconst ALLOWED_SUBJECTS = new Set<DynamicRule[\"subject\"]>([\"services\"]);\nconst ALLOWED_OPS = new Set<DynamicRule[\"op\"]>([\n \"all_equal\",\n \"unique\",\n \"no_mix\",\n \"all_true\",\n \"any_true\",\n \"max_count\",\n \"min_count\",\n]);\nconst ALLOWED_ROLES = new Set<NonNullable<DynamicRule[\"filter\"]>[\"role\"]>([\n \"base\",\n \"utility\",\n \"both\",\n]);\nconst ALLOWED_SEVERITIES = new Set<NonNullable<DynamicRule[\"severity\"]>>([\n \"error\",\n \"warning\",\n]);\n\nconst ALLOWED_WHERE_OPS = new Set<\n NonNullable<NonNullable<DynamicRule[\"filter\"]>[\"where\"]>[number][\"op\"]\n>([\"eq\", \"neq\", \"in\", \"nin\", \"exists\", \"truthy\", \"falsy\"]);\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nfunction normaliseWhere(\n src: unknown,\n d: PolicyDiagnostic[],\n i: number,\n id: string,\n): WhereClause[] | undefined {\n if (src === undefined) return undefined;\n if (!Array.isArray(src)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: \"filter.where must be an array; ignored.\",\n path: \"filter.where\",\n });\n return undefined;\n }\n\n const out: WhereClause[] = [];\n\n src.forEach((raw, j) => {\n const obj: any = raw && typeof raw === \"object\" ? raw : null;\n const path: string | undefined =\n typeof obj?.path === \"string\" && obj.path.trim()\n ? obj.path.trim()\n : undefined;\n\n if (!path) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path must be a non-empty string; entry ignored.`,\n path: `filter.where[${j}].path`,\n });\n return;\n }\n\n if (!path.startsWith(\"service.\")) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path should start with \"service.\" for subject \"services\".`,\n path: `filter.where[${j}].path`,\n });\n }\n\n const opRaw: unknown = obj?.op;\n const op: WhereClause[\"op\"] =\n opRaw === undefined\n ? \"eq\"\n : typeof opRaw === \"string\" &&\n ALLOWED_WHERE_OPS.has(opRaw as any)\n ? (opRaw as any)\n : \"eq\";\n\n if (\n opRaw !== undefined &&\n !(typeof opRaw === \"string\" && ALLOWED_WHERE_OPS.has(opRaw as any))\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `Unknown filter.where[${j}].op; defaulted to \"eq\".`,\n path: `filter.where[${j}].op`,\n });\n }\n\n const value: unknown = obj?.value;\n\n // validate value requirements lightly (non-fatal)\n if (op === \"exists\" || op === \"truthy\" || op === \"falsy\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" does not use \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n } else if (op === \"in\" || op === \"nin\") {\n if (!Array.isArray(value)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" expects an array \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n }\n\n out.push({ path, op, value });\n });\n\n return out.length ? out : undefined;\n}\n\n/**\n * Compile & validate arbitrary JSON into DynamicRule[] with defaults:\n * - scope: (default) \"visible_group\"\n * - subject: (default) \"services\"\n * - filter.role: (default) \"both\"\n * - severity: (default) \"error\"\n * - projection: (default) \"service.id\"\n *\n * Returns normalized rules + diagnostics (errors/warnings).\n */\nexport function compilePolicies(raw: unknown): {\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n} {\n const diagnostics: PolicyDiagnostic[] = [];\n const policies: DynamicRule[] = [];\n\n if (!Array.isArray(raw)) {\n diagnostics.push({\n ruleIndex: -1,\n severity: \"error\",\n message: \"Policies root must be an array.\",\n });\n return { policies, diagnostics };\n }\n\n raw.forEach((entry, i) => {\n const d: PolicyDiagnostic[] = [];\n const src = entry && typeof entry === \"object\" ? (entry as any) : {};\n\n let id: string | undefined =\n typeof src.id === \"string\" && src.id.trim()\n ? src.id.trim()\n : undefined;\n\n // id default\n if (!id) {\n id = `policy_${i + 1}`;\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"id\"; generated automatically.',\n path: \"id\",\n });\n }\n\n // ✅ label: required by DynamicRule; default to id\n const label: string =\n typeof src.label === \"string\" && src.label.trim()\n ? src.label.trim()\n : id;\n\n if (!(typeof src.label === \"string\" && src.label.trim())) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"label\"; defaulted to rule id.',\n path: \"label\",\n });\n }\n\n // scope default + validation\n let scope: DynamicRule[\"scope\"] = ALLOWED_SCOPES.has(src.scope)\n ? src.scope\n : src.scope === undefined\n ? \"visible_group\"\n : \"visible_group\";\n if (src.scope !== undefined && !ALLOWED_SCOPES.has(src.scope)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"scope\"; defaulted to \"visible_group\".',\n path: \"scope\",\n });\n }\n\n // subject default + validation\n let subject: DynamicRule[\"subject\"] = ALLOWED_SUBJECTS.has(src.subject)\n ? src.subject\n : \"services\";\n if (src.subject !== undefined && !ALLOWED_SUBJECTS.has(src.subject)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"subject\"; defaulted to \"services\".',\n path: \"subject\",\n });\n }\n\n // op required & valid\n const op: DynamicRule[\"op\"] = src.op;\n if (!ALLOWED_OPS.has(op)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `Invalid \"op\": ${String(op)}.`,\n path: \"op\",\n });\n }\n\n // projection default\n let projection: string | undefined =\n typeof src.projection === \"string\" && src.projection.trim()\n ? src.projection.trim()\n : \"service.id\";\n\n // For services subject, encourage service.* projection\n if (\n subject === \"services\" &&\n projection &&\n !projection.startsWith(\"service.\")\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message:\n 'Projection should start with \"service.\" for subject \"services\".',\n path: \"projection\",\n });\n }\n\n const filterSrc =\n src.filter && typeof src.filter === \"object\"\n ? (src.filter as DynamicRule[\"filter\"])\n : undefined;\n\n const role: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n filterSrc?.role && ALLOWED_ROLES.has(filterSrc.role)\n ? filterSrc.role\n : \"both\";\n\n if (filterSrc?.role && !ALLOWED_ROLES.has(filterSrc.role)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown filter.role; defaulted to \"both\".',\n path: \"filter.role\",\n });\n }\n\n const filter: DynamicRule[\"filter\"] | undefined = {\n role,\n tag_id:\n filterSrc?.tag_id !== undefined\n ? Array.isArray(filterSrc.tag_id)\n ? filterSrc.tag_id\n : [filterSrc.tag_id]\n : undefined,\n field_id:\n filterSrc?.field_id !== undefined\n ? Array.isArray(filterSrc.field_id)\n ? filterSrc.field_id\n : [filterSrc.field_id]\n : undefined,\n where: normaliseWhere((filterSrc as any)?.where, d, i, id),\n };\n\n // severity default\n const severity: NonNullable<DynamicRule[\"severity\"]> =\n ALLOWED_SEVERITIES.has(src.severity) ? src.severity : \"error\";\n if (\n src.severity !== undefined &&\n !ALLOWED_SEVERITIES.has(src.severity)\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"severity\"; defaulted to \"error\".',\n path: \"severity\",\n });\n }\n\n // value requirements by op\n const value = src.value;\n if (op === \"max_count\" || op === \"min_count\") {\n if (!(typeof value === \"number\" && Number.isFinite(value))) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `\"${op}\" requires numeric \"value\".`,\n path: \"value\",\n });\n }\n } else if (op === \"all_true\" || op === \"any_true\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" ignores \"value\"; it checks all/any true.`,\n path: \"value\",\n });\n }\n } else {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" does not use \"value\".`,\n path: \"value\",\n });\n }\n }\n\n // assemble rule if no fatal (error-level) diagnostics for op/value\n const hasFatal = d.some((x) => x.severity === \"error\");\n if (!hasFatal) {\n const rule: DynamicRule = {\n id,\n label, // ✅ now always present\n scope,\n subject,\n filter,\n projection,\n op,\n value: value as any,\n severity,\n message:\n typeof src.message === \"string\" ? src.message : undefined,\n };\n policies.push(rule);\n }\n\n diagnostics.push(...d);\n });\n\n return { policies, diagnostics };\n}\n\n/** Split diagnostics for convenience in UI */\nexport function splitPolicyDiagnostics(diags: PolicyDiagnostic[]): {\n errors: PolicyDiagnostic[];\n warnings: PolicyDiagnostic[];\n} {\n return {\n errors: diags.filter((d) => d.severity === \"error\"),\n warnings: diags.filter((d) => d.severity === \"warning\"),\n };\n}\n\n/**\n * Convenience helper: compile policies and pass to validator options.\n * You can use this in your editor before calling validate().\n */\nexport function withCompiledPolicies(\n opts: ValidatorOptions,\n rawPolicies: unknown,\n): { opts: ValidatorOptions; diagnostics: PolicyDiagnostic[] } {\n const { policies, diagnostics } = compilePolicies(rawPolicies);\n return { opts: { ...opts, policies }, diagnostics };\n}\n","import type { Builder } from \"@/core/builder\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n FallbackSettings,\n ServiceIdRef,\n} from \"@/schema\";\nimport {\n constraintFitOk,\n getServiceCapability,\n rateOk,\n toFiniteNumber,\n} from \"@/utils/util\";\n\nexport type ServiceCheck = {\n id: ServiceIdRef;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n\nexport type FilterServicesForVisibleGroupInput = {\n candidates: ServiceIdRef[];\n context: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: ServiceIdRef[];\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n strictSafety?: boolean;\n enforcePolicies?: boolean;\n };\n};\n\nexport type FilterServicesForVisibleGroupResult = {\n checks: ServiceCheck[];\n diagnostics?: PolicyDiagnostic[];\n};\n\nexport function filterServicesForVisibleGroup(\n input: FilterServicesForVisibleGroupInput,\n deps: {\n builder: Builder;\n },\n): FilterServicesForVisibleGroupResult {\n const svcMap: DgpServiceMap = deps.builder.getServiceMap?.() ?? {};\n const { context } = input;\n\n const usedSet = new Set(context.usedServiceIds.map(String));\n const primary = context.usedServiceIds[0];\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(context.fallback ?? {}),\n };\n\n const visibleServiceIds =\n context.selectedButtons === undefined\n ? undefined\n : collectVisibleServiceIds(\n deps.builder,\n context.tagId,\n context.selectedButtons,\n );\n\n const checks: ServiceCheck[] = [];\n let lastDiagnostics: PolicyDiagnostic[] | undefined = undefined;\n\n for (const id of input.candidates) {\n if (usedSet.has(String(id))) continue;\n\n const cap = getServiceCapability(svcMap, id);\n if (!cap) {\n checks.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n context.effectiveConstraints ?? {},\n );\n\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n const polRes = evaluatePoliciesRaw(\n context.policies ?? [],\n [...context.usedServiceIds, id],\n svcMap,\n context.tagId,\n visibleServiceIds,\n );\n const passesPolicies = polRes.ok;\n lastDiagnostics = polRes.diagnostics;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n checks.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length ? polRes.warnings : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return {\n checks,\n diagnostics:\n lastDiagnostics && lastDiagnostics.length\n ? lastDiagnostics\n : undefined,\n };\n}\n\nfunction evaluatePoliciesRaw(\n raw: unknown,\n serviceIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n) {\n const compiled = compilePolicies(raw);\n const evaluated = evaluateServicePolicies(\n compiled.policies,\n serviceIds,\n svcMap,\n tagId,\n visibleServiceIds,\n );\n return {\n ...evaluated,\n diagnostics: compiled.diagnostics,\n };\n}\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const scoped = scopeServiceIdsForRule(svcIds, r, visibleServiceIds);\n const ids = scoped.filter((id) =>\n matchesRuleFilter(getServiceCapability(svcMap, id), r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(getServiceCapability(svcMap, id), projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\") {\n errors.push(r.id ?? \"policy_error\");\n } else {\n warnings.push(r.id ?? \"policy_warning\");\n }\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction scopeServiceIdsForRule(\n serviceIds: (string | number)[],\n rule: DynamicRule,\n visibleServiceIds?: Set<string>,\n): ServiceIdRef[] {\n if (rule.scope !== \"visible_group\" || !visibleServiceIds) return serviceIds;\n return serviceIds.filter((id) => visibleServiceIds.has(String(id)));\n}\n\nfunction collectVisibleServiceIds(\n builder: Builder,\n tagId: string,\n selectedButtons: string[],\n): Set<string> {\n const out = new Set<string>();\n const props = builder.getProps();\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tag = tags.find((t) => t.id === tagId);\n if (tag?.service_id != null) out.add(String(tag.service_id));\n\n const visibleFieldIds = new Set(builder.visibleFields(tagId, selectedButtons));\n for (const field of fields) {\n if (!visibleFieldIds.has(field.id)) continue;\n\n if ((field as any).service_id != null) {\n out.add(String((field as any).service_id));\n }\n for (const option of field.options ?? []) {\n if ((option as any).service_id != null) {\n out.add(String((option as any).service_id));\n }\n }\n }\n\n return out;\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\") ? projection.slice(8) : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n","// src/utils/prune-fallbacks.ts\r\nimport type { ServiceProps, ServiceIdRef } from \"@/schema\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport { collectFailedFallbacks } from \"@/core\";\r\n\r\nexport type PrunedFallback = {\r\n nodeId: string;\r\n candidate: ServiceIdRef;\r\n reasons: string[]; // aggregated reasons that caused full-context failure\r\n contexts?: string[]; // tag contexts considered (for option nodes)\r\n};\r\n\r\nexport type PruneResult = {\r\n props: ServiceProps;\r\n removed: PrunedFallback[];\r\n};\r\n\r\n/**\r\n * Remove node-scoped fallback candidates that fail in ALL relevant contexts.\r\n * - Tag node: single context (the tag itself)\r\n * - Option node: contexts = parent field's bind_id tags\r\n * - Global fallbacks are NEVER pruned here (soft by design)\r\n */\r\nexport function pruneInvalidNodeFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings\r\n): PruneResult {\r\n const fb = props.fallbacks;\r\n if (!fb?.nodes || Object.keys(fb.nodes).length === 0) {\r\n return { props, removed: [] };\r\n }\r\n\r\n // 1) Build node → contexts (tag ids) and primary lookup\r\n const nodeContexts = new Map<string, string[]>();\r\n const nodePrimary = new Map<string, ServiceIdRef | undefined>();\r\n\r\n for (const nodeId of Object.keys(fb.nodes)) {\r\n const tag = props.filters.find(t => t.id === nodeId);\r\n if (tag) {\r\n nodeContexts.set(nodeId, [tag.id]);\r\n nodePrimary.set(nodeId, tag.service_id as any);\r\n continue;\r\n }\r\n // option node: locate parent field\r\n const field = props.fields.find(f => Array.isArray(f.options) && f.options.some(o => o.id === nodeId));\r\n if (field) {\r\n const contexts = toBindArray(field.bind_id);\r\n nodeContexts.set(nodeId, contexts);\r\n const opt = field.options!.find(o => o.id === nodeId)!;\r\n nodePrimary.set(nodeId, opt.service_id as any);\r\n continue;\r\n }\r\n // unknown node id → treat as no contexts & no primary\r\n nodeContexts.set(nodeId, []);\r\n nodePrimary.set(nodeId, undefined);\r\n }\r\n\r\n // 2) Gather diagnostics (per context). We use dev mode collection to get granular reasons.\r\n const diags = collectFailedFallbacks(props, services, { ...settings, mode: 'dev' });\r\n\r\n // 3) Decide which (nodeId, candidate) pairs fail in ALL contexts\r\n const failuresByPair = new Map<string, { reasons: Set<string>; contexts: Set<string> }>();\r\n const totalContextsByNode = new Map<string, number>();\r\n\r\n for (const [nodeId, ctxs] of nodeContexts.entries()) {\r\n totalContextsByNode.set(nodeId, Math.max(1, ctxs.length)); // at least 1 for tag/no-context cases\r\n }\r\n\r\n for (const d of diags) {\r\n if (d.scope !== 'node') continue;\r\n const key = `${d.nodeId}::${String(d.candidate)}`;\r\n let rec = failuresByPair.get(key);\r\n if (!rec) {\r\n rec = { reasons: new Set<string>(), contexts: new Set<string>() };\r\n failuresByPair.set(key, rec);\r\n }\r\n rec.reasons.add(d.reason);\r\n if (d.tagContext) rec.contexts.add(d.tagContext);\r\n // For node-level reasons not tied to a context, mark all contexts as failed by leaving contexts set empty;\r\n // we'll interpret empty-but-has-reasons as global failure later when totals == 1.\r\n }\r\n\r\n // 4) Build a pruned copy of fallbacks.nodes\r\n const prunedNodes: Record<string, ServiceIdRef[]> = {};\r\n const removed: PrunedFallback[] = [];\r\n\r\n for (const [nodeId, list] of Object.entries(fb.nodes)) {\r\n const contexts = nodeContexts.get(nodeId) ?? [];\r\n const totalContexts = Math.max(1, contexts.length);\r\n const keep: ServiceIdRef[] = [];\r\n\r\n for (const cand of list) {\r\n const key = `${nodeId}::${String(cand)}`;\r\n const rec = failuresByPair.get(key);\r\n\r\n // Not present in failures → keep\r\n if (!rec) {\r\n keep.push(cand);\r\n continue;\r\n }\r\n\r\n const failedContextsCount = rec.contexts.size > 0 ? rec.contexts.size : totalContexts;\r\n const failsAll = failedContextsCount >= totalContexts;\r\n\r\n if (failsAll) {\r\n removed.push({\r\n nodeId,\r\n candidate: cand,\r\n reasons: Array.from(rec.reasons),\r\n contexts: contexts.length ? contexts.slice() : undefined,\r\n });\r\n } else {\r\n keep.push(cand); // passes in at least one context\r\n }\r\n }\r\n\r\n if (keep.length) prunedNodes[nodeId] = keep;\r\n }\r\n\r\n const outProps: ServiceProps = {\r\n ...props,\r\n fallbacks: {\r\n ...(props.fallbacks?.global ? { global: props.fallbacks!.global } : {}),\r\n ...(Object.keys(prunedNodes).length ? { nodes: prunedNodes } : {}),\r\n }\r\n };\r\n\r\n return { props: outProps, removed };\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction toBindArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}","// src/utils/build-order-snapshot.ts\r\n\r\nimport type {\r\n FallbackDiagnostics,\r\n OrderSnapshot,\r\n QuantityRule,\r\n Scalar,\r\n ServiceFallbacks,\r\n UtilityLineItem,\r\n UtilityMode,\r\n} from \"@/schema/order\";\r\nimport type {\n DgpServiceCapability,\n Field,\n FieldOption,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { Builder } from \"@/core\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport { isMultiField } from \"./index\";\r\nimport type { PruneResult } from \"./prune-fallbacks\";\r\nimport { pruneInvalidNodeFallbacks } from \"./prune-fallbacks\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport {\n constraintFitOk,\n getServiceCapability,\n normalizeRatePolicy,\n rateOk,\n} from \"./util\";\n\r\n/* ───────────────────────── Public types ───────────────────────── */\r\n\r\nexport type BuildOrderSnapshotSettings = {\r\n mode?: \"prod\" | \"dev\";\r\n hostDefaultQuantity?: number;\r\n /** Full fallback policy */\r\n fallback?: FallbackSettings;\r\n workspaceId?: string;\r\n builderCommit?: string;\r\n};\r\n\r\nexport type BuildOrderSelection = {\r\n /** Single active context (one tag) coming from Selection */\r\n activeTagId: string;\r\n /** Non-option inputs, keyed by fieldId (will be remapped to field.name in the payload) */\r\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\r\n /** Option selections, keyed by fieldId → optionId[] */\r\n optionSelectionsByFieldId: Record<string, string[]>;\r\n selectedKeys?: string[];\r\n /**\r\n * Selection visit order for options (optional, improves \"first option wins primary\" determinism).\r\n * If omitted, iteration order falls back to Object.entries(optionSelectionsByFieldId).\r\n */\r\n optionTraversalOrder?: Array<{ fieldId: string; optionId: string }>;\r\n};\r\n\r\n/* ───────────────────────── Entry point ───────────────────────── */\r\n\r\nexport function buildOrderSnapshot(\r\n props: ServiceProps,\r\n builder: Builder,\r\n selection: BuildOrderSelection,\r\n services: DgpServiceMap,\r\n settings: BuildOrderSnapshotSettings = {},\r\n): OrderSnapshot {\r\n const mode: \"prod\" | \"dev\" = settings.mode ?? \"prod\";\r\n const hostDefaultQty: number = Number.isFinite(\r\n settings.hostDefaultQuantity ?? 1,\r\n )\r\n ? (settings.hostDefaultQuantity as number)\r\n : 1;\r\n\r\n // Default fallback policy (strict in prod; diagnostics in dev)\r\n const fbSettings: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(settings.fallback ?? {}),\n };\r\n\r\n const builtAt: string = new Date().toISOString();\r\n const tagId: string = selection.activeTagId;\r\n\r\n // 1) Resolve visible fields for the single context\r\n const selectedButtonKeys: string[] =\r\n selection.selectedKeys ??\r\n toSelectedOptionKeys(selection.optionSelectionsByFieldId);\r\n const visibleFieldIds: string[] = builder.visibleFields(\r\n tagId,\r\n selectedButtonKeys,\r\n );\r\n\r\n // Indexes\r\n const tagById: Map<string, Tag> = new Map(\r\n (props.filters ?? []).map((t) => [t.id, t]),\r\n );\r\n const fieldById: Map<string, Field> = new Map(\r\n (props.fields ?? []).map((f) => [f.id, f]),\r\n );\r\n const tagConstraints:\r\n | Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>\r\n | undefined = tagById.get(tagId)?.constraints ?? undefined;\r\n\r\n // 2) Selection.fields (id, type, selectedOptions?)\r\n const selectionFields = visibleFieldIds\r\n .map((fid) => fieldById.get(fid))\r\n .filter((f): f is Field => !!f)\r\n .map((f) => {\r\n const optIds: string[] | undefined = isOptionBased(f)\r\n ? (selection.optionSelectionsByFieldId[f.id] ?? [])\r\n : undefined;\r\n return {\r\n id: f.id,\r\n type: String(f.type),\r\n ...(optIds && optIds.length ? { selectedOptions: optIds } : {}),\r\n };\r\n });\r\n\r\n // 3) Inputs (form by field.name, selections by fieldId)\r\n const { formValues, selections } = buildInputs(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n );\r\n\r\n // 4) Quantity\r\n const qtyRes = resolveQuantity(\n visibleFieldIds,\n fieldById,\n tagById,\n selection,\n tagId,\n hostDefaultQty,\n );\n const quantity: number = qtyRes.quantity;\r\n const quantitySource = qtyRes.source;\r\n\r\n // 5) Services and serviceMap (UPDATED behavior: tag default is default; any option with service_id is included; first becomes primary)\r\n const { serviceMap, servicesList } = resolveServices(\r\n tagId,\r\n visibleFieldIds,\r\n selection,\r\n tagById,\r\n fieldById,\r\n );\r\n\r\n const { min, max } = resolveMinMax(servicesList, services);\r\n\r\n // 6) Fallbacks — client-side conservative prune (keeps only relevant-to-selection)\r\n const prunedFallbacks = pruneFallbacksConservative(\r\n props.fallbacks as unknown as ServiceFallbacks | undefined,\r\n { tagId, constraints: tagConstraints, serviceMap, servicesList },\r\n services,\r\n fbSettings,\r\n );\r\n\r\n // 7) Utilities — line items derived from utility fields/options\r\n const utilities = collectUtilityLineItems(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n quantity,\r\n );\r\n\r\n // 8) Dev warnings (fallback diagnostics + form/utility hints)\r\n const warnings: OrderSnapshot[\"warnings\"] | undefined =\r\n mode === \"dev\"\r\n ? buildDevWarnings(\r\n props,\r\n services,\r\n tagId,\r\n serviceMap,\r\n prunedFallbacks.original,\r\n prunedFallbacks.pruned,\r\n fieldById,\r\n visibleFieldIds,\r\n selection,\r\n )\r\n : undefined;\r\n\r\n // 9) Meta.context (single-tag effective constraints + nodeContexts)\r\n const snapshotPolicy = toSnapshotPolicy(fbSettings);\r\n const meta = {\r\n schema_version: props.schema_version,\r\n workspaceId: settings.workspaceId,\r\n builder: settings.builderCommit\r\n ? { commit: settings.builderCommit }\r\n : undefined,\r\n context: {\r\n tag: tagId,\r\n constraints: (tagConstraints ?? {}) as Record<\r\n \"refill\" | \"cancel\" | \"dripfeed\",\r\n boolean | undefined\r\n >,\r\n nodeContexts: buildNodeContexts(\r\n tagId,\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n ),\r\n policy: snapshotPolicy,\r\n },\r\n };\r\n\r\n const snapshot: OrderSnapshot = {\r\n version: \"1\",\r\n mode,\r\n builtAt,\r\n selection: {\r\n tag: tagId,\r\n buttons: selectedButtonKeys,\r\n fields: selectionFields,\r\n },\r\n inputs: {\r\n form: formValues,\r\n selections,\r\n },\r\n\r\n min,\r\n max: max ?? min,\r\n\r\n quantity,\r\n quantitySource,\r\n services: servicesList,\r\n serviceMap,\r\n ...(prunedFallbacks.pruned\r\n ? { fallbacks: prunedFallbacks.pruned }\r\n : {}),\r\n ...(utilities.length ? { utilities } : {}),\r\n ...(warnings ? { warnings } : {}),\r\n meta,\r\n };\r\n\r\n return snapshot;\r\n}\r\n\r\n/* ───────────────────────── Helpers ───────────────────────── */\r\n\r\nfunction isOptionBased(f: Field): boolean {\r\n const hasOptions: boolean =\r\n Array.isArray(f.options) && f.options.length > 0;\r\n return hasOptions || isMultiField(f);\r\n}\r\n\r\nfunction toSelectedOptionKeys(byField: Record<string, string[]>): string[] {\r\n const keys: string[] = [];\r\n for (const [fieldId, optionIds] of Object.entries(byField ?? {})) {\r\n for (const optId of optionIds ?? []) {\r\n keys.push(`${fieldId}::${optId}`);\r\n }\r\n }\r\n return keys;\r\n}\r\n\r\nfunction isServicedBased(field: Field) {\r\n if (field.service_id) return true;\r\n return !!(field.options && field.options.some((item) => item.service_id));\r\n}\r\n\r\nfunction buildInputs(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): {\r\n formValues: Record<string, Scalar | Scalar[]>;\r\n selections: Record<string, string[]>;\r\n} {\r\n const formValues: Record<string, Scalar | Scalar[]> = {};\r\n const selections: Record<string, string[]> = {};\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f: Field | undefined = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const selOptIds: string[] | undefined =\r\n selection.optionSelectionsByFieldId[fid];\r\n if (selOptIds && selOptIds.length) {\r\n selections[fid] = [...selOptIds];\r\n }\r\n\r\n // Only non-option fields contribute to form values; key by field.name\r\n if (!isServicedBased(f)) {\r\n const name: string | undefined = f.name;\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[fid];\r\n if (!name || val === undefined) continue;\r\n formValues[name] = val;\r\n }\r\n }\r\n\r\n return { formValues, selections };\r\n}\r\n\r\n/* ───────────────── Quantity ───────────────── */\r\n\r\nfunction resolveQuantity(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n tagById: Map<string, Tag>,\n selection: BuildOrderSelection,\n tagId: string,\n hostDefault: number,\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } {\n // Precedence:\n // 1) First visible field with a valid quantity rule -> evaluate\n // 2) Selected option defaults, then visible button-style field defaults, then active tag default\n // 3) Host default\n for (const fid of visibleFieldIds) {\n const f: Field | undefined = fieldById.get(fid);\n if (!f) continue;\n const rule: QuantityRule | undefined = readQuantityRule(\r\n (f.meta as any)?.quantity,\r\n );\n if (!rule) continue;\n\n const raw: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[fid];\n const evaluated = evaluateQuantityRule(rule, raw);\n if (Number.isFinite(evaluated) && (evaluated as number) > 0) {\n return {\n quantity: evaluated as number,\n source: { kind: \"field\", id: f.id, rule },\n };\n }\n\n break;\n }\n\n const nodeDefault = resolveNodeDefaultQuantity(\n visibleFieldIds,\n fieldById,\n tagById,\n selection,\n tagId,\n );\n if (nodeDefault) return nodeDefault;\n\n return {\n quantity: hostDefault,\n source: { kind: \"default\", defaultedFromHost: true },\n };\n}\n\r\nfunction readQuantityRule(v: unknown): QuantityRule | undefined {\n if (!v || typeof v !== \"object\") return undefined;\n const src = v as QuantityRule;\n if (\r\n src.valueBy !== \"value\" &&\r\n src.valueBy !== \"length\" &&\r\n src.valueBy !== \"eval\"\r\n )\r\n return undefined;\n const out: QuantityRule = { valueBy: src.valueBy };\n if (src.code && typeof src.code === \"string\") out.code = src.code;\n if (typeof src.multiply === \"number\" && Number.isFinite(src.multiply)) {\n out.multiply = src.multiply;\n }\n if (typeof src.fallback === \"number\" && Number.isFinite(src.fallback)) {\n out.fallback = src.fallback;\n }\n if (src.clamp && typeof src.clamp === \"object\") {\n const min =\n typeof src.clamp.min === \"number\" && Number.isFinite(src.clamp.min)\n ? src.clamp.min\n : undefined;\n const max =\n typeof src.clamp.max === \"number\" && Number.isFinite(src.clamp.max)\n ? src.clamp.max\n : undefined;\n if (min !== undefined || max !== undefined) {\n out.clamp = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n };\n }\n }\n return out;\n}\n\nfunction evaluateQuantityRule(\n rule: QuantityRule,\n raw: Scalar | Scalar[] | undefined,\n): number {\n const evaluated = evaluateRawQuantityRule(rule, raw);\n if (Number.isFinite(evaluated)) {\n const adjusted = applyQuantityTransforms(evaluated as number, rule);\n if (Number.isFinite(adjusted) && adjusted > 0) return adjusted;\n }\n\n if (typeof rule.fallback === \"number\" && Number.isFinite(rule.fallback)) {\n const fallback = applyClamp(rule.fallback, rule.clamp);\n if (Number.isFinite(fallback) && fallback > 0) return fallback;\n }\n\n return NaN;\n}\n\nfunction evaluateRawQuantityRule(\n rule: QuantityRule,\n raw: Scalar | Scalar[] | undefined,\n): number {\n switch (rule.valueBy) {\n case \"value\": {\n const n = Number(Array.isArray(raw) ? (raw as Scalar[])[0] : raw);\n return Number.isFinite(n) ? n : NaN;\r\n }\r\n case \"length\": {\r\n if (Array.isArray(raw)) return raw.length;\r\n if (typeof raw === \"string\") return raw.length;\r\n return NaN;\r\n }\r\n case \"eval\": {\r\n try {\r\n if (!rule.code || typeof rule.code !== \"string\") return NaN;\r\n // eslint-disable-next-line no-new-func\r\n const fn = new Function(\r\n \"value\",\r\n \"values\",\r\n `return (function(){ ${rule.code}\\n})()`,\r\n );\r\n const single = Array.isArray(raw) ? (raw as Scalar[])[0] : raw;\r\n const values = Array.isArray(raw)\r\n ? (raw as Scalar[])\r\n : raw !== undefined\r\n ? [raw]\r\n : [];\r\n const out = fn(single, values);\r\n const n = Number(out);\r\n return Number.isFinite(n) ? n : NaN;\r\n } catch {\r\n return NaN;\r\n }\r\n }\r\n default:\n return NaN;\n }\n}\n\nfunction applyQuantityTransforms(value: number, rule: QuantityRule): number {\n let next = value;\n if (typeof rule.multiply === \"number\" && Number.isFinite(rule.multiply)) {\n next *= rule.multiply;\n }\n return applyClamp(next, rule.clamp);\n}\n\nfunction applyClamp(\n value: number,\n clamp: QuantityRule[\"clamp\"] | undefined,\n): number {\n let next = value;\n if (clamp?.min !== undefined) next = Math.max(next, clamp.min);\n if (clamp?.max !== undefined) next = Math.min(next, clamp.max);\n return next;\n}\n\nfunction resolveNodeDefaultQuantity(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n tagById: Map<string, Tag>,\n selection: BuildOrderSelection,\n tagId: string,\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } | undefined {\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\n for (const { fieldId, optionId } of optionVisit) {\n if (!visibleFieldIds.includes(fieldId)) continue;\n const field = fieldById.get(fieldId);\n const option = field?.options?.find((item) => item.id === optionId);\n const quantityDefault = readQuantityDefault(\n (option?.meta as any)?.quantityDefault,\n );\n if (quantityDefault !== undefined) {\n return {\n quantity: quantityDefault,\n source: { kind: \"option\", id: optionId },\n };\n }\n }\n\n for (const fieldId of visibleFieldIds) {\n const field = fieldById.get(fieldId);\n if (!field) continue;\n const isButtonStyle =\n field.button === true ||\n (Array.isArray(field.options) && field.options.length > 0);\n if (!isButtonStyle) continue;\n const quantityDefault = readQuantityDefault(\n (field as any).quantityDefault,\n );\n if (quantityDefault !== undefined) {\n return {\n quantity: quantityDefault,\n source: { kind: \"field\", id: field.id },\n };\n }\n }\n\n const tagQuantityDefault = readQuantityDefault(\n (tagById.get(tagId)?.meta as any)?.quantityDefault,\n );\n if (tagQuantityDefault !== undefined) {\n return {\n quantity: tagQuantityDefault,\n source: { kind: \"tag\", id: tagId },\n };\n }\n\n return undefined;\n}\n\nfunction readQuantityDefault(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : undefined;\n}\n\r\n/* ───────────────── Services (UPDATED) ───────────────── */\r\n\r\nfunction resolveServices(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n tagById: Map<string, Tag>,\r\n fieldById: Map<string, Field>,\r\n): {\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n} {\r\n const serviceMap: Record<string, Array<string | number>> = {};\r\n const ordered: Array<string | number> = [];\r\n\r\n // 1) Tentative primary from tag default (if any) — default only.\r\n const tag = tagById.get(tagId);\r\n let primary: string | number | undefined;\r\n let primaryOrigin: \"tag\" | \"option\" | undefined;\r\n\r\n if (tag?.service_id !== undefined) {\r\n primary = tag.service_id;\r\n primaryOrigin = \"tag\";\r\n // We'll only record it in lists if it survives override.\r\n }\r\n\r\n // 2) Walk option selections in a deterministic order\r\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\r\n\r\n for (const { fieldId, optionId } of optionVisit) {\r\n // only consider options whose field is visible in this group\r\n if (!visibleFieldIds.includes(fieldId)) continue;\r\n\r\n const f = fieldById.get(fieldId);\r\n if (!f || !Array.isArray(f.options)) continue;\r\n\r\n const opt = f.options.find((o) => o.id === optionId);\r\n if (!opt) continue;\r\n\r\n const role = (opt.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\"\r\n | string;\r\n const sid = opt.service_id;\r\n\r\n // Defensive: ignore if a (misconfigured) utility has service_id.\r\n if (role === \"utility\") continue;\r\n\r\n if (sid !== undefined) {\r\n // First option with service_id overrides tag default primary.\r\n if (primary === undefined || primaryOrigin === \"tag\") {\r\n primary = sid;\r\n primaryOrigin = \"option\";\r\n // Since primary owns index 0, push it first\r\n ordered.length = 0; // clear any tentative tag default\r\n ordered.push(primary);\r\n } else {\r\n // Additional option services append\r\n ordered.push(sid);\r\n }\r\n // Map origin node → sid\r\n pushService(serviceMap, optionId, sid);\r\n }\r\n }\r\n\r\n // 3) If no option established a primary, use tag default (if present)\r\n if (primaryOrigin !== \"option\" && primary !== undefined) {\r\n ordered.unshift(primary);\r\n pushService(serviceMap, tagId, primary);\r\n } else {\r\n // If overridden, we do NOT record tagId→default in serviceMap\r\n }\r\n\r\n const servicesList = dedupeByString(ordered);\r\n return { serviceMap, servicesList };\r\n}\r\n\r\nfunction buildOptionVisitOrder(\r\n selection: BuildOrderSelection,\r\n fieldById: Map<string, Field>,\r\n): Array<{ fieldId: string; optionId: string }> {\r\n if (\r\n selection.optionTraversalOrder &&\r\n selection.optionTraversalOrder.length\r\n ) {\r\n return selection.optionTraversalOrder.slice();\r\n }\r\n // fallback: expand optionSelectionsByFieldId in insertion-ish order\r\n const out: Array<{ fieldId: string; optionId: string }> = [];\r\n for (const [fid, optIds] of Object.entries(\r\n selection.optionSelectionsByFieldId ?? {},\r\n )) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n for (const oid of optIds ?? [])\r\n out.push({ fieldId: fid, optionId: oid });\r\n }\r\n return out;\r\n}\r\n\r\nfunction pushService(\r\n map: Record<string, Array<string | number>>,\r\n nodeId: string,\r\n sid: string | number,\r\n): void {\r\n if (!map[nodeId]) map[nodeId] = [];\r\n map[nodeId].push(sid);\r\n}\r\n\r\nfunction dedupeByString<T extends string | number>(arr: T[]): T[] {\r\n const s = new Set<string>();\r\n const out: T[] = [];\r\n for (const v of arr) {\r\n const key = String(v);\r\n if (s.has(key)) continue;\r\n s.add(key);\r\n out.push(v);\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────── Fallback pruning (client-conservative) ───────────── */\r\n\r\ntype PruneEnv = {\r\n tagId: string;\r\n constraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n};\r\n\r\nfunction pruneFallbacksConservative(\r\n fallbacks: ServiceFallbacks | undefined,\r\n env: PruneEnv,\r\n svcMap: DgpServiceMap,\r\n policy: FallbackSettings,\r\n): { pruned?: ServiceFallbacks; original?: ServiceFallbacks } {\r\n if (!fallbacks) return { pruned: undefined, original: undefined };\r\n\r\n // Prefer shared helper (keeps behavior consistent with tests)\r\n try {\r\n const { props: prunedProps }: PruneResult = pruneInvalidNodeFallbacks(\r\n {\r\n filters: [],\r\n fields: [],\r\n schema_version: \"1.0\",\r\n fallbacks,\r\n } as unknown as ServiceProps,\r\n svcMap,\r\n policy,\r\n );\r\n return {\r\n pruned: prunedProps.fallbacks as unknown as\r\n | ServiceFallbacks\r\n | undefined,\r\n original: fallbacks,\r\n };\r\n } catch {\r\n // Minimal inline conservative prune (selection-aware)\r\n const out: ServiceFallbacks = {};\r\n const requireFit: boolean = policy.requireConstraintFit ?? true;\r\n\r\n // Nodes: keep only for nodes present in env.serviceMap; apply rate & (optional) constraints against tag\r\n if ((fallbacks as any).nodes) {\r\n const keptNodes: Record<string, Array<string | number>> = {};\r\n for (const [nodeId, candidates] of Object.entries(\r\n (fallbacks as any).nodes as Record<\r\n string,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!env.serviceMap[nodeId]) continue;\r\n const primary = (env.serviceMap[nodeId] ?? [])[0];\r\n const kept: Array<string | number> = [];\r\n for (const cand of candidates ?? []) {\r\n if (!rateOk(svcMap, cand, primary, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptNodes[nodeId] = kept;\r\n }\r\n if (Object.keys(keptNodes).length) (out as any).nodes = keptNodes;\r\n }\r\n\r\n // Global: keep only primaries that are present in selection; apply rate & (optional) constraints\r\n if ((fallbacks as any).global) {\r\n const keptGlobal: Record<\r\n string | number,\r\n Array<string | number>\r\n > = {};\r\n const present = new Set(env.servicesList.map((sid) => String(sid)));\r\n for (const [primary, cands] of Object.entries(\r\n (fallbacks as any).global as Record<\r\n string | number,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!present.has(String(primary))) continue;\r\n const primId: string | number = isFiniteNumber(primary)\r\n ? Number(primary)\r\n : (primary as any);\r\n const kept: Array<string | number> = [];\r\n for (const cand of cands ?? []) {\r\n if (!rateOk(svcMap, cand, primId, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptGlobal[primId] = kept;\r\n }\r\n if (Object.keys(keptGlobal).length)\r\n (out as any).global = keptGlobal;\r\n }\r\n\r\n return {\r\n pruned: Object.keys(out).length ? out : undefined,\r\n original: fallbacks,\r\n };\r\n }\r\n}\r\n\r\nfunction isFiniteNumber(v: unknown): v is number {\r\n return typeof v === \"number\" && Number.isFinite(v);\r\n}\r\n\r\n/* ───────────────── Utilities collection ───────────────── */\r\n\r\ntype UtilityMarker = {\n mode: UtilityMode;\n rate: number;\n valueBy?: \"value\" | \"length\";\n percentBase?: \"service_total\" | \"base_service\" | \"all\";\n label?: string;\n};\n\r\nfunction collectUtilityLineItems(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n quantity: number,\r\n): UtilityLineItem[] {\r\n const items: UtilityLineItem[] = [];\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const isUtilityField = (f.pricing_role ?? \"base\") === \"utility\";\r\n const marker = readUtilityMarker((f.meta as any)?.utility);\r\n\r\n // Field-based utility\r\n if (isUtilityField && marker) {\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n f.id,\r\n marker,\r\n quantity,\r\n val,\r\n );\r\n if (item) items.push(item);\r\n }\r\n\r\n // Option-based utility (only if selected)\r\n if (Array.isArray(f.options) && f.options.length) {\r\n const selectedOptIds =\r\n selection.optionSelectionsByFieldId[f.id] ?? [];\r\n if (selectedOptIds.length) {\r\n const optById = new Map<string, FieldOption>(\r\n f.options.map((o) => [o.id, o]),\r\n );\r\n for (const oid of selectedOptIds) {\r\n const opt = optById.get(oid);\r\n if (!opt) continue;\r\n if ((opt.pricing_role ?? \"base\") !== \"utility\") continue;\r\n const om = readUtilityMarker((opt.meta as any)?.utility);\r\n if (!om) continue;\r\n // For per_value on options, we use the parent field's value as the base value\r\n const parentVal: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n opt.id,\r\n om,\r\n quantity,\r\n parentVal,\r\n );\r\n if (item) items.push(item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction readUtilityMarker(v: unknown): UtilityMarker | undefined {\r\n if (!v || typeof v !== \"object\") return undefined;\r\n const src = v as UtilityMarker;\r\n if (!src.mode || typeof src.rate !== \"number\" || !Number.isFinite(src.rate))\r\n return undefined;\r\n if (\r\n src.mode !== \"flat\" &&\r\n src.mode !== \"per_quantity\" &&\r\n src.mode !== \"per_value\" &&\r\n src.mode !== \"percent\"\r\n )\n return undefined;\n const out: UtilityMarker = { mode: src.mode, rate: src.rate };\n if (src.valueBy === \"value\" || src.valueBy === \"length\")\n out.valueBy = src.valueBy;\n if (\n src.percentBase === \"service_total\" ||\n src.percentBase === \"base_service\" ||\n src.percentBase === \"all\"\n ) {\n out.percentBase = src.percentBase;\n }\n if (typeof src.label === \"string\" && src.label.trim()) {\n out.label = src.label.trim();\n }\n return out;\n}\n\r\nfunction buildUtilityItemFromMarker(\r\n nodeId: string,\r\n marker: UtilityMarker,\r\n quantity: number,\r\n value: Scalar | Scalar[] | undefined,\r\n): UtilityLineItem | undefined {\r\n const base: UtilityLineItem = {\n nodeId,\n mode: marker.mode,\n rate: marker.rate,\n ...(marker.percentBase ? { percentBase: marker.percentBase } : {}),\n ...(marker.label ? { label: marker.label } : {}),\n inputs: { quantity },\n };\n if (marker.mode === \"per_value\") {\n base.inputs.valueBy = marker.valueBy ?? \"value\";\n if (marker.valueBy === \"length\") {\n base.inputs.value = Array.isArray(value)\r\n ? value.length\n : typeof value === \"string\"\n ? value.length\n : 0;\n } else {\n base.inputs.value = Array.isArray(value)\n ? (value[0] ?? null)\n : (value ?? null);\r\n }\r\n }\r\n return base;\r\n}\r\n\r\n/* ───────────────── meta.context helpers ──────────────── */\r\n\r\nfunction buildNodeContexts(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): Record<string, string | null> {\r\n const ctx: Record<string, string | null> = {};\r\n ctx[tagId] = tagId; // tag maps to itself\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const binds = normalizeBindIds(f.bind_id);\r\n const applicable = binds.has(tagId);\r\n\r\n const selectedOptIds = selection.optionSelectionsByFieldId[fid] ?? [];\r\n for (const oid of selectedOptIds) {\r\n ctx[oid] = applicable ? tagId : null;\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\nfunction normalizeBindIds(bind: string | string[] | undefined): Set<string> {\r\n const out = new Set<string>();\r\n if (!bind) return out;\r\n if (Array.isArray(bind)) {\r\n for (const b of bind) if (b) out.add(String(b));\r\n } else {\r\n out.add(String(bind));\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────── Dev warnings ───────────────── */\r\n\r\nfunction buildDevWarnings(\r\n props: ServiceProps,\r\n svcMap: DgpServiceMap,\r\n _tagId: string,\r\n _snapshotServiceMap: Record<string, Array<string | number>>,\r\n originalFallbacks: ServiceFallbacks | undefined,\r\n _prunedFallbacks: ServiceFallbacks | undefined,\r\n fieldById: Map<string, Field>,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n): OrderSnapshot[\"warnings\"] | undefined {\r\n const out: OrderSnapshot[\"warnings\"] = {};\r\n\r\n // Fallback diagnostics (non-fatal). Call only if a global helper is present at runtime.\r\n const maybeCollectFailed:\r\n | ((\r\n p: ServiceProps,\r\n sm: DgpServiceMap,\r\n s: { mode: \"dev\" },\r\n ) => FallbackDiagnostics[])\r\n | undefined = (globalThis as any).collectFailedFallbacks;\r\n\r\n try {\r\n if (maybeCollectFailed && originalFallbacks) {\r\n const diags = maybeCollectFailed(\r\n {\r\n ...props,\r\n fallbacks: originalFallbacks,\r\n } as ServiceProps,\r\n svcMap,\r\n { mode: \"dev\" },\r\n );\r\n if (diags && diags.length) {\r\n out.fallbacks = diags;\r\n }\r\n }\r\n } catch {\r\n // ignore diagnostics failures in dev\r\n }\r\n\r\n // Utility/Form warnings: missing field.name while value present (only for non-option fields)\r\n const utilityWarnings: Array<{ nodeId: string; reason: string }> = [];\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n const hasVal = selection.formValuesByFieldId[fid] !== undefined;\r\n if (hasVal && !f.name && !isOptionBased(f)) {\r\n utilityWarnings.push({\r\n nodeId: fid,\r\n reason: \"missing_field_name_for_form_value\",\r\n });\r\n }\r\n }\r\n if (utilityWarnings.length) {\r\n (out as any).utility = utilityWarnings;\r\n }\r\n\r\n if (!(out as any).fallbacks && !(out as any).utility) return undefined;\r\n return out;\r\n}\r\n\r\n/* ───────────────── Mapping: internal settings → SnapshotContext.policy ───────────────── */\r\n\r\nfunction toSnapshotPolicy(settings: FallbackSettings): {\n ratePolicy:\n | { kind: \"eq_primary\" }\n | { kind: \"lte_primary\"; pct: number }\n | { kind: \"within_pct\"; pct: number }\n | { kind: \"at_least_pct_lower\"; pct: number };\n requireConstraintFit: boolean;\n} {\n const requireConstraintFit = settings.requireConstraintFit ?? true;\n const rp = normalizeRatePolicy(settings.ratePolicy);\n return { ratePolicy: rp, requireConstraintFit };\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction resolveMinMax(\r\n servicesList: Array<string | number>,\r\n services: DgpServiceMap,\r\n): { min: number; max?: number } {\r\n let min: number | undefined = undefined;\r\n let max: number | undefined = undefined;\r\n\r\n for (const sid of servicesList) {\r\n const cap = getCap(services, sid);\r\n if (!cap) continue;\r\n\r\n if (typeof cap.min === \"number\" && Number.isFinite(cap.min)) {\r\n min = min === undefined ? cap.min : Math.min(min, cap.min);\r\n }\r\n if (typeof cap.max === \"number\" && Number.isFinite(cap.max)) {\r\n max = max === undefined ? cap.max : Math.max(max, cap.max);\r\n }\r\n }\r\n\r\n return { min: min ?? 1, ...(max !== undefined ? { max } : {}) };\r\n}\r\n","// src/core/fallback-editor.ts\r\n\r\nimport { collectFailedFallbacks, getEligibleFallbacks, getFallbackRegistrationInfo } from \"@/core\";\r\n\r\nimport type {\r\n FallbackCandidateCheck,\r\n FallbackCheckReason,\r\n FallbackCheckResult,\r\n FallbackEditorOptions,\r\n FallbackEditorState,\r\n FallbackMutationOptions,\r\n FallbackRegistration,\r\n FallbackScopeRef,\r\n Field,\r\n FieldOption,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n ServiceProps,\r\n Tag\r\n} from \"@/schema\";\r\n\r\n/**\r\n * Keep the editor contract exactly as discussed:\r\n * - mutates only ServiceFallback (internal clone)\r\n * - props are read-only context\r\n * - get(serviceId) is service-centric\r\n * - getScope(context) is raw scope access\r\n */\r\nexport interface FallbackEditor {\r\n state(): FallbackEditorState;\r\n value(): ServiceFallback;\r\n reset(): FallbackEditorState;\r\n\r\n /** Service-centric: all registrations that belong to this primary service */\r\n get(serviceId: ServiceIdRef): FallbackRegistration[];\r\n\r\n /** Exact/raw scope access */\r\n getScope(context: FallbackScopeRef): ServiceIdRef[];\r\n\r\n /** Validation preview */\r\n check(\r\n context: FallbackScopeRef,\r\n candidates?: ServiceIdRef[],\r\n ): FallbackCheckResult;\r\n\r\n add(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n addMany(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n remove(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n ): FallbackEditorState;\r\n\r\n replace(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n clear(context: FallbackScopeRef): FallbackEditorState;\r\n\r\n /**\r\n * Optional helper for picker UIs:\r\n * shows candidates that the core fallback resolver would currently accept.\r\n */\r\n eligible(\r\n context: FallbackScopeRef,\r\n options?: {\r\n exclude?: ServiceIdRef[];\r\n unique?: boolean;\r\n limit?: number;\r\n },\r\n ): ServiceIdRef[];\r\n}\r\n\r\ntype NodeRegistrationInfo =\r\n | {\r\n ok: true;\r\n primary: ServiceIdRef;\r\n tagContexts: string[];\r\n }\r\n | {\r\n ok: false;\r\n reasons: FallbackCheckReason[];\r\n };\r\n\r\nexport function createFallbackEditor(\r\n options: FallbackEditorOptions = {},\r\n): FallbackEditor {\r\n const original = cloneFallbacks(options.fallbacks);\r\n let current = cloneFallbacks(options.fallbacks);\r\n\r\n const props = options.props;\r\n const services = options.services ?? {};\r\n const settings = options.settings ?? {};\r\n\r\n function state(): FallbackEditorState {\r\n return {\r\n original: cloneFallbacks(original),\r\n current: cloneFallbacks(current),\r\n changed: !sameFallbacks(original, current),\r\n };\r\n }\r\n\r\n function value(): ServiceFallback {\r\n return cloneFallbacks(current);\r\n }\r\n\r\n function reset(): FallbackEditorState {\r\n current = cloneFallbacks(original);\r\n return state();\r\n }\r\n\r\n function get(serviceId: ServiceIdRef): FallbackRegistration[] {\r\n const out: FallbackRegistration[] = [];\r\n\r\n for (const [primary, list] of Object.entries(current.global ?? {})) {\r\n if (String(primary) !== String(serviceId)) continue;\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n services: [...(list ?? [])],\r\n });\r\n }\r\n\r\n if (!props) return out;\r\n\r\n for (const [nodeId, list] of Object.entries(current.nodes ?? {})) {\r\n const info = getFallbackRegistrationInfo(props, nodeId);\r\n if (String(info.primary) !== String(serviceId)) continue;\r\n\r\n out.push({\r\n scope: \"node\",\r\n scopeId: nodeId,\r\n primary: info.primary!,\r\n services: [...(list ?? [])],\r\n });\r\n }\r\n\r\n return out;\r\n }\r\n function getScope(context: FallbackScopeRef): ServiceIdRef[] {\r\n if (context.scope === \"global\") {\r\n return [...(current.global?.[context.primary] ?? [])];\r\n }\r\n return [...(current.nodes?.[context.nodeId] ?? [])];\r\n }\r\n\r\n function check(\r\n context: FallbackScopeRef,\r\n candidates?: ServiceIdRef[],\r\n ): FallbackCheckResult {\r\n const normalized = normalizeCandidateList(\r\n candidates ?? getScope(context),\r\n true,\r\n );\r\n\r\n if (context.scope === \"node\" && !props) {\r\n return {\r\n context,\r\n allowed: [],\r\n rejected: normalized.map((candidate) => ({\r\n candidate,\r\n ok: false,\r\n reasons: [\"missing_service_props\"],\r\n })),\r\n warnings: [\"missing_service_props\"],\r\n };\r\n }\r\n\r\n // Build a temporary fallback payload with only this scope updated,\r\n // then let the canonical fallback validator tell us what fails.\r\n const tempFallbacks = cloneFallbacks(current);\r\n\r\n if (context.scope === \"global\") {\r\n tempFallbacks.global ??= {};\r\n if (normalized.length)\r\n tempFallbacks.global[context.primary] = normalized;\r\n else delete tempFallbacks.global[context.primary];\r\n } else {\r\n tempFallbacks.nodes ??= {};\r\n if (normalized.length)\r\n tempFallbacks.nodes[context.nodeId] = normalized;\r\n else delete tempFallbacks.nodes[context.nodeId];\r\n }\r\n\r\n // Without props, global checking can still do minimal structural validation.\r\n if (!props) {\r\n if (context.scope !== \"global\") {\r\n return {\r\n context,\r\n allowed: [],\r\n rejected: normalized.map((candidate) => ({\r\n candidate,\r\n ok: false,\r\n reasons: [\"missing_service_props\"],\r\n })),\r\n warnings: [\"missing_service_props\"],\r\n };\r\n }\r\n\r\n const rejected: FallbackCandidateCheck[] = [];\r\n const allowed: ServiceIdRef[] = [];\r\n\r\n for (const candidate of normalized) {\r\n const reasons: FallbackCheckReason[] = [];\r\n\r\n if (String(candidate) === String(context.primary)) {\r\n reasons.push(\"self_reference\");\r\n }\r\n\r\n if (reasons.length) {\r\n rejected.push({ candidate, ok: false, reasons });\r\n } else {\r\n allowed.push(candidate);\r\n }\r\n }\r\n\r\n return {\r\n context,\r\n primary: context.primary,\r\n allowed,\r\n rejected,\r\n warnings: [],\r\n };\r\n }\r\n\r\n const fakeProps: ServiceProps = {\r\n ...props,\r\n fallbacks: tempFallbacks,\r\n };\r\n\r\n const diags = collectFailedFallbacks(fakeProps, services, {\r\n ...settings,\r\n mode: \"dev\",\r\n });\r\n\r\n const scoped = diags.filter((d) => {\r\n if (context.scope === \"global\") {\r\n return (\r\n d.scope === \"global\" &&\r\n String(d.primary) === String(context.primary)\r\n );\r\n }\r\n return (\r\n d.scope === \"node\" &&\r\n String(d.nodeId) === String(context.nodeId)\r\n );\r\n });\r\n\r\n const rejected: FallbackCandidateCheck[] = normalized\r\n .map((candidate) => {\r\n const reasons = scoped\r\n .filter((d) => String(d.candidate) === String(candidate))\r\n .map((d) => mapDiagReason(d.reason));\r\n\r\n return {\r\n candidate,\r\n ok: reasons.length === 0,\r\n reasons,\r\n };\r\n })\r\n .filter((row) => !row.ok);\r\n\r\n const allowed = normalized.filter(\r\n (candidate) =>\r\n !rejected.some(\r\n (r) => String(r.candidate) === String(candidate),\r\n ),\r\n );\r\n\r\n const info =\r\n context.scope === \"global\"\r\n ? { ok: true, primary: context.primary }\r\n : getNodeRegistrationInfo(props, context.nodeId);\r\n const primary = info?.ok ? info.primary : undefined;\r\n\r\n return {\r\n context,\r\n primary,\r\n allowed,\r\n rejected,\r\n warnings: [],\r\n };\r\n }\r\n\r\n function add(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n return addMany(context, [candidate], options);\r\n }\r\n\r\n function addMany(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n const existing = getScope(context);\r\n const merged = [...existing];\r\n\r\n const insertAt =\r\n typeof options?.index === \"number\"\r\n ? clamp(options.index, 0, merged.length)\r\n : undefined;\r\n\r\n const incoming = normalizeCandidateList(candidates, true).filter(\r\n (id) => !merged.some((x) => String(x) === String(id)),\r\n );\r\n\r\n if (insertAt === undefined) {\r\n merged.push(...incoming);\r\n } else {\r\n merged.splice(insertAt, 0, ...incoming);\r\n }\r\n\r\n return replace(context, merged, options);\r\n }\r\n\r\n function remove(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n ): FallbackEditorState {\r\n const next = getScope(context).filter(\r\n (id) => String(id) !== String(candidate),\r\n );\r\n return writeScope(context, next);\r\n }\r\n\r\n function replace(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n const strict = !!options?.strict;\r\n const normalized = normalizeCandidateList(candidates, true);\r\n const checked = check(context, normalized);\r\n const next = strict ? checked.allowed : normalized;\r\n return writeScope(context, next);\r\n }\r\n\r\n function clear(context: FallbackScopeRef): FallbackEditorState {\r\n return writeScope(context, []);\r\n }\r\n\r\n function eligible(\r\n context: FallbackScopeRef,\r\n opt?: {\r\n exclude?: ServiceIdRef[];\r\n unique?: boolean;\r\n limit?: number;\r\n },\r\n ): ServiceIdRef[] {\r\n if (!props) return [];\r\n\r\n if (context.scope === \"global\") {\r\n return getEligibleFallbacks({\r\n primary: context.primary,\r\n services,\r\n fallbacks: current,\r\n settings,\r\n props,\r\n exclude: opt?.exclude,\r\n unique: opt?.unique,\r\n limit: opt?.limit,\r\n });\r\n }\r\n\r\n const info = getFallbackRegistrationInfo(props, context.nodeId);\r\n if (!info.primary) return [];\r\n\r\n return getEligibleFallbacks({\r\n primary: info.primary,\r\n nodeId: context.nodeId,\r\n tagId: info.tagContexts[0],\r\n services,\r\n fallbacks: current,\r\n settings,\r\n props,\r\n exclude: opt?.exclude,\r\n unique: opt?.unique,\r\n limit: opt?.limit,\r\n });\r\n }\r\n\r\n function writeScope(\r\n context: FallbackScopeRef,\r\n nextList: ServiceIdRef[],\r\n ): FallbackEditorState {\r\n const next = cloneFallbacks(current);\r\n\r\n if (context.scope === \"global\") {\r\n next.global ??= {};\r\n if (nextList.length) {\r\n next.global[context.primary] = [...nextList];\r\n } else {\r\n delete next.global[context.primary];\r\n if (!Object.keys(next.global).length) delete next.global;\r\n }\r\n } else {\r\n next.nodes ??= {};\r\n if (nextList.length) {\r\n next.nodes[context.nodeId] = [...nextList];\r\n } else {\r\n delete next.nodes[context.nodeId];\r\n if (!Object.keys(next.nodes).length) delete next.nodes;\r\n }\r\n }\r\n\r\n current = next;\r\n return state();\r\n }\r\n\r\n return {\r\n state,\r\n value,\r\n reset,\r\n get,\r\n getScope,\r\n check,\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n eligible,\r\n };\r\n}\r\n\r\n/* -------------------------------- helpers ------------------------------- */\r\n\r\nfunction cloneFallbacks(input?: ServiceFallback): ServiceFallback {\r\n return {\r\n ...(input?.nodes ? { nodes: cloneRecordArray(input.nodes) } : {}),\r\n ...(input?.global ? { global: cloneRecordArray(input.global) } : {}),\r\n };\r\n}\r\n\r\nfunction cloneRecordArray<T extends string | number>(\r\n input: Record<string | number, T[]>,\r\n): Record<string | number, T[]> {\r\n const out: Record<string | number, T[]> = {};\r\n for (const [k, v] of Object.entries(input)) out[k] = [...(v ?? [])];\r\n return out;\r\n}\r\n\r\nfunction sameFallbacks(a?: ServiceFallback, b?: ServiceFallback): boolean {\r\n return JSON.stringify(a ?? {}) === JSON.stringify(b ?? {});\r\n}\r\n\r\nfunction normalizeCandidateList(\r\n input: ServiceIdRef[],\r\n preserveOrder: boolean,\r\n): ServiceIdRef[] {\r\n const out: ServiceIdRef[] = [];\r\n for (const item of input ?? []) {\r\n if (!isValidServiceIdRef(item)) continue;\r\n const exists = out.some((x) => String(x) === String(item));\r\n if (exists) continue;\r\n out.push(item);\r\n }\r\n return preserveOrder ? out : out;\r\n}\r\n\r\nfunction isValidServiceIdRef(value: unknown): value is ServiceIdRef {\r\n return (\r\n (typeof value === \"number\" && Number.isFinite(value)) ||\r\n (typeof value === \"string\" && value.trim().length > 0)\r\n );\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, n));\r\n}\r\n\r\n/**\r\n * Mirrors primaryForNode(...) semantics from core/fallback.ts:\r\n * - tag.id => tag.service_id\r\n * - option.id => option.service_id\r\n * - option tag contexts => bind_id array of parent field\r\n */\r\nfunction getNodeRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): NodeRegistrationInfo {\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n if (!isValidServiceIdRef((tag as Tag).service_id)) {\r\n return { ok: false, reasons: [\"no_primary\"] };\r\n }\r\n return {\r\n ok: true,\r\n primary: (tag as Tag).service_id as any,\r\n tagContexts: [tag.id],\r\n };\r\n }\r\n\r\n const hit = findOptionOwner(props.fields, nodeId);\r\n if (!hit) {\r\n return { ok: false, reasons: [\"node_not_found\"] };\r\n }\r\n\r\n if (!isValidServiceIdRef((hit.option as FieldOption).service_id)) {\r\n return { ok: false, reasons: [\"no_primary\"] };\r\n }\r\n\r\n return {\r\n ok: true,\r\n primary: (hit.option as FieldOption).service_id as any,\r\n tagContexts: bindIdsToArray(hit.field.bind_id),\r\n };\r\n}\r\n\r\nfunction findOptionOwner(\r\n fields: Field[],\r\n optionId: string,\r\n): { field: Field; option: FieldOption } | null {\r\n for (const field of fields) {\r\n for (const option of field.options ?? []) {\r\n if (option.id === optionId) return { field, option };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction bindIdsToArray(v: string | string[] | undefined): string[] {\r\n if (Array.isArray(v)) return v.filter(Boolean);\r\n return v ? [v] : [];\r\n}\r\n\r\nfunction mapDiagReason(reason: unknown): FallbackCheckReason {\r\n switch (String(reason)) {\r\n case \"unknown_service\":\r\n return \"unknown_service\";\r\n case \"no_primary\":\r\n return \"no_primary\";\r\n case \"rate_violation\":\r\n return \"rate_violation\";\r\n case \"constraint_mismatch\":\r\n return \"constraint_mismatch\";\r\n case \"cycle\":\r\n return \"cycle\";\r\n case \"no_tag_context\":\r\n return \"no_tag_context\";\r\n default:\r\n return \"node_not_found\";\r\n }\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function uniqueId(ctx: EditorModuleContext, base: string): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ]);\r\n let candidate = nextCopyId(base);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function uniqueOptionId(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n base: string,\r\n): string {\r\n const props = ctx.getProps();\r\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\r\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\r\n let candidate = base;\r\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function genId(\r\n ctx: EditorModuleContext,\r\n prefix: \"t\" | \"f\" | \"o\",\r\n): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ...(props.fields ?? []).flatMap((f) => f.options?.map((o) => o.id) ?? []),\r\n ]);\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `${prefix}:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate id\");\r\n}\r\n\r\nexport function nextCopyLabel(old: string): string {\r\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\r\n if (!m) return `${old} (copy)`;\r\n const stem = m[1].trim();\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem} (copy ${n})`;\r\n}\r\n\r\nexport function nextCopyName(old?: string): string | undefined {\r\n if (!old) return undefined;\r\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function defaultOptionIdStrategy(old: string): string {\r\n return nextCopyId(old);\r\n}\r\n\r\nexport function nextCopyId(old: string): string {\r\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function bumpSuffix(old: string): string {\r\n const m = old.match(/^(.*?)(\\d+)$/);\r\n if (!m) return `${old}2`;\r\n const stem = m[1];\r\n return `${stem}${parseInt(m[2], 10) + 1}`;\r\n}\r\n","import type { ServiceProps, Tag } from \"@/schema\";\r\nimport type {\r\n DuplicateOptions,\r\n EditorModuleContext,\r\n NodeRef,\r\n} from \"./editor-types\";\r\nimport {\r\n defaultOptionIdStrategy,\r\n nextCopyLabel,\r\n nextCopyName,\r\n} from \"./editor-ids\";\r\n\r\nexport function duplicate(\r\n ctx: EditorModuleContext,\r\n ref: NodeRef,\r\n opts: DuplicateOptions = {},\r\n): string {\r\n const snapBefore = ctx.makeSnapshot(\"duplicate:before\");\r\n try {\r\n let newId = \"\";\r\n ctx.transact(\"duplicate\", () => {\r\n if (ref.kind === \"tag\") {\r\n newId = duplicateTag(ctx, ref.id, opts);\r\n } else if (ref.kind === \"field\") {\r\n newId = duplicateField(ctx, ref.id, opts);\r\n } else {\r\n newId = duplicateOption(ctx, ref.fieldId, ref.id, opts);\r\n }\r\n });\r\n return newId;\r\n } catch (err) {\r\n ctx.loadSnapshot(snapBefore, \"undo\");\r\n throw err;\r\n }\r\n}\r\n\r\nexport function duplicateTag(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const tags = props.filters ?? [];\r\n const src = tags.find((t) => t.id === tagId);\r\n if (!src) throw new Error(`Tag not found: ${tagId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n\r\n if (!opts.withChildren) {\r\n ctx.patchProps((p) => {\r\n const clone = { ...src, id, label };\r\n clone.bind_id = src.bind_id;\r\n clone.constraints_overrides = undefined;\r\n clone.constraints_origin = undefined;\r\n const arr = p.filters ?? [];\r\n const idx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(idx + 1, 0, clone);\r\n p.filters = arr;\r\n });\r\n return id;\r\n }\r\n\r\n const idMap = new Map<string, string>();\r\n const collect = (t: typeof src, acc: (typeof src)[]) => {\r\n acc.push(t);\r\n for (const child of tags.filter((x) => x.bind_id === t.id)) {\r\n collect(child as any, acc);\r\n }\r\n };\r\n const subtree: (typeof src)[] = [];\r\n collect(src, subtree);\r\n\r\n for (const n of subtree) {\r\n idMap.set(n.id, n.id === src.id ? id : ctx.uniqueId(n.id));\r\n }\r\n\r\n const clones = subtree.map((n) => {\r\n const cloned = { ...n };\r\n cloned.id = idMap.get(n.id)!;\r\n cloned.label =\r\n n.id === src.id\r\n ? label\r\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\r\n cloned.bind_id = n.bind_id ? (idMap.get(n.bind_id) ?? n.bind_id) : undefined;\r\n cloned.constraints_origin = undefined;\r\n cloned.constraints_overrides = undefined;\r\n return cloned;\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.filters ?? [];\r\n const rootIdx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(rootIdx + 1, 0, clones[0] as any);\r\n for (const c of clones.slice(1)) arr.push(c as any);\r\n p.filters = arr;\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateField(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const src = fields.find((f) => f.id === fieldId);\r\n if (!src) throw new Error(`Field not found: ${fieldId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n const name = opts.nameStrategy\r\n ? opts.nameStrategy(src.name)\r\n : nextCopyName(src.name);\r\n\r\n const optId = (old: string) =>\r\n ctx.uniqueOptionId(\r\n id,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\r\n );\r\n\r\n const clonedOptions = (src.options ?? []).map((o) => ({\r\n ...o,\r\n id: optId(o.id),\r\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\r\n }));\r\n\r\n const cloned = {\r\n ...src,\r\n id,\r\n label,\r\n name,\r\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\r\n options: clonedOptions,\r\n } as typeof src;\r\n\r\n const optionIdMap = new Map<string, string>();\r\n (src.options ?? []).forEach((o, i) => {\r\n const newOptId = clonedOptions[i]?.id ?? o.id;\r\n optionIdMap.set(o.id, newOptId);\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.fields ?? [];\r\n const idx = arr.findIndex((f) => f.id === fieldId);\r\n arr.splice(idx + 1, 0, cloned as any);\r\n p.fields = arr;\r\n\r\n if (opts.copyIncludesExcludes) {\r\n for (const t of p.filters ?? []) {\r\n if (t.includes?.includes(fieldId)) {\r\n const s = new Set(t.includes);\r\n s.add(id);\r\n t.includes = Array.from(s);\r\n }\r\n if (t.excludes?.includes(fieldId)) {\r\n const s = new Set(t.excludes);\r\n s.add(id);\r\n t.excludes = Array.from(s);\r\n }\r\n }\r\n }\r\n\r\n if (opts.copyOptionMaps) {\r\n const maps: Array<\"includes_for_buttons\" | \"excludes_for_buttons\"> = [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ];\r\n\r\n for (const mapKey of maps) {\r\n const srcMap = (p as any)[mapKey] ?? {};\r\n const nextMap: Record<string, string[]> = { ...srcMap };\r\n\r\n for (const [key, targets] of Object.entries(\r\n srcMap as Record<string, string[]>,\r\n )) {\r\n if (key === fieldId) {\r\n const newKey = id;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n continue;\r\n }\r\n\r\n if (optionIdMap.has(key)) {\r\n const newKey = optionIdMap.get(key)!;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n }\r\n }\r\n\r\n (p as any)[mapKey] = nextMap;\r\n }\r\n }\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n optionId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`Field not found: ${fieldId}`);\r\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (optIdx < 0) {\r\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\r\n }\r\n const src = (f.options ?? [])[optIdx];\r\n\r\n const newId = ctx.uniqueOptionId(\r\n fieldId,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\r\n );\r\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? src.id);\r\n\r\n ctx.patchProps((p) => {\r\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\r\n const arr = fld.options ?? [];\r\n const clone = { ...src, id: newId, label: newLabel };\r\n arr.splice(optIdx + 1, 0, clone);\r\n fld.options = arr;\r\n\r\n if (opts.copyOptionMaps) {\r\n const oldKey = `${fieldId}::${optionId}`;\r\n const newKey = `${fieldId}::${newId}`;\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey] ?? {};\r\n if (m[oldKey]) {\r\n m[newKey] = Array.from(new Set(m[oldKey]));\r\n p[mapKey] = m as any;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return newId;\r\n}\r\n","import type { ServicePropsNotice } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\n\r\nfunction genNoticeId(ctx: EditorModuleContext): string {\r\n const taken = new Set((ctx.getProps().notices ?? []).map((n) => n.id));\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `n:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate notice id\");\r\n}\r\n\r\nexport function addNotice(\r\n ctx: EditorModuleContext,\r\n input: Omit<ServicePropsNotice, \"id\"> & { id?: string },\r\n): string {\r\n const id = input.id ?? genNoticeId(ctx);\r\n\r\n ctx.exec({\r\n name: \"addNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = (p.notices ??= []);\r\n if (notices.some((n) => n.id === id)) {\r\n throw new Error(`Notice id '${id}' already exists`);\r\n }\r\n notices.push({ ...input, id });\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateNotice(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<ServicePropsNotice>,\r\n): void {\r\n const { id: _ignored, ...rest } = patch;\r\n ctx.exec({\r\n name: \"updateNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = p.notices;\r\n if (!notices?.length) return;\r\n\r\n const target = notices.find((n) => n.id === id);\r\n if (!target) return;\r\n Object.assign(target, rest);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeNotice(ctx: EditorModuleContext, id: string): void {\r\n ctx.exec({\r\n name: \"removeNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (!p.notices?.length) return;\r\n p.notices = p.notices.filter((n) => n.id !== id);\r\n if (!p.notices.length) delete p.notices;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { cloneDeep } from \"lodash-es\";\nimport type { Field, ServiceIdRef, ServiceProps, Tag } from \"@/schema\";\nimport type {\r\n EditorModuleContext,\r\n EditorNodeLookup,\r\n} from \"./editor-types\";\r\nimport { clearFieldButtonReceiverMaps, isActualButtonField, ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function reLabel(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n nextLabel: string,\r\n): void {\r\n const label = String(nextLabel ?? \"\").trim();\r\n\r\n ctx.exec({\r\n name: \"reLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if ((t.label ?? \"\") === label) return;\r\n t.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n if ((o.label ?? \"\") === label) return;\r\n o.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n const fld = (p.fields ?? []).find((x) => x.id === id);\r\n if (!fld) return;\r\n if ((fld.label ?? \"\") === label) return;\r\n fld.label = label;\r\n ctx.api.refreshGraph();\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setFieldName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n nextName: string | null | undefined,\r\n): void {\r\n const raw = typeof nextName === \"string\" ? nextName : \"\";\r\n const name = raw.trim();\r\n\r\n ctx.exec({\r\n name: \"setFieldName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const fields = p.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_not_found\",\r\n message: `Field not found: ${fieldId}`,\r\n meta: { fieldId },\r\n });\r\n return;\r\n }\r\n\r\n const fieldHasService =\n (typeof (f as any).service_id === \"number\" &&\n Number.isFinite((f as any).service_id)) ||\n (typeof (f as any).service_id === \"string\" &&\n (f as any).service_id.trim().length > 0);\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) =>\n (typeof (o as any).service_id === \"number\" &&\n Number.isFinite((o as any).service_id)) ||\n (typeof (o as any).service_id === \"string\" &&\n (o as any).service_id.trim().length > 0),\n )\n : false;\n\r\n if (fieldHasService || optionHasService) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_has_service_mapping\",\r\n message:\r\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\r\n meta: {\r\n fieldId,\r\n fieldHasService,\r\n optionHasService,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (name.length === 0) {\r\n if (\"name\" in f) delete (f as any).name;\r\n return;\r\n }\r\n\r\n const collision = fields.find(\r\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\r\n );\r\n if (collision) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_name_collision\",\r\n message: `Another field already uses the name \"${name}\".`,\r\n meta: { fieldId, otherFieldId: collision.id },\r\n });\r\n return;\r\n }\r\n\r\n (f as any).name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n input: {\r\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\r\n): string {\r\n const id = input.id ?? ctx.genId(\"o\");\r\n\r\n ctx.exec({\r\n name: \"addOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`addOption: field '${fieldId}' not found`);\r\n const list = (f.options ??= []);\r\n if (list.some((o) => o.id === id)) {\r\n throw new Error(`Option id '${id}' already exists`);\r\n }\r\n list.push({ ...input, id } as any);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n patch: Partial<\r\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('updateOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"updateOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n const o = f.options.find((x) => x.id === optionId);\r\n if (o) Object.assign(o, patch);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeOption(ctx: EditorModuleContext, optionId: string) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('removeOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"removeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n f.options = f.options.filter((o) => o.id !== optionId);\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n if (map[optionId]) delete map[optionId];\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editLabel(ctx: EditorModuleContext, id: string, label: string): void {\r\n const next = (label ?? \"\").trim();\r\n if (!next) throw new Error(\"Label cannot be empty\");\r\n\r\n ctx.exec({\r\n name: \"editLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (t) t.label = next;\r\n return;\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (f) f.label = next;\r\n return;\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (o) o.label = next;\r\n return;\r\n }\r\n throw new Error(\"editLabel: unsupported id\");\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n name: string | undefined,\r\n) {\r\n ctx.exec({\r\n name: \"editName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n f.name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setService(\n ctx: EditorModuleContext,\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n): void {\n ctx.exec({\r\n name: \"setService\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n ((typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id)) ||\n (typeof input.service_id === \"string\" &&\n input.service_id.trim().length > 0));\n const sid: ServiceIdRef | undefined = validId\n ? typeof input.service_id === \"string\"\n ? input.service_id.trim()\n : Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\r\n\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (t as any).service_id;\r\n else t.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n\r\n const currentRole = (o.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n const role = nextRole ?? currentRole;\r\n\r\n if (role === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (option).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n o.pricing_role = \"utility\";\r\n if (\"service_id\" in o) delete (o as any).service_id;\r\n return;\r\n }\r\n\r\n if (nextRole) o.pricing_role = \"base\";\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (o as any).service_id;\r\n else o.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) {\r\n throw new Error(\r\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\r\n );\r\n }\r\n\r\n const isOptionBased = Array.isArray(f.options) && f.options.length > 0;\r\n const isButton = !!(f as any).button;\r\n\r\n if (nextRole) {\r\n f.pricing_role = nextRole;\r\n }\r\n const effectiveRole = (f.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n\r\n if (isOptionBased) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\r\n code: \"field_option_based_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (!isButton) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Only button fields (without options) can have a service_id.\",\r\n code: \"non_button_field_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (effectiveRole === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (field).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (f as any).service_id;\r\n else (f as any).service_id = sid;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addTag(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"t\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = [...(p.filters ?? []), payload];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateTag(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Tag>,\r\n) {\r\n let prev: Tag | undefined;\r\n ctx.exec({\r\n name: \"updateTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) => {\r\n if (t.id !== id) return t;\r\n prev = t;\r\n return { ...t, ...patch };\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) =>\r\n t.id === id && prev ? prev : t,\r\n );\r\n }),\r\n });\r\n}\r\n\r\nexport function removeTag(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id);\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function addField(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\r\n id?: string;\r\n label: string;\r\n type: Field[\"type\"];\r\n },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"f\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = [...(p.fields ?? []), payload as Field];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateField(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Field>,\r\n) {\r\n let prev: Field | undefined;\r\n let prevIncludesForButton: string[] | undefined;\r\n let prevExcludesForButton: string[] | undefined;\r\n ctx.exec({\r\n name: \"updateField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevIncludesForButton = p.includes_for_buttons?.[id]\r\n ? [...(p.includes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n prevExcludesForButton = p.excludes_for_buttons?.[id]\r\n ? [...(p.excludes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n\r\n p.fields = (p.fields ?? []).map((f) => {\r\n if (f.id !== id) return f;\r\n prev = cloneDeep(f);\r\n const nextField = { ...f, ...patch } as Field;\r\n if (!isActualButtonField(nextField)) {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n return nextField;\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).map((f) =>\r\n f.id === id && prev ? prev : f,\r\n );\r\n if (prevIncludesForButton) {\r\n p.includes_for_buttons = {\r\n ...(p.includes_for_buttons ?? {}),\r\n [id]: [...prevIncludesForButton],\r\n };\r\n } else {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n if (prevExcludesForButton) {\r\n p.excludes_for_buttons = {\r\n ...(p.excludes_for_buttons ?? {}),\r\n [id]: [...prevExcludesForButton],\r\n };\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function removeField(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n clearFieldButtonReceiverMaps(p, id);\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey];\r\n if (!m) continue;\r\n for (const k of Object.keys(m)) {\r\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\r\n if (!m[k]?.length) delete m[k];\r\n }\r\n }\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function remove(ctx: EditorModuleContext, id: string) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id) as any;\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n\r\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => (p.fields ?? []).some((f) => f.id === fid),\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => fid !== id,\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n for (const key of Object.keys(map)) {\r\n map[key] = (map[key] ?? []).filter((fid) => fid !== id);\r\n if (!map[key]?.length) delete map[key];\r\n }\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n removeOption(ctx, id);\r\n return;\r\n }\r\n\r\n throw new Error(\"remove: unknown id prefix\");\r\n}\r\n\r\nexport function getNode(ctx: EditorModuleContext, id: string): EditorNodeLookup {\r\n const props = ctx.getProps();\r\n if (ctx.isTagId(id)) {\r\n const t = (props.filters ?? []).find((x) => x.id === id);\r\n return {\r\n kind: \"tag\",\r\n data: t,\r\n owners: { parentTagId: t?.bind_id },\r\n };\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n const bind = Array.isArray(f?.bind_id)\r\n ? (f!.bind_id as string[])\r\n : f?.bind_id\r\n ? [f.bind_id]\r\n : [];\r\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(props, id);\r\n const f = own ? (props.fields ?? []).find((x) => x.id === own.fieldId) : undefined;\r\n const o = f?.options?.find((x) => x.id === id);\r\n return {\r\n kind: \"option\",\r\n data: o,\r\n owners: { fieldId: own?.fieldId },\r\n };\r\n }\r\n return { kind: \"option\", data: undefined, owners: {} };\r\n}\r\n","import type { EditorOptions, Field, ServiceProps } from \"@/schema\";\r\n\r\nexport function ownerOfOption(\r\n props: ServiceProps,\r\n optionId: string,\r\n): { fieldId: string; index: number } | null {\r\n for (const f of props.fields ?? []) {\r\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (idx >= 0) return { fieldId: f.id, index: idx };\r\n }\r\n return null;\r\n}\r\n\r\nexport function hasFieldOptions(field: Partial<Field> | undefined): boolean {\r\n return Array.isArray(field?.options) && field.options.length > 0;\r\n}\r\n\r\nexport function isActualButtonField(field: Partial<Field> | undefined): boolean {\r\n return field?.button === true && !hasFieldOptions(field);\r\n}\r\n\r\nexport function clearFieldButtonReceiverMaps(\r\n props: ServiceProps,\r\n fieldId: string,\r\n): void {\r\n if (props.includes_for_buttons?.[fieldId]) {\r\n delete props.includes_for_buttons[fieldId];\r\n }\r\n if (props.excludes_for_buttons?.[fieldId]) {\r\n delete props.excludes_for_buttons[fieldId];\r\n }\r\n if (\r\n props.includes_for_buttons &&\r\n Object.keys(props.includes_for_buttons).length === 0\r\n ) {\r\n delete props.includes_for_buttons;\r\n }\r\n if (\r\n props.excludes_for_buttons &&\r\n Object.keys(props.excludes_for_buttons).length === 0\r\n ) {\r\n delete props.excludes_for_buttons;\r\n }\r\n}\r\n\r\nexport function ensureServiceExists(opts: EditorOptions, id: any) {\r\n if (typeof opts.serviceExists === \"function\") {\r\n if (!opts.serviceExists(id)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n if (opts.serviceMap) {\r\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n throw new Error(\"service_checker_missing\");\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function setConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n value: boolean | undefined,\r\n) {\r\n let prev: boolean | undefined;\r\n ctx.exec({\r\n name: \"setConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n if (!t.constraints) t.constraints = {};\r\n if (value === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = value;\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (!t.constraints) t.constraints = {};\r\n if (prev === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = prev;\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraintOverride(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n let prev: boolean | undefined;\r\n let prevOverride: any;\r\n ctx.exec({\r\n name: \"clearConstraintOverride\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n prevOverride = t.constraints_overrides?.[flag];\r\n\r\n if (t.constraints) delete t.constraints[flag];\r\n if (t.constraints_overrides) delete t.constraints_overrides[flag];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (prev !== undefined) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = prev;\r\n }\r\n if (prevOverride !== undefined) {\r\n if (!t.constraints_overrides) t.constraints_overrides = {};\r\n t.constraints_overrides[flag] = prevOverride;\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n ctx.exec({\r\n name: \"clearConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const tags = p.filters ?? [];\r\n const byId = new Map(tags.map((t) => [t.id, t]));\r\n const children = new Map<string, string[]>();\r\n for (const t of tags) {\r\n if (t.bind_id) {\r\n if (!children.has(t.bind_id)) children.set(t.bind_id, []);\r\n children.get(t.bind_id)!.push(t.id);\r\n }\r\n }\r\n\r\n const process = (id: string) => {\r\n const t = byId.get(id);\r\n if (!t) return;\r\n\r\n const override = t.constraints_overrides?.[flag];\r\n if (override) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = override.from;\r\n delete t.constraints_overrides![flag];\r\n if (Object.keys(t.constraints_overrides ?? {}).length === 0) {\r\n delete t.constraints_overrides;\r\n }\r\n } else if (t.constraints) {\r\n delete t.constraints[flag];\r\n if (Object.keys(t.constraints).length === 0) {\r\n delete t.constraints;\r\n }\r\n }\r\n\r\n for (const childId of children.get(id) ?? []) {\r\n process(childId);\r\n }\r\n };\r\n\r\n process(tagId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { normalizeFieldValidation } from \"@/core\";\r\nimport type { FieldValidationRule } from \"@/schema\";\r\nimport type { EditorModuleContext, QuantityRule } from \"./editor-types\";\r\n\r\nexport function getFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): QuantityRule | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeQuantityRule((f as any).meta?.quantity);\r\n}\r\n\r\nexport function setFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rule: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeQuantityRule(rule);\r\n\r\n if (!normalized) {\r\n if ((f as any).meta?.quantity !== undefined) {\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n (f as any).meta = {\r\n ...(f as any).meta,\r\n quantity: normalized,\r\n };\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).meta?.quantity) return;\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function getFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): FieldValidationRule[] | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeFieldValidation((f as any).validation);\r\n}\r\n\r\nexport function setFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rules: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeFieldValidation(rules);\r\n\r\n if (!normalized) {\r\n if (\"validation\" in f) delete (f as any).validation;\r\n return;\r\n }\r\n\r\n (f as any).validation = normalized;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).validation) return;\r\n delete (f as any).validation;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function normalizeQuantityRule(input: unknown): QuantityRule | undefined {\r\n if (!input || typeof input !== \"object\") return undefined;\r\n const v = input as any;\r\n const vb = v.valueBy;\r\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\r\n\r\n const out: QuantityRule = { valueBy: vb };\r\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\r\n out.code = v.code;\r\n }\r\n if (typeof v.multiply === \"number\" && Number.isFinite(v.multiply)) {\r\n out.multiply = v.multiply;\r\n }\r\n if (typeof v.fallback === \"number\" && Number.isFinite(v.fallback)) {\r\n out.fallback = v.fallback;\r\n }\r\n if (v.clamp && typeof v.clamp === \"object\") {\r\n const min =\r\n typeof v.clamp.min === \"number\" && Number.isFinite(v.clamp.min)\r\n ? v.clamp.min\r\n : undefined;\r\n const max =\r\n typeof v.clamp.max === \"number\" && Number.isFinite(v.clamp.max)\r\n ? v.clamp.max\r\n : undefined;\r\n if (min !== undefined || max !== undefined) {\r\n out.clamp = {\r\n ...(min !== undefined ? { min } : {}),\r\n ...(max !== undefined ? { max } : {}),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ServiceProps } from \"@/schema\";\r\nimport type { EditorModuleContext, WireKind } from \"./editor-types\";\r\nimport { ensureServiceExists, isActualButtonField } from \"./editor-utils\";\r\n\r\nexport function wouldCreateTagCycle(\r\n _ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n parentId: string,\r\n childId: string,\r\n): boolean {\r\n if (parentId === childId) return true;\r\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\r\n let cur: string | undefined = parentId;\r\n const guard = new Set<string>();\r\n while (cur) {\r\n if (cur === childId) return true;\r\n if (guard.has(cur)) break;\r\n guard.add(cur);\r\n cur = tagById.get(cur)?.bind_id;\r\n }\r\n return false;\r\n}\r\n\r\nexport function wouldCreateIncludeExcludeCycle(\r\n ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n receiverId: string,\r\n targetId: string,\r\n): boolean {\r\n if (receiverId === targetId) return true;\r\n\r\n const getDirectRelations = (id: string): string[] => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\r\n }\r\n const inc = p.includes_for_buttons?.[id] ?? [];\r\n const exc = p.excludes_for_buttons?.[id] ?? [];\r\n return [...inc, ...exc];\r\n };\r\n\r\n const visited = new Set<string>();\r\n const stack = [targetId];\r\n\r\n while (stack.length > 0) {\r\n const curr = stack.pop()!;\r\n if (curr === receiverId) return true;\r\n if (visited.has(curr)) continue;\r\n visited.add(curr);\r\n stack.push(...getDirectRelations(curr));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function include(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"include\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.includes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.includes?.length ?? 0) > 0) {\r\n t.includes = Array.from(next);\r\n }\r\n\r\n if (t.excludes) {\r\n t.excludes = t.excludes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.excludes.length === 0) {\r\n delete t.excludes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.includes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.includes_for_buttons) p.includes_for_buttons = {};\r\n p.includes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.excludes_for_buttons?.[receiverId]) {\r\n p.excludes_for_buttons[receiverId] =\r\n p.excludes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.excludes_for_buttons[receiverId].length === 0) {\r\n delete p.excludes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function exclude(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"exclude\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.excludes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.excludes?.length ?? 0) > 0) {\r\n t.excludes = Array.from(next);\r\n }\r\n\r\n if (t.includes) {\r\n t.includes = t.includes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.includes.length === 0) {\r\n delete t.includes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.excludes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.excludes_for_buttons) p.excludes_for_buttons = {};\r\n p.excludes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.includes_for_buttons?.[receiverId]) {\r\n p.includes_for_buttons[receiverId] =\r\n p.includes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.includes_for_buttons[receiverId].length === 0) {\r\n delete p.includes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function connect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `connect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n if (wouldCreateTagCycle(ctx, p, fromId, toId)) {\r\n throw new Error(`bind would create a cycle: ${fromId} ? ${toId}`);\r\n }\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child) child.bind_id = fromId;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n if (!f.bind_id) {\r\n f.bind_id = tagId;\r\n return;\r\n }\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id !== tagId) f.bind_id = [f.bind_id, tagId];\r\n return;\r\n }\r\n if (!f.bind_id.includes(tagId)) f.bind_id.push(tagId);\r\n return;\r\n }\r\n throw new Error(`bind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n const arr = (t[key] ??= []);\r\n if (!arr.includes(toId)) arr.push(toId);\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n const next = { ...(maps ?? {}) };\r\n const arr = next[fromId] ?? [];\r\n if (!arr.includes(toId)) arr.push(toId);\r\n next[fromId] = arr;\r\n (p as any)[mapKey] = next;\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"connect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) (t as any).service_id = fromId;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"connect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n (o as any).service_id = fromId;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown connect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function disconnect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `disconnect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child?.bind_id === fromId) delete child.bind_id;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f?.bind_id) return;\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id === tagId) delete f.bind_id;\r\n return;\r\n }\r\n f.bind_id = f.bind_id.filter((x) => x !== tagId) as any;\r\n if (f.bind_id?.length === 0) delete f.bind_id;\r\n return;\r\n }\r\n throw new Error(`unbind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\r\n if (!t[key]?.length) delete (t as any)[key];\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n if (!maps) return;\r\n if (maps[fromId]) {\r\n maps[fromId] = (maps[fromId] ?? []).filter(\r\n (fid) => fid !== toId,\r\n );\r\n if (!maps[fromId]?.length) delete maps[fromId];\r\n }\r\n if (!Object.keys(maps).length) delete (p as any)[mapKey];\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) delete (t as any).service_id;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n delete (o as any).service_id;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown disconnect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import {\r\n filterServicesForVisibleGroup as filterServicesForVisibleGroupCore,\r\n type FilterServicesForVisibleGroupInput,\r\n} from \"@/core\";\r\nimport type { FallbackSettings } from \"@/schema\";\r\nimport type { EditorModuleContext, ServiceCheck } from \"./editor-types\";\r\n\r\nexport function filterServicesForVisibleGroup(\r\n ctx: EditorModuleContext,\r\n candidates: Array<number | string>,\r\n input: {\r\n tagId: string;\r\n selectedButtons?: string[];\r\n usedServiceIds: Array<number | string>;\r\n effectiveConstraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n policies?: unknown;\r\n fallback?: FallbackSettings;\r\n },\r\n): ServiceCheck[] {\r\n const coreInput: FilterServicesForVisibleGroupInput = {\r\n candidates,\r\n context: {\r\n tagId: input.tagId,\r\n selectedButtons: input.selectedButtons,\r\n usedServiceIds: input.usedServiceIds,\r\n effectiveConstraints: input.effectiveConstraints,\r\n policies: input.policies,\r\n fallback: input.fallback,\r\n },\r\n };\r\n const result = filterServicesForVisibleGroupCore(coreInput, {\r\n builder: ctx.builder,\r\n });\r\n ctx.setLastPolicyDiagnostics(result.diagnostics);\r\n return result.checks;\r\n}\r\n","import type { Tag } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\nimport { ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function placeNode(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n opts: {\r\n scopeTagId?: string;\r\n beforeId?: string;\r\n afterId?: string;\r\n index?: number;\r\n },\r\n) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"placeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const all = p.filters ?? [];\r\n const cur = all.find((t) => t.id === id);\r\n if (!cur) return;\r\n const groupKey = cur.bind_id ?? \"__root__\";\r\n const siblings = all.filter(\r\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\r\n );\r\n\r\n const curIdx = siblings.findIndex((t) => t.id === id);\r\n if (curIdx < 0) return;\r\n const pulled = siblings.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n siblings.findIndex((t) => t.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n siblings.length,\r\n siblings.findIndex((t) => t.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = siblings.length;\r\n }\r\n\r\n const out: Tag[] = [];\r\n for (const t of all) {\r\n const sameGroup = (t.bind_id ?? \"__root__\") === groupKey;\r\n if (!sameGroup) {\r\n out.push(t);\r\n }\r\n }\r\n siblings.splice(dest, 0, pulled);\r\n p.filters = [...out, ...siblings];\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n if (!opts.scopeTagId) {\r\n throw new Error(\"placeNode(field): scopeTagId is required\");\r\n }\r\n const fieldId = id;\r\n const tagId = opts.scopeTagId;\r\n\r\n ctx.exec({\r\n name: \"placeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const map = (p.order_for_tags ??= {});\r\n const arr = (map[tagId] ??= []);\r\n const curIdx = arr.indexOf(fieldId);\r\n if (curIdx >= 0) arr.splice(curIdx, 1);\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) dest = Math.max(0, arr.indexOf(opts.beforeId));\r\n if (opts.afterId) {\r\n dest = Math.min(arr.length, arr.indexOf(opts.afterId) + 1);\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) dest = arr.length;\r\n\r\n arr.splice(dest, 0, fieldId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n placeOption(ctx, id, opts);\r\n return;\r\n }\r\n\r\n throw new Error(\"placeNode: unknown id prefix\");\r\n}\r\n\r\nexport function placeOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n opts: { beforeId?: string; afterId?: string; index?: number },\r\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('placeOption: optionId must start with \"o:\"');\r\n }\r\n\r\n ctx.exec({\r\n name: \"placeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n\r\n const curIdx = f.options.findIndex((o) => o.id === optionId);\r\n if (curIdx < 0) return;\r\n\r\n const pulled = f.options.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n f.options.findIndex((o) => o.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n f.options.length,\r\n f.options.findIndex((o) => o.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = f.options.length;\r\n }\r\n\r\n f.options.splice(dest, 0, pulled);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","// src/react/canvas/editor/editor-catalog.ts\n\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n ServiceCatalogState,\n} from \"@/schema\";\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction normalizeServiceIds(\n ids: Array<CatalogServiceId> | undefined,\n): Array<CatalogServiceId> {\n if (!ids?.length) return [];\n const seen = new Set<string>();\n const out: Array<CatalogServiceId> = [];\n\n for (const id of ids) {\n const key = String(id);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(id);\n }\n\n return out;\n}\n\nfunction sortNodes(nodes: CatalogNode[]): CatalogNode[] {\n return [...nodes].sort((a, b) => {\n const ao = a.order ?? 0;\n const bo = b.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function createEmptyCatalog(): ServiceCatalogState {\n return {\n version: 1,\n nodes: [],\n activeNodeId: undefined,\n expandedIds: [],\n pinnedNodeIds: [],\n selectedServiceId: undefined,\n viewMode: \"all\",\n };\n}\n\nexport function ensureCatalog(\n catalog?: ServiceCatalogState,\n): ServiceCatalogState {\n return clone(catalog ?? createEmptyCatalog());\n}\n\nexport function getCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): CatalogNode | undefined {\n return (catalog?.nodes ?? []).find((x) => x.id === id);\n}\n\nexport function getCatalogChildren(\n catalog: ServiceCatalogState | undefined,\n parentId?: CatalogId,\n): CatalogNode[] {\n return sortNodes(\n (catalog?.nodes ?? []).filter((x) => x.parentId === parentId),\n );\n}\n\nexport function hasCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): boolean {\n return !!getCatalogNode(catalog, id);\n}\n\nexport function createCatalogId(\n catalog: ServiceCatalogState | undefined,\n prefix = \"cg\",\n): string {\n const taken = new Set((catalog?.nodes ?? []).map((x) => x.id));\n for (let i = 1; i < 10000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate catalog id\");\n}\n\nexport function addCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: Array<CatalogServiceId>;\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"cg\");\n\n next.nodes.push({\n id,\n kind: \"group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n serviceIds: normalizeServiceIds(input.serviceIds),\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function addSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"csg\");\n\n next.nodes.push({\n id,\n kind: \"smart-group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n rules: clone(input.rules ?? []),\n match: input.match ?? \"all\",\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function updateCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const idx = next.nodes.findIndex((x) => x.id === id);\n if (idx < 0) return next;\n\n const current = next.nodes[idx]!;\n next.nodes[idx] = {\n ...current,\n ...patch,\n } as CatalogNode;\n\n if (next.nodes[idx]?.kind === \"group\") {\n next.nodes[idx] = {\n ...next.nodes[idx],\n serviceIds: normalizeServiceIds(\n (next.nodes[idx] as Extract<CatalogNode, { kind: \"group\" }>)\n .serviceIds,\n ),\n } as CatalogNode;\n }\n\n return next;\n}\n\nexport function setActiveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id?: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.activeNodeId = id;\n return next;\n}\n\nexport function setCatalogViewMode(\n catalog: ServiceCatalogState | undefined,\n mode: ServiceCatalogState[\"viewMode\"],\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.viewMode = mode;\n return next;\n}\n\nexport function setSelectedCatalogService(\n catalog: ServiceCatalogState | undefined,\n serviceId?: CatalogServiceId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.selectedServiceId = serviceId;\n return next;\n}\n\nexport function toggleCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const expanded = new Set(next.expandedIds ?? []);\n\n if (expanded.has(id)) expanded.delete(id);\n else expanded.add(id);\n\n next.expandedIds = Array.from(expanded);\n return next;\n}\n\nexport function setCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n expanded: boolean,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const set = new Set(next.expandedIds ?? []);\n\n if (expanded) set.add(id);\n else set.delete(id);\n\n next.expandedIds = Array.from(set);\n return next;\n}\n\nexport function toggleCatalogPinned(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const pinned = new Set(next.pinnedNodeIds ?? []);\n\n if (pinned.has(id)) pinned.delete(id);\n else pinned.add(id);\n\n next.pinnedNodeIds = Array.from(pinned);\n return next;\n}\n\nexport function assignServicesToCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n serviceIds: Array<CatalogServiceId>,\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"group\",\n ) as Extract<CatalogNode, { kind: \"group\" }> | undefined;\n\n if (!node) return next;\n\n const incoming = normalizeServiceIds(serviceIds);\n const current = normalizeServiceIds(node.serviceIds);\n\n if (mode === \"replace\") {\n node.serviceIds = incoming;\n return next;\n }\n\n if (mode === \"append\") {\n node.serviceIds = normalizeServiceIds([...current, ...incoming]);\n return next;\n }\n\n node.serviceIds = current.filter(\n (id) => !incoming.some((x) => String(x) === String(id)),\n );\n return next;\n}\n\nexport function clearCatalog(): ServiceCatalogState {\n return createEmptyCatalog();\n}\n\nexport function removeCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n opts?: { cascade?: boolean },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n\n const ids = new Set<string>([id]);\n\n if (opts?.cascade) {\n const queue = [id];\n while (queue.length) {\n const current = queue.shift()!;\n for (const child of next.nodes.filter(\n (x) => x.parentId === current,\n )) {\n if (!ids.has(child.id)) {\n ids.add(child.id);\n queue.push(child.id);\n }\n }\n }\n }\n\n next.nodes = next.nodes.filter((x) => !ids.has(x.id));\n\n if (next.activeNodeId && ids.has(next.activeNodeId)) {\n next.activeNodeId = undefined;\n }\n\n next.expandedIds = (next.expandedIds ?? []).filter((x) => !ids.has(x));\n next.pinnedNodeIds = (next.pinnedNodeIds ?? []).filter((x) => !ids.has(x));\n\n return next;\n}\n\nexport function moveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find((x) => x.id === nodeId);\n if (!node) return next;\n\n node.parentId = opts.parentId;\n\n const siblings = next.nodes\n .filter((x) => x.parentId === opts.parentId && x.id !== nodeId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n let dest = typeof opts.index === \"number\" ? opts.index : siblings.length;\n\n if (opts.beforeId) {\n const idx = siblings.findIndex((x) => x.id === opts.beforeId);\n if (idx >= 0) dest = idx;\n }\n\n if (opts.afterId) {\n const idx = siblings.findIndex((x) => x.id === opts.afterId);\n if (idx >= 0) dest = idx + 1;\n }\n\n const ordered = [...siblings];\n ordered.splice(dest, 0, node);\n\n ordered.forEach((item, i) => {\n item.order = i;\n });\n\n return next;\n}\n\nexport function resolveSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n candidates: Array<CatalogServiceId>,\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n if (!node) return next;\n\n const rules = node.rules ?? [];\n const mode = node.match ?? \"all\";\n\n const resolved = candidates.filter((candidate) => {\n const results = rules.map((rule) => {\n if (rule.type === \"service-field\") {\n return matchers.serviceField?.(candidate, rule) ?? false;\n }\n if (rule.type === \"policy-family\") {\n return matchers.policyFamily?.(candidate, rule) ?? false;\n }\n return matchers.compatibility?.(candidate, rule) ?? false;\n });\n\n return mode === \"all\" ? results.every(Boolean) : results.some(Boolean);\n });\n\n node.resolvedServiceIds = normalizeServiceIds(resolved);\n node.resolvedAt = Date.now();\n\n return next;\n}\n","// src/react/canvas/selection.ts\r\nimport { createNodeIndex, type Builder } from \"@/core\";\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\r\nimport type { DgpServiceCapability } from \"@/schema/provider\";\r\n\r\nexport type Env = \"client\" | \"workspace\";\r\n\r\nexport type VisibleGroup = {\r\n tagId?: string;\r\n tag?: Tag;\r\n fields: Field[];\r\n fieldIds: string[];\r\n parentTags?: Tag[];\r\n childrenTags?: Tag[];\r\n /** In order of selection: tag base (unless overridden) then selected options */\r\n services?: DgpServiceCapability[];\r\n};\r\n\r\n// Returned by visibleGroup():\r\nexport type VisibleGroupResult =\r\n | { kind: \"single\"; group: VisibleGroup }\r\n | { kind: \"multi\"; groups: string[] };\r\n\r\ntype ChangeEvt = { ids: string[]; primary?: string };\r\ntype Listener = (e: ChangeEvt) => void;\r\n\r\nexport type SelectionOptions = {\r\n env?: Env;\r\n rootTagId?: string;\r\n /** Resolve service capability from an id (used for `services` array) */\r\n resolveService?: (id: any) => DgpServiceCapability | undefined;\r\n};\r\n\r\nexport class Selection {\r\n private set = new Set<string>();\r\n private primaryId: string | undefined;\r\n private currentTagId: string | undefined;\r\n private onChangeFns: Listener[] = [];\r\n\r\n constructor(\r\n private readonly builder: Builder,\r\n private readonly opts: SelectionOptions,\r\n ) {}\r\n\r\n // ── Public mutators ──────────────────────────────────────────────────────\r\n replace(id?: string | null) {\r\n if (!id) return this.clear();\r\n this.set.clear();\r\n this.set.add(id);\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n add(id: string) {\r\n // maintain \"most-recent\" selection order:\r\n // Set keeps insertion order, but re-adding an existing id does NOT move it.\r\n // So we delete+add to bump it to the end every time this is called.\r\n if (this.set.has(id)) this.set.delete(id);\r\n this.set.add(id);\r\n\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n remove(id: string) {\r\n if (!this.set.delete(id)) return;\r\n if (this.primaryId === id) {\r\n this.primaryId = this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n }\r\n this.emit();\r\n }\r\n\r\n toggle(id: string) {\r\n if (this.set.has(id)) this.remove(id);\r\n else this.add(id);\r\n }\r\n\r\n many(ids: Iterable<string>, primary?: string) {\r\n this.set = new Set(ids);\r\n this.primaryId = primary ?? this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n this.emit();\r\n }\r\n\r\n clear() {\r\n if (!this.set.size && !this.primaryId) return;\r\n this.set.clear();\r\n this.primaryId = undefined;\r\n this.emit();\r\n }\r\n\r\n // ── Read APIs ────────────────────────────────────────────────────────────\r\n all(): ReadonlySet<string> {\r\n return this.set;\r\n }\r\n\r\n has(id: string): boolean {\r\n return this.set.has(id);\r\n }\r\n\r\n primary(): string | undefined {\r\n return this.primaryId;\r\n }\r\n\r\n currentTag(): string | undefined {\r\n return this.currentTagId;\r\n }\r\n\r\n onChange(fn: Listener): () => void {\r\n this.onChangeFns.push(fn);\r\n return () => {\r\n const i = this.onChangeFns.indexOf(fn);\r\n if (i >= 0) this.onChangeFns.splice(i, 1);\r\n };\r\n }\r\n\r\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\r\n visibleGroup(): VisibleGroupResult {\r\n const props = this.builder.getProps() as ServiceProps;\r\n\r\n // WORKSPACE: >1 tag selected → return raw selection set\r\n if ((this.opts.env ?? \"client\") === \"workspace\") {\r\n const tagIds = Array.from(this.set).filter(\r\n this.builder.isTagId.bind(this.builder),\r\n );\r\n if (tagIds.length > 1) {\r\n return { kind: \"multi\", groups: Array.from(this.set) };\r\n }\r\n }\r\n\r\n const tagId = this.resolveTagContextId(props);\r\n if (!tagId)\r\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\r\n\r\n const group = this.computeGroupForTag(props, tagId);\r\n return { kind: \"single\", group };\r\n }\r\n\r\n /**\r\n * Build a fieldId -> triggerKeys[] map from the current selection set.\r\n *\r\n * What counts as a \"button selection\" (trigger key):\r\n * - field key where the field has button === true (e.g. \"f:dripfeed\")\r\n * - option key (e.g. \"o:fast\")\r\n * - composite key \"fieldId::optionId\" (e.g. \"f:speed::o:fast\")\r\n *\r\n * Grouping:\r\n * - button-field trigger groups under its own fieldId\r\n * - option/composite groups under the option's owning fieldId (from nodeMap)\r\n *\r\n * Deterministic:\r\n * - preserves selection insertion order\r\n * - de-dupes per field\r\n */\r\n buttonSelectionsByFieldId(): Record<string, string[]> {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: Record<string, string[]> = {};\r\n\r\n const push = (fieldId: string, triggerKey: string) => {\r\n const arr = (out[fieldId] ??= []);\r\n if (!arr.includes(triggerKey)) arr.push(triggerKey);\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: \"fieldId::optionId\" => validate optionId; group by option.owner fieldId\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (\r\n optRef?.kind === \"option\" &&\r\n typeof optRef.fieldId === \"string\"\r\n ) {\r\n push(optRef.fieldId, key); // keep composite as the trigger key\r\n }\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger => group by owning fieldId\r\n if (ref.kind === \"option\" && typeof ref.fieldId === \"string\") {\r\n push(ref.fieldId, ref.id ?? key);\r\n continue;\r\n }\r\n\r\n // field trigger => only if it's a button field; group by itself\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n const fieldId = ref.id ?? field?.id ?? key;\r\n if (field?.button === true && typeof fieldId === \"string\") {\r\n push(fieldId, fieldId);\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n /**\r\n * Returns only selection keys that are valid \"trigger buttons\":\r\n * - field keys where field.button === true\r\n * - option keys\r\n * - composite keys \"fieldId::optionId\" (validated by optionId)\r\n * Excludes tags and non-button fields.\r\n */\r\n selectedButtons(): string[] {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n const push = (k: string) => {\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(k);\r\n }\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: validate optionId part\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (optRef?.kind === \"option\") push(key);\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger\r\n if (ref.kind === \"option\") {\r\n push(key);\r\n continue;\r\n }\r\n\r\n // field trigger only if it's a button field\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n if (field?.button === true) push(key);\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n // ── Internals ────────────────────────────────────────────────────────────\r\n private emit() {\r\n const payload: ChangeEvt = {\r\n ids: Array.from(this.set),\r\n primary: this.primaryId,\r\n };\r\n for (const fn of this.onChangeFns) fn(payload);\r\n }\r\n\r\n private updateCurrentTagFrom(id: string) {\n const props = this.builder.getProps() as ServiceProps;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n if (tags.some((t) => t.id === id)) {\n this.currentTagId = id;\n return;\n }\n\n const firstBindId = (field?: Field): string | undefined => {\n if (!field?.bind_id) return undefined;\n return Array.isArray(field.bind_id)\n ? field.bind_id[0]\n : field.bind_id;\n };\n\n const resolveField = (): Field | undefined => {\n const direct = fields.find((x) => x.id === id);\n if (direct) return direct;\n\n if (this.builder.isOptionId(id)) {\n return fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n }\n\n if (id.includes(\"::\")) {\n const [fieldId] = id.split(\"::\");\n if (!fieldId) return undefined;\n return fields.find((x) => x.id === fieldId);\n }\n\n return undefined;\n };\n\n const field = resolveField();\n if (!field) return;\n\n const currentTagId = this.currentTag();\n if (currentTagId) {\n const currentTagNode = createNodeIndex(this.builder).getTag(\n currentTagId,\n );\n if (currentTagNode?.getDescendant(field.id)) {\n this.currentTagId = currentTagId;\n return;\n }\n }\n\n const fallbackTagId = firstBindId(field);\n if (fallbackTagId) this.currentTagId = fallbackTagId;\n }\n\r\n private resolveTagContextId(props: ServiceProps): string | undefined {\r\n if (this.currentTagId) return this.currentTagId;\r\n\r\n for (const id of this.set) if (this.builder.isTagId(id)) return id;\r\n\r\n const fields = props.fields ?? [];\r\n for (const id of this.set) {\r\n const f = fields.find((x) => x.id === id);\r\n if (f?.bind_id)\r\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\r\n }\r\n\r\n for (const id of this.set) {\r\n if (this.builder.isOptionId(id)) {\r\n const host = fields.find((x) =>\r\n (x.options ?? []).some((o) => o.id === id),\r\n );\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n if (id.includes(\"::\")) {\r\n const [fid] = id.split(\"::\");\r\n const host = fields.find((x) => x.id === fid);\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n }\r\n\r\n return this.opts.rootTagId;\r\n }\r\n\r\n private computeGroupForTag(\r\n props: ServiceProps,\r\n tagId: string,\r\n ): VisibleGroup {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n\r\n // ---- delegate visible fields to builder\r\n const selectedTriggerIds = this.selectedButtons();\r\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n const visible = fieldIds\r\n .map((id) => fieldById.get(id))\r\n .filter(Boolean) as Field[];\r\n\r\n // ---- ancestry & immediate children (unchanged)\r\n const parentTags: Tag[] = [];\r\n let cur = tag?.bind_id;\r\n const guard = new Set<string>();\r\n while (cur && !guard.has(cur)) {\r\n const t = tagById.get(cur);\r\n if (!t) break;\r\n parentTags.push(t);\r\n guard.add(cur);\r\n cur = t.bind_id;\r\n }\r\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\r\n\r\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\r\n const services: DgpServiceCapability[] = [];\r\n const resolve = this.opts.resolveService;\r\n\r\n // 1) tag base\r\n let baseAddedFromTag = false;\r\n if (tag?.service_id != null) {\r\n services.push(\r\n resolve?.(tag.service_id) ??\r\n ({ id: tag.service_id } as DgpServiceCapability),\r\n );\r\n baseAddedFromTag = true;\r\n }\r\n\r\n // 2) walk selected ids in insertion order\r\n let baseOverridden = false;\r\n for (const selId of this.set) {\r\n // OPTION selected\r\n const opt = this.findOptionById(fields, selId);\r\n if (opt?.service_id != null) {\r\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(opt.service_id) ??\r\n ({ id: opt.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n continue;\r\n }\r\n\r\n // BUTTON FIELD selected\r\n const f = fieldById.get(selId);\r\n if (f?.button === true && f.service_id != null) {\r\n const role = (f.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(f.service_id) ??\r\n ({ id: f.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n }\r\n }\r\n\r\n return {\r\n tagId,\r\n tag,\r\n fields: visible,\r\n fieldIds,\r\n parentTags,\r\n childrenTags,\r\n services,\r\n };\r\n }\r\n\r\n private addServiceByRole(\r\n services: DgpServiceCapability[],\r\n cap: DgpServiceCapability,\r\n role: PricingRole,\r\n baseAddedFromTag: boolean,\r\n baseOverridden: boolean,\r\n ): boolean {\r\n if (role === \"base\") {\r\n if (!baseOverridden) {\r\n if (baseAddedFromTag && services.length > 0) {\r\n services[0] = cap;\r\n } else {\r\n services.unshift(cap);\r\n }\r\n return true;\r\n } else {\r\n services.push(cap);\r\n }\r\n } else {\r\n services.push(cap);\r\n }\r\n return baseOverridden;\r\n }\r\n\r\n private findOptionById(fields: Field[], selId: string) {\r\n if (this.builder.isOptionId(selId)) {\r\n for (const f of fields) {\r\n const o = f.options?.find((x) => x.id === selId);\r\n if (o) return o;\r\n }\r\n }\r\n if (selId.includes(\"::\")) {\r\n const [fid, oid] = selId.split(\"::\");\r\n const f = fields.find((x) => x.id === fid);\r\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\r\n if (o) return o;\r\n }\r\n return undefined;\r\n }\r\n}\r\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>, primary?: string): void {\n this.selection.many(ids, primary);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","// src/react/inputs/form-context.tsx\nimport type { ReactNode } from \"react\";\nimport * as React from \"react\";\n\nimport type { CoreContext } from \"@timeax/form-palette\";\nimport { Form, useCore } from \"@timeax/form-palette\";\n\ntype Dict = Record<string, unknown>;\n\nexport type FormSnapshot = Dict;\n\nexport type FormApi = {\n /** Value by fieldId (Wrapper uses name=field.id) */\n get: (fieldId: string) => unknown;\n /**\n * Programmatic set (NOT used by Wrapper).\n * If the field is mounted, writes into the core.\n * If not mounted, persists into core.bucket (via core.setValue) or local bag fallback.\n */\n set: (fieldId: string, value: unknown) => void;\n\n /** Option selections (legacy; kept for compatibility) */\n getSelections: (fieldId: string) => string[];\n setSelections: (fieldId: string, optionIds: string[]) => void;\n toggleSelection: (fieldId: string, optionId: string) => void;\n removeSelectionToken(token: string): void;\n\n /** Read-only snapshot for debugging (NO validation) */\n snapshot: () => FormSnapshot;\n\n /** Simple subscribe (re-render triggers) */\n subscribe: (fn: () => void) => () => void;\n\n /**\n * Validation gate:\n * local submit runs validation and returns mounted/visible values.\n * (This is NOT “submitting to a server”.)\n */\n submit: () => { values: Dict; valid: boolean };\n\n setFieldError(id: any, message: string): void;\n setErrors(errors: Record<string, string>): void;\n};\n\nconst Ctx = React.createContext<FormApi | null>(null);\n\nexport function useFormApi(): FormApi {\n const v = React.useContext(Ctx);\n if (!v) throw new Error(\"useFormApi must be used within <FormProvider />\");\n return v;\n}\n\nexport function useOptionalFormApi(): FormApi | null {\n return React.useContext(Ctx);\n}\n\nexport type FormProviderProps = {\n children: ReactNode;\n\n /** Optional schema (zod/jsonschema/etc, depending on your palette build) */\n schema?: any;\n\n /**\n * Same shape as the old OrderFlowProvider usage.\n * - values: seed values (persisted/rehydrated)\n * - selections: legacy (kept for compatibility)\n */\n initial?: {\n values?: Dict;\n selections?: Record<string, string[]>;\n };\n};\n\nexport function FormProvider({ children, schema, initial }: FormProviderProps) {\n // Indefinite memory (we keep values even when fields unmount)\n const [bag, setBag] = React.useState<Dict>(() => ({\n ...(initial?.values ?? {}),\n }));\n\n // Legacy selections (compat only)\n const [selectionsBag, setSelectionsBag] = React.useState<\n Record<string, string[]>\n >(() => ({ ...(initial?.selections ?? {}) }));\n\n // subscribe() support\n const listenersRef = React.useRef(new Set<() => void>());\n const publish = React.useCallback(() => {\n for (const fn of listenersRef.current) fn();\n }, []);\n\n // palette core ref (for submit/values/setValue)\n const coreRef = React.useRef<CoreContext<Dict> | null>(null);\n\n function Bridge() {\n const core = useCore<Dict>();\n\n React.useEffect(() => {\n coreRef.current = core;\n publish();\n return () => {\n coreRef.current = null;\n publish();\n };\n }, [core, publish]);\n\n return null;\n }\n\n const api = React.useMemo<FormApi>(() => {\n return {\n subscribe(fn) {\n listenersRef.current.add(fn);\n return () => listenersRef.current.delete(fn);\n },\n\n get(fieldId) {\n const core = coreRef.current;\n const live =\n (core?.values?.() as Dict | undefined) ?? undefined;\n\n // Prefer live (mounted + bucket), fallback to our indefinite bag\n if (live && fieldId in live) return live[fieldId];\n return bag[fieldId];\n },\n\n set(fieldId, value) {\n const core = coreRef.current;\n\n // Programmatic sets should go through core when possible\n // (core.setValue also persists to bucket when field isn't mounted).\n if (core) {\n core.setValue(fieldId, value);\n return;\n }\n\n // Fallback if core isn't mounted yet\n setBag((prev) => ({ ...prev, [fieldId]: value }));\n publish();\n },\n\n // Legacy selections API (compat; no longer used by the new Wrapper)\n getSelections(fieldId) {\n return selectionsBag[fieldId] ?? [];\n },\n setSelections(fieldId, optionIds) {\n setSelectionsBag((prev) => ({\n ...prev,\n [fieldId]: optionIds ?? [],\n }));\n publish();\n },\n toggleSelection(fieldId, optionId) {\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n if (current.has(optionId)) current.delete(optionId);\n else current.add(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n removeSelectionToken(token) {\n // token is \"fieldId:optionId\" in the old system; keep best-effort compat\n const [fieldId, optionId] = String(token).split(\":\", 2);\n if (!fieldId || !optionId) return;\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n current.delete(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n\n snapshot() {\n // IMPORTANT: read-only, NO validation here.\n const core = coreRef.current;\n const live = (core?.values?.() as Dict | undefined) ?? {};\n\n return live;\n },\n\n submit() {\n const core = coreRef.current;\n if (!core) return { values: {}, valid: false };\n\n // palette submit validates & returns mounted/visible values\n return core.submit() as { values: Dict; valid: boolean };\n },\n\n setFieldError(id: any, message: string) {\n const core = coreRef.current;\n if (!core) return;\n core.error(id, message);\n },\n\n setErrors(values: Record<string, string>) {\n const core = coreRef.current;\n if (!core) return;\n\n core.error(values);\n },\n };\n }, [bag, selectionsBag, publish]);\n\n return (\n <Ctx.Provider value={api}>\n <Form\n adapter=\"local\"\n schema={schema}\n valueBag={bag}\n formRef={coreRef}\n onChange={() => publish()}\n >\n <Bridge />\n {children}\n </Form>\n </Ctx.Provider>\n );\n}\n","import type React from \"react\";\r\nimport { Field, ServiceProps, Ui } from \"@/schema\";\r\n\r\n/** Matches your InputWrapper’s expectations */\r\nexport type InputKind = string; // e.g. \"text\", \"number\", \"select\", \"custom:Rating\"\r\nexport type InputVariant = \"default\" | (string & {});\r\n/* -------------------------------------------------------------------------- */\r\n/* Adapter rules (updated meaning) */\r\n/* - getValue: normalize what host emitted into stored value (for form-palette)*/\r\n/* - getSelectedOptions: REQUIRED if field.options exists (no guessing) */\r\n/* - isActive: optional for option-less action buttons */\r\n/* -------------------------------------------------------------------------- */\r\n\r\nexport type AdapterCtx = { field: Field; props: ServiceProps };\r\n\r\nexport type Adapter = {\r\n valueProp?: string;\r\n changeProp?: string;\r\n errorProp?: string;\r\n\r\n /** normalize what the host emitted into what we store in form-palette */\r\n getValue?: (next: unknown, current: unknown, ctx: AdapterCtx) => unknown;\r\n\r\n /** REQUIRED if field.options exists */\r\n getSelectedOptions?: (\r\n next: unknown,\r\n current: unknown,\r\n ctx: AdapterCtx,\r\n ) => string[];\r\n\r\n /** For option-less action buttons (button: true with no options) */\r\n isActive?: (stored: unknown, ctx: AdapterCtx) => boolean;\r\n getInputPropsFromField?: (props: AdapterCtx) => any;\r\n toValue?: (value: any) => any;\r\n};\r\n\r\nexport type InputDescriptor = {\r\n Component: React.ComponentType<Record<string, unknown>>;\r\n adapter?: Adapter;\r\n defaultProps?: Record<string, unknown>;\r\n ui?: Record<string, Ui>;\r\n};\r\n\r\ntype VariantMap = Map<InputVariant, InputDescriptor>;\r\ntype RegistryStore = Map<InputKind, VariantMap>;\r\n\r\nexport type Registry = {\r\n get(kind: InputKind, variant?: InputVariant): InputDescriptor | undefined;\r\n register(\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void;\r\n unregister(kind: InputKind, variant?: InputVariant): void;\r\n registerMany(\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void;\r\n /** low-level escape hatch */\r\n _store: RegistryStore;\r\n};\r\n\r\nexport function createInputRegistry(): Registry {\r\n const store: RegistryStore = new Map();\r\n\r\n const get = (\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n ): InputDescriptor | undefined => {\r\n const vm = store.get(kind);\r\n if (!vm) return undefined;\r\n const v = (variant ?? \"default\") as InputVariant;\r\n return vm.get(v) ?? vm.get(\"default\");\r\n };\r\n\r\n const register = (\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void => {\r\n let vm = store.get(kind);\r\n if (!vm) {\r\n vm = new Map<InputVariant, InputDescriptor>();\r\n store.set(kind, vm);\r\n }\r\n vm.set((variant ?? \"default\") as InputVariant, descriptor);\r\n };\r\n\r\n const unregister = (kind: InputKind, variant?: InputVariant): void => {\r\n const vm = store.get(kind);\r\n if (!vm) return;\r\n const key = (variant ?? \"default\") as InputVariant;\r\n vm.delete(key);\r\n if (vm.size === 0) store.delete(kind);\r\n };\r\n\r\n const registerMany = (\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void => {\r\n for (const e of entries) register(e.kind, e.descriptor, e.variant);\r\n };\r\n\r\n return { get, register, unregister, registerMany, _store: store };\r\n}\r\n\r\n/** Helper used by InputWrapper */\r\nexport function resolveInputDescriptor(\r\n registry: Registry,\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n): InputDescriptor | undefined {\r\n return registry.get(kind, variant);\r\n}\r\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createInputRegistry } from \"@/react\";\nimport type {\n Registry,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\n\ntype InputsCtxValue = {\n registry: Registry;\n register: (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ) => void;\n unregister: (kind: InputKind, variant?: InputVariant) => void;\n registerMany: (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ) => void;\n};\n\nconst Ctx = createContext<InputsCtxValue | null>(null);\n\nexport function Provider({\n children,\n initialRegistry,\n}: {\n children: ReactNode;\n /** Optional pre-built registry (e.g., you registered built-ins/customs before mounting) */\n initialRegistry?: Registry;\n}) {\n const registry = useMemo(\n () => initialRegistry ?? createInputRegistry(),\n [initialRegistry],\n );\n\n const value = useMemo<InputsCtxValue>(\n () => ({\n registry,\n register: registry.register,\n unregister: registry.unregister,\n registerMany: registry.registerMany,\n }),\n [registry],\n );\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useInputs(): InputsCtxValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useInputs() must be used within <InputsProvider>\");\n return v;\n}\n","// src/react/inputs/wrapper.tsx\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { useField } from \"@timeax/form-palette\";\n\nimport type { Field, FieldOption } from \"@/schema\";\nimport type { Scalar } from \"@/schema/order\";\n\nimport type {\n Adapter,\n AdapterCtx,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\nimport { resolveInputDescriptor, useInputs } from \"@/react\";\n\nimport { useOrderFlow } from \"@/react/hooks/use-order-flow\";\n\nfunction toKind(field: Field): InputKind {\n return field.type as InputKind;\n}\n\nfunction toVariant(field: Field): InputVariant | undefined {\n const v = (field as any).meta?.variant;\n return typeof v === \"string\" && v.trim() ? (v as InputVariant) : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Safe templating (no eval) */\n/* -------------------------------------------------------------------------- */\n\nfunction getPath(ctx: Record<string, unknown>, path: string): unknown {\n const parts = path\n .split(\".\")\n .map((p) => p.trim())\n .filter(Boolean);\n\n let cur: any = ctx;\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n return cur;\n}\n\nfunction parseLiteral(raw: string, ctx: Record<string, unknown>): unknown {\n const s = raw.trim();\n if (!s) return \"\";\n\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n\n const n = Number(s);\n if (!Number.isNaN(n) && s !== \"\") return n;\n\n return getPath(ctx, s);\n}\n\nfunction evalMiniExpr(exprRaw: string, ctx: Record<string, unknown>): string {\n const expr = exprRaw.trim();\n\n const idxNullish = expr.indexOf(\"??\");\n const idxOr = expr.indexOf(\"||\");\n\n const splitAt =\n idxNullish >= 0\n ? { idx: idxNullish, op: \"??\" as const }\n : idxOr >= 0\n ? { idx: idxOr, op: \"||\" as const }\n : null;\n\n const left = splitAt ? expr.slice(0, splitAt.idx).trim() : expr;\n const right = splitAt ? expr.slice(splitAt.idx + 2).trim() : \"\";\n\n const leftVal = getPath(ctx, left);\n\n const isTruthy = (v: unknown) => !!v;\n const isNullish = (v: unknown) => v === null || v === undefined;\n\n const chooseFallback =\n splitAt?.op === \"??\"\n ? isNullish(leftVal)\n : splitAt?.op === \"||\"\n ? !isTruthy(leftVal)\n : false;\n\n const chosen = chooseFallback ? parseLiteral(right, ctx) : leftVal;\n\n if (chosen === null || chosen === undefined) return \"\";\n if (\n typeof chosen === \"string\" ||\n typeof chosen === \"number\" ||\n typeof chosen === \"boolean\"\n ) {\n return String(chosen);\n }\n\n try {\n return JSON.stringify(chosen);\n } catch {\n return String(chosen);\n }\n}\n\nfunction templateString(str: string, ctx: Record<string, unknown>): string {\n return str.replace(/\\{([^}]+)}/g, (_m, expr) =>\n evalMiniExpr(String(expr), ctx),\n );\n}\n\nfunction templateDeep<T>(value: T, ctx: Record<string, unknown>): T {\n if (typeof value === \"string\") return templateString(value, ctx) as any;\n if (Array.isArray(value))\n return value.map((v) => templateDeep(v, ctx)) as any;\n\n if (value && typeof value === \"object\") {\n const out: any = {};\n for (const [k, v] of Object.entries(value as any)) {\n out[k] = templateDeep(v, ctx);\n }\n return out;\n }\n\n return value;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Wrapper */\n/* -------------------------------------------------------------------------- */\n\nexport type InputWrapperProps = {\n field: Field;\n disabled?: boolean;\n\n extraProps?: Record<string, unknown>;\n templateStrings?: boolean;\n ctxOverrides?: Record<string, unknown>;\n className?: string;\n};\n\nexport function Wrapper({\n field,\n disabled,\n extraProps,\n templateStrings = true,\n ctxOverrides,\n className = \"\",\n}: InputWrapperProps) {\n const { registry } = useInputs();\n const flow = useOrderFlow();\n\n const kind = toKind(field);\n const variant = toVariant(field);\n\n const descriptor: InputDescriptor | undefined = React.useMemo(\n () => resolveInputDescriptor(registry, kind, variant),\n [kind, registry, variant],\n );\n\n if (!descriptor) {\n // eslint-disable-next-line no-console\n console.warn(\"[Wrapper] No descriptor for\", { kind, variant, field });\n return null;\n }\n\n const Component = descriptor.Component as any;\n const adapter = (descriptor.adapter ?? {}) as Adapter;\n const baseProps = (descriptor.defaultProps ?? {}) as Record<\n string,\n unknown\n >;\n\n const defaultProps = useMemo(() => {\n return { ...baseProps, ...(field.defaults ?? {}) };\n }, [baseProps, field.defaults]);\n\n const valueProp = adapter.valueProp ?? \"value\";\n const changeProp = adapter.changeProp ?? \"onChange\";\n const errorProp = adapter.errorProp ?? \"errorText\";\n\n const isOptionBased =\n Array.isArray(field.options) && field.options.length > 0;\n\n // action button = option-less button\n const isActionButton = field.button === true && !isOptionBased;\n\n // Register into form-palette:\n // ✅ name is ALWAYS field.id (only name)\n const fp = useField({\n name: field.id,\n required: !!field.required,\n variant: field.type as any,\n defaultValue: field.defaults?.value,\n disabled: !!disabled,\n });\n\n // Option ids allow-list (defensive)\n const optionIds = React.useMemo(() => {\n if (!isOptionBased) return new Set<string>();\n return new Set((field.options ?? []).map((o: FieldOption) => o.id));\n }, [isOptionBased, field.options]);\n\n // Selection syncing bookkeeping\n const prevSelectedRef = React.useRef<string[]>([]);\n React.useEffect(() => {\n prevSelectedRef.current = [];\n }, [field.id]);\n\n const adapterCtx = React.useMemo<AdapterCtx>(\n () => ({ field, props: flow.raw }),\n [field, flow.raw],\n );\n\n const onHostChange = React.useCallback(\n (next: unknown) => {\n const currentStored = (next as any)?.value;\n\n // 1) normalize into stored value\n const stored =\n adapter.getValue?.(next, currentStored, adapterCtx) ??\n currentStored ??\n next;\n\n // 2) write ONLY via form-palette's onChange\n fp.setValue(stored);\n\n // 3) sync visibility triggers to Selection (via order flow)\n if (isOptionBased) {\n if (!adapter.getSelectedOptions) {\n throw new Error(\n `[Wrapper] Adapter for \"${field.id}\" (${field.type}) must implement getSelectedOptions() because this field has options.`,\n );\n }\n\n const rawIds = adapter.getSelectedOptions(\n next,\n stored,\n adapterCtx,\n );\n\n const nextIds = Array.from(\n new Set(\n (rawIds ?? [])\n .map(String)\n .filter((id) => optionIds.has(id)),\n ),\n );\n\n const prev = prevSelectedRef.current;\n prevSelectedRef.current = nextIds;\n\n const prevSet = new Set(prev);\n const nextSet = new Set(nextIds);\n\n // toggle ON\n for (const id of nextIds) {\n if (!prevSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n // toggle OFF\n for (const id of prev) {\n if (!nextSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n return;\n }\n\n if (isActionButton) {\n const isActive =\n adapter.isActive?.(stored, adapterCtx) ?? Boolean(stored);\n if (isActive) flow.toggleOption(field.id);\n else flow.clearField(field.id);\n }\n },\n [\n adapter,\n adapterCtx,\n field.id,\n field.type,\n flow,\n fp,\n isActionButton,\n isOptionBased,\n optionIds,\n ],\n );\n\n // Template context (keep your current behavior)\n const templateCtx = React.useMemo<Record<string, unknown>>(() => {\n const ctxFromInit = (flow as any).init?.ctx ?? {};\n const ctx =\n ctxOverrides && typeof ctxOverrides === \"object\"\n ? { ...(ctxFromInit as any), ...(ctxOverrides as any) }\n : (ctxFromInit as Record<string, unknown>);\n\n return {\n ...ctx,\n field,\n flow,\n value: fp.value,\n error: fp.error,\n };\n }, [ctxOverrides, field, flow, fp.error, fp.value]);\n\n const templatedDefaultProps = React.useMemo(() => {\n if (!templateStrings) return defaultProps;\n return templateDeep(defaultProps as any, templateCtx);\n }, [defaultProps, templateCtx, templateStrings]);\n\n const templatedExtraProps = React.useMemo(() => {\n if (!templateStrings)\n return (extraProps ?? {}) as Record<string, unknown>;\n return templateDeep((extraProps ?? {}) as any, templateCtx);\n }, [extraProps, templateCtx, templateStrings]);\n\n const fieldProps =\n adapter?.getInputPropsFromField?.({ field, props: flow.raw }) ?? {};\n // Build host props\n const hostProps: Record<string, unknown> = {\n id: field.id,\n field,\n disabled: !!disabled || !!fp.disabled,\n required: field.required,\n\n // DO NOT pass `name` to InputField/entries\n fieldKey: field.id,\n\n ...(fieldProps ?? {}),\n // error channel\n error: fp.error,\n\n ...(templatedDefaultProps ?? {}),\n ...(templatedExtraProps ?? {}),\n };\n\n // value + change wiring\n hostProps[valueProp] = (fp.value ?? null) as Scalar | Scalar[] | null;\n hostProps[changeProp] = onHostChange;\n hostProps[errorProp] = fp.error;\n\n return (\n <div ref={fp.ref as any} className={className}>\n <Component {...hostProps} />\n </div>\n );\n}\n","// src/react/hooks/use-order-flow.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { ServiceProps, ServicePropsNotice } from \"@/schema\";\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nimport { buildOrderSnapshot } from \"@/utils/build-order-snapshot\";\nimport {\n type OrderFlowInitializeParams,\n useOrderFlowContext,\n} from \"./order-flow-provider\";\n\nimport type {\n VisibleGroup,\n VisibleGroupResult,\n} from \"@/react/canvas/selection\";\nimport { validateVisibleFields } from \"@/react/hooks/evalute-field-validation\";\n\nconst ROOT_TAG_ID = \"t:root\";\n\ntype NormalizeRateFn = (service: unknown) => number;\n\nexport type PricingPreview = {\n serviceId?: string | number;\n unitRate: number;\n base: number;\n utilities: number;\n total: number;\n utilityBreakdown: Array<{\n nodeId: string;\n mode: string;\n amount: number;\n }>;\n};\n\nexport type UseOrderFlowReturn = {\n ready: boolean;\n initialize: (params: OrderFlowInitializeParams) => void;\n\n activeTagId?: string;\n\n /** raw service props */\n raw: ServiceProps;\n\n /** visibility is Selection-only */\n visibleGroup: VisibleGroup | null;\n\n /**\n * Values are from form-palette (values()) and are already \"visible-only\"\n * because your UI mounts only visible fields.\n */\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\n\n /**\n * Selections are Selection-only now.\n * We keep this for compatibility with buildOrderSnapshot signature,\n * but we do NOT read it from form anymore.\n */\n optionSelectionsByFieldId: Record<string, string[]>;\n\n quantityPreview: number;\n services: Array<string | number>;\n serviceMap: Record<string, Array<string | number>>;\n\n pricingPreview: PricingPreview;\n\n min: number;\n max: number;\n\n selectTag: (tagId: string) => void;\n toggleOption: (fieldId: string, optionId?: string) => void;\n\n /** programmatic value set (rare; wrapper/field hook should handle most) */\n setValue: (fieldId: string, value: Scalar | Scalar[]) => void;\n clearField: (fieldId: string) => void;\n\n reset: (opts?: { keepTag?: boolean }) => void;\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n\n /** VALIDATES via form.submit() */\n buildSnapshot: () => OrderSnapshot | undefined;\n\n notices: ServicePropsNotice[];\n\n fallbackPolicy: FallbackSettings;\n setFallbackPolicy: (next: FallbackSettings) => void;\n};\n\nexport function useOrderFlow(): UseOrderFlowReturn {\n const ctx = useOrderFlowContext();\n const ready = ctx.ready();\n\n const initialize = useCallback(\n (params: OrderFlowInitializeParams) => {\n ctx.initialize(params);\n },\n [ctx],\n );\n\n // keep propsRef updated (best-effort; only when ready)\n const propsRef = useRef<ServiceProps | null>(null);\n useEffect(() => {\n if (!ready) return;\n propsRef.current = ctx.ensureReady(\"propsRef\").builder.getProps();\n }, [ctx, ready]);\n\n /**\n * Selection tick: Selection is external, so we force re-render.\n */\n const [selTick, setSelTick] = useState(0);\n useEffect(() => {\n if (!ready) return;\n const sel = ctx.selection;\n if (!sel?.onChange) return;\n return sel.onChange(() => setSelTick((x) => x + 1));\n }, [ready, ctx.selection]);\n\n /**\n * Form tick: form-palette bridge is pub/sub, so we subscribe.\n * On each tick we recompute form.values() or form.submit() where needed.\n */\n const [formTick, setFormTick] = useState(0);\n useEffect(() => {\n return ctx.formApi.subscribe(() => setFormTick((x) => x + 1));\n }, [ctx.formApi]);\n\n /**\n * Visibility is Selection-only. No form-based augmentation.\n */\n const visibleGroup: VisibleGroup | null = useMemo(() => {\n if (!ready) return null;\n\n const sel = ctx.selection;\n if (!sel) return null;\n\n const vg: VisibleGroupResult = sel.visibleGroup();\n if (vg.kind !== \"single\") return null;\n\n return vg.group ?? null;\n }, [ready, ctx.selection, selTick]);\n\n const activeTagId = useMemo(() => {\n if (!ready) return undefined;\n return ctx.selection?.currentTag?.() ?? ctx.activeTagId;\n }, [ready, ctx.selection, ctx.activeTagId, selTick]);\n\n /**\n * Preview values:\n * - NO validation\n * - driven by form.values() (core.values())\n * - already visible-only because only visible fields are mounted.\n */\n const formValuesByFieldId: Record<string, Scalar | Scalar[]> =\n useMemo(() => {\n const values = (ctx.formApi.snapshot?.() ?? {}) as Record<\n string,\n Scalar | Scalar[]\n >;\n\n return values;\n }, [ctx.formApi, formTick]);\n\n /**\n * Selections are Selection-only now.\n * Keep empty map for snapshot builder signature.\n */\n const optionSelectionsByFieldId = useMemo(\n () => ({}) as Record<string, string[]>,\n [],\n );\n\n /**\n * Preview snapshot uses form.values() (no validation) + Selection context.\n */\n const previewSnapshot: OrderSnapshot = useMemo(() => {\n if (!ready) {\n return {\n version: \"1\",\n mode: \"prod\",\n builtAt: new Date().toISOString(),\n selection: { tag: \"unknown\", fields: [], buttons: [] },\n inputs: { form: {}, selections: {} },\n quantity: 1,\n quantitySource: { kind: \"default\", defaultedFromHost: true },\n services: [],\n min: 1,\n max: 1,\n serviceMap: {},\n meta: {\n schema_version: propsRef.current?.schema_version,\n context: {\n tag: \"unknown\",\n constraints: {},\n nodeContexts: {},\n policy: {\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n requireConstraintFit: true,\n },\n },\n },\n };\n }\n\n const { builder, init, selection } = ctx.ensureReady(\"previewSnapshot\");\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n /// console.log(formValuesByFieldId)\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: activeTagId ?? ROOT_TAG_ID,\n formValuesByFieldId,\n selectedKeys: selection.selectedButtons(),\n optionSelectionsByFieldId, // Selection-owned now\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [\n ready,\n ctx,\n activeTagId,\n formValuesByFieldId,\n optionSelectionsByFieldId,\n selTick,\n ]);\n\n /**\n * Pricing preview unchanged (driven from previewSnapshot)\n */\n const pricingPreview: PricingPreview = useMemo(() => {\n const empty: PricingPreview = {\n unitRate: 0,\n base: 0,\n utilities: 0,\n total: 0,\n utilityBreakdown: [],\n };\n\n if (!ready) return empty;\n\n const { init } = ctx.ensureReady(\"pricingPreview\");\n const normalizeRate: NormalizeRateFn =\n ((init as unknown as { normalizeRate?: NormalizeRateFn })\n .normalizeRate as NormalizeRateFn) ??\n ((s: any) => Number(s?.rate));\n\n const quantity = Number(previewSnapshot.quantity ?? 1) || 1;\n\n let bestId: string | number | undefined;\n let bestRate = 0;\n\n const selectedIds = (previewSnapshot.services ?? []) as Array<\n string | number\n >;\n const svcMap = (init as any).services as Record<\n string | number,\n unknown\n >;\n\n for (const id of selectedIds) {\n const svc = svcMap?.[id];\n if (!svc) continue;\n\n const r = Number(normalizeRate(svc));\n if (!Number.isFinite(r)) continue;\n\n if (r > bestRate) {\n bestRate = r;\n bestId = id;\n }\n }\n\n const base = bestRate * quantity;\n\n const breakdown: PricingPreview[\"utilityBreakdown\"] = [];\n let utilitiesTotal = 0;\n\n const utils = ((previewSnapshot as any).utilities ?? []) as Array<any>;\n for (const u of utils) {\n const rate = Number(u?.rate);\n if (!Number.isFinite(rate)) continue;\n\n let amount = 0;\n const mode = String(u?.mode ?? \"\");\n\n switch (mode) {\n case \"flat\":\n amount = rate;\n break;\n case \"per_quantity\":\n amount = rate * quantity;\n break;\n case \"percent\":\n amount = base * (rate / 100);\n break;\n default:\n amount = 0;\n }\n\n if (Number.isFinite(amount) && amount !== 0) {\n utilitiesTotal += amount;\n breakdown.push({\n nodeId: String(u?.nodeId ?? \"\"),\n mode,\n amount,\n });\n }\n }\n\n return {\n serviceId: bestId,\n unitRate: bestRate,\n base,\n utilities: utilitiesTotal,\n total: base + utilitiesTotal,\n utilityBreakdown: breakdown,\n };\n }, [ready, ctx, previewSnapshot]);\n\n const selectTag = useCallback(\n (tagId: string) => {\n ctx.ensureReady(\"selectTag\");\n ctx.selection?.replace?.(tagId);\n ctx.setActiveTag(tagId);\n },\n [ctx],\n );\n\n /**\n * Selection-only toggles.\n * (No form selections.)\n */\n const toggleOption = useCallback(\n (fieldId: string, optionId?: string) => {\n const token = optionId ?? fieldId;\n ctx.selection?.toggle?.(token);\n },\n [ctx],\n );\n\n const setValue = useCallback(\n (fieldId: string, value: Scalar | Scalar[]) => {\n // programmatic, goes into form memory (core bucket)\n ctx.formApi.set(fieldId, value);\n },\n [ctx],\n );\n\n const clearField = useCallback(\n (fieldId: string) => {\n ctx.formApi.set(fieldId, undefined);\n ctx.selection?.remove?.(fieldId);\n },\n [ctx],\n );\n\n const reset = useCallback(\n (opts?: { keepTag?: boolean }) => {\n ctx.ensureReady(\"reset\");\n ctx.reset(opts);\n },\n [ctx],\n );\n\n const setSnapshot = useCallback(\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\n ctx.ensureReady(\"setSnapshot\");\n ctx.setSnapshot(snap, opts);\n },\n [ctx],\n );\n\n /**\n * Build snapshot must VALIDATE.\n * This is where form.submit() belongs.\n */\n const buildSnapshot = useCallback((): OrderSnapshot | undefined => {\n const { builder, selection, init } = ctx.ensureReady(\"buildSnapshot\");\n\n const tagId = selection.currentTag();\n const selectedKeys = selection.selectedButtons();\n if (!tagId) {\n throw new Error(\"OrderFlow: no active tag/context selected\");\n }\n\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n const submitted = ctx.formApi.submit();\n const values = submitted.values as Record<string, Scalar | Scalar[]>;\n\n if (!submitted.valid) return;\n\n const visibleFieldIds =\n builder.visibleFields?.(tagId, selectedKeys) ??\n builder\n .getProps()\n .fields.filter((f) => f.bind_id === tagId)\n .map((f) => f.id);\n\n const fieldById = new Map(\n builder.getProps().fields.map((field) => [field.id, field]),\n );\n\n const customIssues = validateVisibleFields(\n visibleFieldIds,\n fieldById,\n values,\n );\n\n if (customIssues.length > 0) {\n ctx.formApi.setErrors?.(\n Object.fromEntries(\n customIssues.map((issue) => [issue.fieldId, issue.message]),\n ),\n );\n\n return;\n }\n\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: tagId,\n formValuesByFieldId: values,\n selectedKeys,\n optionSelectionsByFieldId,\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [ctx, optionSelectionsByFieldId]);\n\n const raw = useMemo(() => {\n if (!ready) return propsRef.current ?? ({} as ServiceProps);\n return ctx.ensureReady(\"raw\").builder.getProps();\n }, [ctx, ready, selTick]);\n\n const notices = useMemo(() => raw.notices ?? [], [raw]);\n\n return {\n ready,\n initialize,\n\n activeTagId,\n raw,\n notices,\n\n visibleGroup,\n\n formValuesByFieldId,\n optionSelectionsByFieldId,\n\n quantityPreview: previewSnapshot.quantity,\n services: previewSnapshot.services,\n serviceMap: previewSnapshot.serviceMap,\n\n pricingPreview,\n\n min: previewSnapshot.min ?? 1,\n max: previewSnapshot.max ?? previewSnapshot.min ?? 1,\n\n selectTag,\n toggleOption,\n setValue,\n clearField,\n\n reset,\n setSnapshot,\n\n buildSnapshot,\n\n fallbackPolicy: ctx.fallbackPolicy,\n setFallbackPolicy: ctx.setFallbackPolicy,\n };\n}\n","// src/react/hooks/order-flow-provider.tsx\r\nimport React, {\r\n createContext,\r\n forwardRef,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { FormProvider, Provider, useFormApi } from \"@/react\";\r\nimport type { Registry as InputRegistryConfig } from \"../inputs/registry\";\r\n\r\nimport { type Builder, type BuilderOptions, createBuilder } from \"@/core\";\r\n\r\nimport type { ServiceProps, Tag } from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\r\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\nimport { Selection } from \"../canvas/selection\";\r\n\r\nconst ROOT_TAG_ID = \"t:root\";\r\n\r\n/* ───────────────────────── Types ───────────────────────── */\r\n\r\nexport type OrderFlowInit = {\r\n mode?: \"prod\" | \"dev\";\r\n /** required service map used for snapshot building / rules */\r\n services: DgpServiceMap;\r\n /** fallback policy overrides */\r\n fallback?: FallbackSettings;\r\n /** hydrate initial state from snapshot */\r\n hydrateFrom?: OrderSnapshot;\r\n /** initial tag (ignored if hydrateFrom exists and provides tag) */\r\n initialTagId?: string;\r\n /** default quantity used by snapshot builder (default 1) */\r\n hostDefaultQuantity?: number;\r\n /** selection resolver (optional) */\r\n resolveService?: (id: number | string) => DgpServiceCapability | undefined;\r\n /**\r\n * Host props provided to further enhance the nodes data\r\n */\r\n ctx?: Record<string, unknown>;\r\n\r\n normalizeRate?(svc: DgpServiceCapability): number;\r\n};\r\n\r\ntype ProviderFlow = {\r\n builder: Builder;\r\n selection?: Selection;\r\n};\r\n\r\nexport type OrderFlowProviderProps = {\r\n /**\r\n * Optional at mount time.\r\n * If absent, call initialize(...) later (via ref OR hook API).\r\n */\r\n serviceProps?: ServiceProps;\r\n builder?: Builder;\r\n flow?: ProviderFlow;\r\n\r\n builderOptions?: BuilderOptions;\r\n\r\n /** optional selection override (if not passed in flow) */\r\n selection?: Selection;\r\n\r\n /** Host input registry (maps kind/variant → components) */\r\n registry?: InputRegistryConfig;\r\n\r\n /** Optional now (deferred init supported). */\r\n init?: OrderFlowInit;\r\n\r\n children?: ReactNode;\r\n};\r\n\r\nexport type OrderFlowInitializeParams = {\r\n serviceProps?: ServiceProps;\r\n builder?: Builder;\r\n flow?: ProviderFlow;\r\n\r\n builderOptions?: BuilderOptions;\r\n selection?: Selection;\r\n\r\n init: OrderFlowInit;\r\n};\r\n\r\nexport type OrderFlowHandle = {\r\n /** whether provider has enough info to run */\r\n ready: () => boolean;\r\n\r\n /** (re)initialize the provider */\r\n initialize: (params: OrderFlowInitializeParams) => void;\r\n\r\n getActiveTag: () => string | undefined;\r\n selectTag: (tagId: string) => void;\r\n\r\n getVisibleGroup: () => ReturnType<Selection[\"visibleGroup\"]>;\r\n getSelectionIds: () => string[];\r\n clearSelection: () => void;\r\n\r\n /** Apply snapshot into selection + form values/selections */\r\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\r\n\r\n /** Reset tag + clear fields */\r\n reset: (opts?: { keepTag?: boolean }) => void;\r\n\r\n refresh: () => void;\r\n};\r\n\r\n/* ───────────────────────── Context ───────────────────────── */\r\n\r\ntype NormalizedInit = Required<\r\n Pick<OrderFlowInit, \"mode\" | \"hostDefaultQuantity\">\r\n> &\r\n OrderFlowInit;\r\n\r\ntype EnsureReadyResult = {\r\n builder: Builder;\r\n selection: Selection;\r\n init: NormalizedInit;\r\n};\r\n\r\ntype CtxShape = {\n builder: Builder | null;\n selection: Selection | null;\n\n activeTagId?: string;\n setActiveTag: (id: string) => void;\n\r\n init: NormalizedInit | null;\r\n\r\n /** Form API from FormProvider (always available) */\r\n formApi: ReturnType<typeof useFormApi>;\r\n\r\n /** fallback policy (owned here; used by hook) */\r\n fallbackPolicy: FallbackSettings;\r\n setFallbackPolicy: (next: FallbackSettings) => void;\r\n\r\n /** imperative helpers exposed to hook */\r\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\r\n reset: (opts?: { keepTag?: boolean }) => void;\r\n\r\n /** guards */\r\n ready: () => boolean;\r\n ensureReady: (op?: string) => EnsureReadyResult;\r\n\r\n /** init API */\r\n initialize: (params: OrderFlowInitializeParams) => void;\r\n};\r\n\r\nconst OrderFlowCtx = createContext<CtxShape | null>(null);\r\n\r\nexport function useOrderFlowContext(): CtxShape {\r\n const ctx = useContext(OrderFlowCtx);\r\n if (!ctx)\r\n throw new Error(\r\n \"useOrderFlowContext must be used within <OrderFlowProvider>\",\r\n );\r\n return ctx;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction findDefaultTagId(tags: Tag[]): string | undefined {\r\n if (!tags?.length) return undefined;\r\n const hasRoot = tags.some((t) => t.id === ROOT_TAG_ID);\r\n return hasRoot ? ROOT_TAG_ID : tags[0]!.id;\r\n}\r\n\r\n/** Snapshot.inputs.form is keyed by field.name; map -> fieldId for FormProvider initial */\r\nfunction mapSnapshotFormToFieldIds(\r\n builder: Builder,\r\n snap: OrderSnapshot,\r\n): Record<string, Scalar | Scalar[]> {\r\n const byFieldId: Record<string, Scalar | Scalar[]> = {};\r\n const form = snap.inputs?.form ?? {};\r\n const fields = builder.getProps().fields ?? [];\r\n\r\n const nameToIds = new Map<string, string[]>();\r\n for (const f of fields) {\r\n if (!f.name) continue;\r\n const arr = nameToIds.get(f.name) ?? [];\r\n arr.push(f.id);\r\n nameToIds.set(f.name, arr);\r\n }\r\n\r\n for (const [name, value] of Object.entries(form)) {\r\n for (const fid of nameToIds.get(name) ?? []) {\r\n byFieldId[fid] = value as Scalar | Scalar[];\r\n }\r\n }\r\n\r\n return byFieldId;\r\n}\r\n\r\nfunction makeDefaultFallback(\n mode: \"prod\" | \"dev\",\n patch?: FallbackSettings,\n): FallbackSettings {\n return {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(patch ?? {}),\n };\r\n}\r\n\r\nfunction normalizeInit(init: OrderFlowInit): NormalizedInit {\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number.isFinite(init.hostDefaultQuantity ?? 1)\n ? Number(init.hostDefaultQuantity ?? 1)\n : 1;\n return { ...init, mode, hostDefaultQuantity };\n}\n\nfunction sameNormalizedInit(\n a: NormalizedInit | null,\n b: NormalizedInit | null,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n return (\n a.mode === b.mode &&\n a.hostDefaultQuantity === b.hostDefaultQuantity &&\n a.services === b.services &&\n a.fallback === b.fallback &&\n a.hydrateFrom === b.hydrateFrom &&\n a.initialTagId === b.initialTagId &&\n a.resolveService === b.resolveService &&\n a.ctx === b.ctx &&\n a.normalizeRate === b.normalizeRate\n );\n}\n\nfunction sameServiceProps(\n a: ServiceProps | null | undefined,\n b: ServiceProps | null | undefined,\n): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n}\n\r\n/* ───────────────────────── Bridge ───────────────────────── */\r\n/**\r\n * This component MUST live inside <FormProvider> so it can call useFormApi()\r\n * and provide OrderFlowCtx synchronously on the first render.\r\n */\r\nfunction OrderFlowCtxBridge(props: {\r\n ctxValue: Omit<CtxShape, \"formApi\">;\r\n formApiRef: React.MutableRefObject<ReturnType<typeof useFormApi> | null>;\r\n children?: ReactNode;\r\n}) {\r\n const formApi = useFormApi();\r\n props.formApiRef.current = formApi; // sync (render-time) ref\r\n\r\n return (\r\n <OrderFlowCtx.Provider value={{ ...props.ctxValue, formApi }}>\r\n {props.children}\r\n </OrderFlowCtx.Provider>\r\n );\r\n}\r\n\r\n/* ───────────────────────── Component ───────────────────────── */\r\n\r\nexport const OrderFlowProvider = forwardRef<\r\n OrderFlowHandle,\r\n OrderFlowProviderProps\r\n>(function OrderFlowProvider(\r\n {\r\n flow,\r\n builder: builderProp,\r\n serviceProps,\r\n builderOptions,\r\n selection: selectionProp,\r\n registry,\r\n init,\r\n children,\r\n },\r\n ref,\r\n) {\r\n // deferred init storage\r\n const builderRef = useRef<Builder | null>(null);\n const selectionRef = useRef<Selection | null>(null);\n const initRef = useRef<NormalizedInit | null>(null);\n const unsubRef = useRef<null | (() => void)>(null);\n\r\n // Form API ref (render-time set by bridge)\r\n const formApiRef = useRef<ReturnType<typeof useFormApi> | null>(null);\r\n\r\n // active tag tracking\r\n const [activeTagId, setActiveTagId] = useState<string | undefined>(\r\n undefined,\r\n );\r\n\r\n // fallback policy state\r\n const [fallbackPolicy, setFallbackPolicy] = useState<FallbackSettings>(() =>\r\n makeDefaultFallback(\"prod\"),\r\n );\r\n\r\n // to re-render when initialize() is called\r\n const [, force] = useState(0);\r\n const bump = () => force((x) => x + 1);\r\n\r\n const resolveBuilder = useCallback(\n (p: {\n flow?: ProviderFlow;\n builder?: Builder;\r\n serviceProps?: ServiceProps;\r\n builderOptions?: BuilderOptions;\r\n }) => {\r\n if (p.flow?.builder) return p.flow.builder;\r\n if (p.builder) return p.builder;\r\n\r\n if (p.serviceProps) {\r\n const b = createBuilder(p.builderOptions ?? {});\r\n b.load(p.serviceProps);\r\n return b;\r\n }\r\n\r\n return null;\r\n },\r\n [],\n );\n\n const resolvedBuilder = useMemo(\n () =>\n resolveBuilder({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n }),\n [builderOptions, builderProp, flow, resolveBuilder, serviceProps],\n );\n\n const effectiveInit = useMemo<NormalizedInit | null>(() => {\n if (init) return normalizeInit(init);\n if (!resolvedBuilder) return null;\n return normalizeInit({\n services: {},\n mode: \"prod\",\n hostDefaultQuantity: 1,\n });\n }, [init, resolvedBuilder]);\n\n useEffect(() => {\n return () => {\n if (unsubRef.current) unsubRef.current();\n };\r\n }, []);\r\n\r\n const resolveSelection = useCallback(\r\n (\r\n b: Builder,\r\n nInit: NormalizedInit,\r\n p: { flow?: ProviderFlow; selection?: Selection },\r\n ) => {\r\n return (\r\n p.flow?.selection ??\r\n p.selection ??\r\n new Selection(b, {\r\n env: \"client\",\r\n rootTagId: ROOT_TAG_ID,\r\n resolveService: nInit.resolveService,\r\n })\r\n );\r\n },\r\n [],\r\n );\r\n\r\n const ready = useCallback(\r\n () =>\r\n !!builderRef.current && !!selectionRef.current && !!initRef.current,\r\n [],\r\n );\r\n\r\n const ensureReady = useCallback((op?: string): EnsureReadyResult => {\r\n const b = builderRef.current;\r\n const s = selectionRef.current;\r\n const i = initRef.current;\r\n\r\n if (!b || !s || !i) {\r\n const hint = op ? ` (${op})` : \"\";\r\n throw new Error(\r\n `OrderFlowProvider is not initialized${hint}. Call initialize(...) or pass init + serviceProps/builder.`,\r\n );\r\n }\r\n return { builder: b, selection: s, init: i };\r\n }, []);\r\n\r\n const wireSelectionListener = useCallback((sel: Selection) => {\r\n setActiveTagId(sel.currentTag());\r\n return sel.onChange(() => setActiveTagId(sel.currentTag()));\r\n }, []);\r\n\r\n const initialize = useCallback(\r\n (params: OrderFlowInitializeParams) => {\r\n const b = resolveBuilder(params);\r\n if (!b) {\r\n throw new Error(\r\n \"OrderFlowProvider.initialize: requires `serviceProps` or `builder`/`flow.builder`.\",\r\n );\r\n }\r\n\r\n const nInit = normalizeInit(params.init);\r\n const sel = resolveSelection(b, nInit, {\r\n flow: params.flow,\r\n selection: params.selection,\r\n });\r\n\r\n builderRef.current = b;\r\n selectionRef.current = sel;\r\n initRef.current = nInit;\r\n\r\n setFallbackPolicy(makeDefaultFallback(nInit.mode, nInit.fallback));\r\n\r\n // ✅ bind listener immediately (and replace any previous listener)\r\n if (unsubRef.current) unsubRef.current();\r\n unsubRef.current = sel.onChange(() =>\r\n setActiveTagId(sel.currentTag()),\r\n );\r\n\r\n // ✅ choose initial tag (hydrate -> init -> root -> first)\r\n const tags = b.getProps().filters ?? [];\r\n const hydratedTag = nInit.hydrateFrom?.selection?.tag;\r\n const initialTag = nInit.hydrateFrom\r\n ? hydratedTag\r\n : (nInit.initialTagId ?? findDefaultTagId(tags));\r\n\r\n if (initialTag) sel.replace(initialTag);\r\n else if (tags.length) sel.replace(tags[0]!.id);\r\n\r\n // ✅ set activeTagId synchronously right now\r\n setActiveTagId(sel.currentTag());\r\n\r\n // ✅ late-init hydration: MUST be imperative (FormProvider.initial won't re-run)\r\n const api = formApiRef.current;\r\n\r\n if (api && nInit.hydrateFrom) {\r\n // selections are already fieldId-keyed\r\n const selMap = nInit.hydrateFrom.inputs?.selections ?? {};\r\n for (const [fid, oids] of Object.entries(selMap)) {\r\n api.setSelections(fid, oids ?? []);\r\n }\r\n\r\n // form is keyed by field.name -> map to fieldId(s)\r\n const valuesByFieldId = mapSnapshotFormToFieldIds(\r\n b,\r\n nInit.hydrateFrom,\r\n );\r\n for (const [fid, v] of Object.entries(valuesByFieldId)) {\r\n api.set(fid, v as Scalar | Scalar[]);\r\n }\r\n }\r\n\r\n bump();\r\n },\r\n [resolveBuilder, resolveSelection],\r\n );\r\n\r\n // auto initialize from mount props or reactively resync when sources change\n useEffect(() => {\n if (!resolvedBuilder || !effectiveInit) return;\n\n const nextSelection = resolveSelection(resolvedBuilder, effectiveInit, {\n flow,\n selection: selectionProp,\n });\n\n if (\n !ready() ||\n builderRef.current !== resolvedBuilder ||\n selectionRef.current !== nextSelection ||\n !sameNormalizedInit(initRef.current, effectiveInit)\n ) {\n initialize({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n init: effectiveInit,\n });\n }\n }, [\n builderOptions,\n builderProp,\n effectiveInit,\n flow,\n initialize,\n ready,\n resolveSelection,\n resolvedBuilder,\n selectionProp,\n serviceProps,\n ]);\n\n useEffect(() => {\n if (!serviceProps) return;\n if (!ready()) return;\n\n const currentBuilder = builderRef.current;\n if (!currentBuilder || currentBuilder !== resolvedBuilder) return;\n if (!sameServiceProps(currentBuilder.getProps(), serviceProps)) {\n currentBuilder.load(serviceProps);\n\n const currentTag = selectionRef.current?.currentTag();\n if (\n selectionRef.current &&\n currentTag &&\n !currentBuilder.isTagId(currentTag)\n ) {\n const nextTag =\n findDefaultTagId(currentBuilder.getProps().filters ?? []) ??\n currentBuilder.getProps().filters?.[0]?.id;\n if (nextTag) selectionRef.current.replace(nextTag);\n }\n\n bump();\n }\n }, [ready, resolvedBuilder, serviceProps]);\n\r\n // attach selection listener whenever selection changes\r\n useEffect(() => {\r\n const sel = selectionRef.current;\r\n if (!sel) return;\r\n return wireSelectionListener(sel);\r\n }, [wireSelectionListener, force]);\r\n\r\n const setActiveTag = useCallback(\r\n (id: string) => {\r\n const { selection } = ensureReady(\"setActiveTag\");\r\n selection.replace(id);\r\n setActiveTagId(id);\r\n },\r\n [ensureReady],\r\n );\r\n\r\n const clearAllFields = useCallback(() => {\r\n const api = formApiRef.current;\r\n if (!api) return;\r\n\r\n const b = builderRef.current;\r\n if (!b) return;\r\n\r\n const fields = b.getProps().fields ?? [];\r\n for (const f of fields) {\r\n api.set(f.id, undefined as unknown as Scalar);\r\n api.setSelections(f.id, []);\r\n }\r\n }, []);\r\n\r\n const setSnapshot = useCallback(\r\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\r\n const api = formApiRef.current;\r\n if (!api) return;\r\n\r\n const { builder, selection } = ensureReady(\"setSnapshot\");\r\n\r\n const clearFirst = opts?.clearFirst ?? true;\r\n\r\n const tag = snap.selection?.tag;\r\n if (tag) selection.replace(tag);\r\n\r\n if (clearFirst) clearAllFields();\r\n\r\n const sel = snap.inputs?.selections ?? {};\r\n for (const [fid, oids] of Object.entries(sel))\r\n api.setSelections(fid, oids ?? []);\r\n\r\n const valuesByFieldId = mapSnapshotFormToFieldIds(builder, snap);\r\n for (const [fid, v] of Object.entries(valuesByFieldId))\r\n api.set(fid, v as Scalar | Scalar[]);\r\n },\r\n [clearAllFields, ensureReady],\r\n );\r\n\r\n const reset = useCallback(\r\n (opts?: { keepTag?: boolean }) => {\r\n const keepTag = opts?.keepTag ?? false;\r\n\r\n const { builder, selection } = ensureReady(\"reset\");\r\n\r\n if (!keepTag) {\r\n const tags = builder.getProps().filters ?? [];\r\n const def = findDefaultTagId(tags) ?? tags[0]?.id;\r\n if (def) selection.replace(def);\r\n }\r\n\r\n clearAllFields();\r\n },\r\n [clearAllFields, ensureReady],\r\n );\r\n\r\n const getVisibleGroup = useCallback(\r\n () => ensureReady(\"getVisibleGroup\").selection.visibleGroup(),\r\n [ensureReady],\r\n );\r\n const getSelectionIds = useCallback(\r\n () => Array.from(ensureReady(\"getSelectionIds\").selection.all()),\r\n [ensureReady],\r\n );\r\n const clearSelection = useCallback(\r\n () => ensureReady(\"clearSelection\").selection.clear(),\r\n [ensureReady],\r\n );\r\n\r\n // initial FormProvider state (only if initialized + hydrateFrom exists)\r\n const initialValues = useMemo(() => {\r\n const b = builderRef.current;\r\n const i = initRef.current;\r\n if (!b || !i?.hydrateFrom) return {};\r\n return mapSnapshotFormToFieldIds(b, i.hydrateFrom);\r\n }, [force]);\r\n\r\n const initialSelections = useMemo(() => {\r\n const i = initRef.current;\r\n if (!i?.hydrateFrom) return {};\r\n return i.hydrateFrom.inputs?.selections ?? {};\r\n }, [force]);\r\n\r\n useImperativeHandle(\r\n ref,\r\n (): OrderFlowHandle => ({\r\n ready,\r\n initialize,\r\n\r\n getActiveTag: () => activeTagId,\r\n selectTag: (id: string) => setActiveTag(id),\r\n\r\n getVisibleGroup,\r\n getSelectionIds,\r\n clearSelection,\r\n\r\n setSnapshot,\r\n reset,\r\n refresh: () => setActiveTagId(selectionRef.current?.currentTag()),\r\n }),\r\n [\r\n activeTagId,\r\n clearSelection,\r\n getSelectionIds,\r\n getVisibleGroup,\r\n initialize,\r\n ready,\r\n reset,\r\n setActiveTag,\r\n setSnapshot,\r\n ],\r\n );\r\n\r\n return (\r\n <Provider initialRegistry={registry}>\r\n <FormProvider\r\n initial={{\r\n values: initialValues,\r\n selections: initialSelections,\r\n }}\r\n >\r\n <OrderFlowCtxBridge\r\n formApiRef={formApiRef}\r\n ctxValue={{\n builder: builderRef.current,\n selection: selectionRef.current,\n\n activeTagId,\n setActiveTag,\n\r\n init: initRef.current,\r\n\r\n fallbackPolicy,\r\n setFallbackPolicy,\r\n\r\n setSnapshot,\r\n reset,\r\n\r\n ready,\r\n ensureReady,\r\n\r\n initialize,\r\n }}\r\n >\r\n {children}\r\n </OrderFlowCtxBridge>\r\n </FormProvider>\r\n </Provider>\r\n );\r\n});\r\n","import { Field, FieldValidationRule, Scalar } from \"@/schema\";\n\nexport type FieldValidationIssue = {\n fieldId: string;\n message: string;\n rule: FieldValidationRule;\n};\n\nexport function evaluateFieldValidationRule(\n rule: FieldValidationRule,\n raw: Scalar | Scalar[] | undefined,\n): boolean {\n const valueBy = rule.valueBy ?? \"value\";\n\n let subject: unknown = raw;\n\n if (valueBy === \"length\") {\n if (typeof raw === \"string\" || Array.isArray(raw)) subject = raw.length;\n else subject = 0;\n }\n\n if (valueBy === \"eval\") {\n if (typeof rule.code !== \"string\" || !rule.code.trim()) return true;\n try {\n const fn = new Function(\"value\", \"values\", rule.code);\n subject = fn(raw, Array.isArray(raw) ? raw : [raw]);\n } catch {\n return true;\n }\n }\n\n switch (rule.op) {\n case \"eq\":\n return subject === rule.value;\n case \"neq\":\n return subject !== rule.value;\n case \"gt\":\n return Number(subject) > Number(rule.value);\n case \"gte\":\n return Number(subject) >= Number(rule.value);\n case \"lt\":\n return Number(subject) < Number(rule.value);\n case \"lte\":\n return Number(subject) <= Number(rule.value);\n case \"between\":\n return (\n Number(subject) >= Number(rule.min) &&\n Number(subject) <= Number(rule.max)\n );\n case \"in\":\n return Array.isArray(rule.values) && rule.values.includes(subject);\n case \"nin\":\n return Array.isArray(rule.values) && !rule.values.includes(subject);\n case \"truthy\":\n return !!subject;\n case \"falsy\":\n return !subject;\n case \"match\":\n return typeof subject === \"string\" &&\n typeof rule.pattern === \"string\"\n ? new RegExp(rule.pattern, rule.flags ?? \"\").test(subject)\n : false;\n default:\n return true;\n }\n}\n\nexport function validateVisibleFields(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n formValuesByFieldId: Record<string, Scalar | Scalar[]>,\n): FieldValidationIssue[] {\n const out: FieldValidationIssue[] = [];\n\n for (const fid of visibleFieldIds) {\n const field = fieldById.get(fid);\n if (!field?.validation?.length) continue;\n\n const value = formValuesByFieldId[fid];\n\n for (const rule of field.validation) {\n const ok = evaluateFieldValidationRule(rule, value);\n if (!ok) {\n out.push({\n fieldId: fid,\n message: rule.message || `${field.label} is invalid`,\n rule,\n });\n break;\n }\n }\n }\n\n return out;\n}\n","// src/react/inputs/registry/entries/text.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"text\",\n stripPrefix: true,\n stripSuffix: true,\n slotChar: \"_\",\n },\n\n ui: {\n // shared box tuning (text supports these)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n // behavior\n trim: {\n type: \"boolean\",\n label: \"Trim\",\n description: \"If enabled, the value is trimmed before validation.\",\n },\n\n minLength: {\n type: \"number\",\n label: \"Min length\",\n minimum: 0,\n description: \"Minimum allowed string length.\",\n },\n\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum allowed string length.\",\n },\n\n // affixes\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description: \"Fixed prefix rendered as part of the input value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description: \"Fixed suffix rendered as part of the input value.\",\n },\n\n stripPrefix: {\n type: \"boolean\",\n label: \"Strip prefix\",\n description:\n \"If enabled, remove the prefix from the emitted model value.\",\n },\n\n stripSuffix: {\n type: \"boolean\",\n label: \"Strip suffix\",\n description:\n \"If enabled, remove the suffix from the emitted model value.\",\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // shared masking knobs\n ...sharedUi.textMask,\n },\n}; \n","// src/react/inputs/registry/shared.ts\nimport type { Ui } from \"@/schema\";\n\nexport const sharedUi = {\n // ─────────────────────────────────────────────\n // Layout: join controls (text + select)\n // ─────────────────────────────────────────────\n joinControls: {\n type: \"boolean\",\n label: \"Join controls\",\n description:\n \"If enabled and there are controls, the input and controls share one visual box (borders, radius, focus states).\",\n } satisfies Ui,\n\n extendBoxToControls: {\n type: \"boolean\",\n label: \"Extend box to controls\",\n description:\n \"When joinControls is enabled: extend the styling over the controls (true) or keep them visually separate (false).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Masking (text family)\n // ─────────────────────────────────────────────\n textMask: {\n mask: {\n type: \"string\",\n label: \"Mask pattern\",\n description:\n 'Mask pattern for formatted input (e.g. \"99/99/9999\", \"(999) 999-9999\").',\n } satisfies Ui,\n\n slotChar: {\n type: \"string\",\n label: \"Slot character\",\n description: 'Mask placeholder character (default is \"_\").',\n minLength: 1,\n maxLength: 1,\n } satisfies Ui,\n\n autoClear: {\n type: \"boolean\",\n label: \"Auto clear\",\n description:\n 'If enabled, empty masked values emit \"\" instead of placeholder slots.',\n } satisfies Ui,\n\n unmask: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls whether the emitted value is raw (unmasked) or masked.\",\n items: [\n { type: \"string\", title: \"Masked\", value: \"masked\" },\n { type: \"string\", title: \"Raw\", value: \"raw\" },\n ],\n } satisfies Ui,\n\n maskInsertMode: {\n type: \"anyOf\",\n label: \"Mask insert mode\",\n description:\n \"Reserved for future caret-mode logic (kept for compatibility).\",\n items: [\n { type: \"string\", title: \"Stream\", value: \"stream\" },\n { type: \"string\", title: \"Caret\", value: \"caret\" },\n ],\n } satisfies Ui,\n \n maskDefinitions: {\n type: \"object\",\n label: \"Mask definitions\",\n description:\n \"Per-symbol definitions for mask slots. Add a symbol key, then choose the definition shape.\",\n editable: true,\n fields: {},\n\n shape: {\n \"Regex pattern\": {\n type: \"string\",\n label: \"Pattern\",\n description:\n \"A regex pattern describing what this slot accepts.\",\n pattern: \".*\",\n },\n\n \"Boolean toggle\": {\n type: \"boolean\",\n label: \"Enabled\",\n description:\n \"Simple on/off definition (rare, but supported).\",\n },\n\n \"Choice list\": {\n type: \"anyOf\",\n label: \"Allowed values\",\n description: \"Explicit allowed values for this slot.\",\n items: [{ type: \"string\", title: \"Example\", value: \"X\" }],\n },\n },\n } satisfies Ui,\n },\n\n // ─────────────────────────────────────────────\n // Options mapping + search UX (select / multi-select family)\n // ─────────────────────────────────────────────\n optionMapping: {\n options: {\n type: \"array\",\n label: \"Options\",\n description: \"List of options to render.\",\n item: {\n type: \"object\",\n label: \"Option\",\n description: \"Option entry (object).\",\n fields: {},\n } as Ui,\n } satisfies Ui,\n\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise the first letter when the resolved label is a string.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the label from option objects.\",\n } satisfies Ui,\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value from option objects.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description:\n \"Key to read the description line from option objects.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n 'Key to read the icon from option objects (often \"icon\").',\n } satisfies Ui,\n\n optionKey: {\n type: \"string\",\n label: \"Option key\",\n description: \"Stable key used as the identity for each option.\",\n } satisfies Ui,\n },\n\n searchUx: {\n searchable: {\n type: \"boolean\",\n label: \"Searchable\",\n description: \"Enable searching inside the dropdown.\",\n } satisfies Ui,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description: \"Placeholder text for the search input.\",\n } satisfies Ui,\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when the search returns no results.\",\n } satisfies Ui,\n },\n\n pickerCommon: {\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n },\n\n // -----------------------------\n // Box sizing / density (text + textarea, etc.)\n // -----------------------------\n size: {\n type: \"anyOf\",\n label: \"Size\",\n description: \"Size preset for the input.\",\n items: [\n { type: \"string\", title: \"Small\", value: \"sm\" },\n { type: \"string\", title: \"Medium\", value: \"md\" },\n { type: \"string\", title: \"Large\", value: \"lg\" },\n ],\n } satisfies Ui,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Controls vertical compactness / line-height preset.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Normal\", value: \"normal\" },\n { type: \"string\", title: \"Relaxed\", value: \"relaxed\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n } satisfies Ui,\n\n // -----------------------------\n // Padding (text + textarea, etc.)\n // -----------------------------\n padding: {\n px: {\n type: \"number\",\n label: \"Padding X\",\n description: \"Horizontal padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n py: {\n type: \"number\",\n label: \"Padding Y\",\n description: \"Vertical padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n ps: {\n type: \"number\",\n label: \"Padding start\",\n description:\n \"Start-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pe: {\n type: \"number\",\n label: \"Padding end\",\n description: \"End-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pb: {\n type: \"number\",\n label: \"Padding bottom\",\n description: \"Bottom padding override in pixels (overrides py).\",\n minimum: 0,\n } satisfies Ui,\n },\n} as const;\n","// src/react/inputs/registry/entries/textarea.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textareaDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: {\n variant: \"textarea\",\n },\n ui: {\n // box tuning shared with text\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n \n autoResize: {\n type: \"boolean\",\n label: \"Auto resize\",\n description: \"Automatically grows/shrinks height based on content.\",\n },\n\n rows: {\n type: \"number\",\n label: \"Min rows\",\n description:\n \"Minimum number of visible rows (used when auto-resize is enabled).\",\n minimum: 1,\n },\n\n maxRows: {\n type: \"number\",\n label: \"Max rows\",\n description:\n \"Maximum number of visible rows (leave unset for unlimited).\",\n minimum: 1,\n },\n\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n extendBoxToToolbox: {\n type: \"boolean\",\n label: \"Extend box to toolbox\",\n description:\n \"Extend the textarea box styling to the upper toolbox area when present.\",\n },\n },\n};\n","// src/react/inputs/registry/entries/phone.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const phoneDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"phone\", // MUST\n\n // (optional) you can omit these since the component already defaults them:\n // showCountry: true,\n // showFlag: true,\n // showSelectedLabel: false,\n // showSelectedDial: false,\n // showDialInList: true,\n // valueMode: \"e164\",\n // keepCharPositions: false,\n },\n\n ui: {\n // shared text-like tuning supported by phone (since it types against Text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // ─────────────────────────────────────────────\n // Phone-specific configuration\n // ─────────────────────────────────────────────\n\n defaultCountry: {\n type: \"string\",\n label: \"Default country\",\n description:\n 'ISO 3166-1 alpha-2 code for the initial country (e.g. \"NG\", \"US\", \"GB\").',\n },\n\n // Countries list is optional; if omitted, runtime uses global list.\n // editable=true lets admins add custom countries if you want.\n countries: {\n type: \"array\",\n label: \"Countries\",\n description:\n \"Optional custom country list. If omitted, the global country list is used.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Country\",\n description:\n \"A single country entry: code, label, dial code, and national mask.\",\n editable: false,\n fields: {\n code: {\n type: \"string\",\n label: \"ISO code\",\n description: 'ISO alpha-2 (e.g. \"NG\").',\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: 'Display label (e.g. \"Nigeria\").',\n },\n dial: {\n type: \"string\",\n label: \"Dial code\",\n description: 'Dial code without \"+\" (e.g. \"234\").',\n },\n mask: {\n type: \"string\",\n label: \"National mask\",\n description:\n 'Mask for the NATIONAL portion only (no dial). Example: \"999 999 9999\".',\n },\n // flag is ReactNode in the variant; not builder-editable, so excluded.\n },\n order: [\"code\", \"label\", \"dial\", \"mask\"],\n },\n }, \n\n valueMode: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls how the form value is emitted (masked, e164, or national digits only).\",\n items: [\n {\n type: \"string\",\n title: \"Masked (+234 801 234 5678)\",\n value: \"masked\",\n },\n {\n type: \"string\",\n title: \"E164 (dial+digits, no +)\",\n value: \"e164\",\n },\n {\n type: \"string\",\n title: \"National (digits only)\",\n value: \"national\",\n },\n ],\n },\n\n keepCharPositions: {\n type: \"boolean\",\n label: \"Keep character positions\",\n description:\n \"If enabled, the national mask keeps placeholder characters for not-yet-filled positions.\",\n },\n\n // ─────────────────────────────────────────────\n // Country selector UX (allowed; not InputField placeholder)\n // ─────────────────────────────────────────────\n\n showCountry: {\n type: \"boolean\",\n label: \"Show country selector\",\n description: \"Show or hide the country selector control.\",\n },\n\n countryPlaceholder: {\n type: \"string\",\n label: \"Country placeholder\",\n description:\n \"Placeholder shown on the country selector when nothing is selected.\",\n },\n\n showFlag: {\n type: \"boolean\",\n label: \"Show flag\",\n description: \"Show or hide the country flag in the selector.\",\n },\n\n showSelectedLabel: {\n type: \"boolean\",\n label: \"Show selected label\",\n description: \"Show the selected country label in the trigger.\",\n },\n\n showSelectedDial: {\n type: \"boolean\",\n label: \"Show selected dial code\",\n description: \"Show the selected country dial code in the trigger.\",\n },\n\n showDialInList: {\n type: \"boolean\",\n label: \"Show dial code in list\",\n description:\n \"Show dial codes alongside country names in the dropdown list.\",\n },\n\n // onCountryChange is a callback; not builder-editable, so excluded.\n // country*ClassName props are forbidden; excluded.\n },\n};\n","// src/react/inputs/registry/entries/toggle-group.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleGroupDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle-group\", // MUST\n multiple: false,\n variantStyle: \"default\",\n layout: \"horizontal\",\n gridCols: 2,\n fillWidth: false,\n autoCap: false,\n },\n\n ui: {\n // (toggle-group supports these via VariantBaseProps)\n size: sharedUi.size,\n density: sharedUi.density,\n\n /**\n * Options\n * - supports primitive shorthand + objects + option* mapping keys\n */\n options: {\n type: \"array\",\n label: \"Options\",\n description:\n \"Toggle options. Can be primitive values (string/number/boolean) or objects. Uses option* keys when provided.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Option\",\n description:\n \"Option object (used when you want label/value/icon/disabled/tooltip/meta).\",\n editable: true,\n fields: {\n // Keep this minimal; the variant can also read via option* keys.\n value: {\n type: \"string\",\n label: \"Value\",\n description: \"Unique option value (string).\",\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Display label for the option.\",\n },\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable this option.\",\n },\n tooltip: {\n type: \"string\",\n label: \"Tooltip\",\n description: \"Optional tooltip text for this option.\",\n },\n },\n } as any,\n },\n\n // option mapping keys (shared)\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise labels when the resolved label is a string.\",\n },\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description:\n \"Property name to read the option value from when using custom option objects.\",\n },\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description:\n \"Property name to read the option label from when using custom option objects.\",\n },\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n \"Property name to read an icon from (runtime-only; builder typically won’t author icons).\",\n },\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description:\n \"Property name to read the disabled flag from when using custom option objects.\",\n },\n\n optionTooltip: {\n type: \"string\",\n label: \"Option tooltip key\",\n description:\n \"Property name to read tooltip content from when using custom option objects.\",\n },\n\n optionMeta: {\n type: \"string\",\n label: \"Option meta key\",\n description:\n \"Property name to read meta from (opaque payload for host logic).\",\n },\n\n // selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple options can be selected (emits a string array).\",\n },\n\n // visuals/layout\n variant: {\n type: \"anyOf\",\n label: \"Variant style\",\n description:\n 'Visual style for the toggle buttons (\"default\" or \"outline\").',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Outline\", value: \"outline\" },\n ],\n },\n\n layout: {\n type: \"anyOf\",\n label: \"Layout\",\n description: \"How the toggle items are arranged.\",\n items: [\n { type: \"string\", title: \"Horizontal\", value: \"horizontal\" },\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\n { type: \"string\", title: \"Grid\", value: \"grid\" },\n ],\n },\n\n gridCols: {\n type: \"number\",\n label: \"Grid columns\",\n description: \"Number of columns when layout is set to grid.\",\n minimum: 1,\n },\n\n fillWidth: {\n type: \"boolean\",\n label: \"Fill width\",\n description:\n \"If enabled, the group stretches to full width and items expand to fill available space.\",\n },\n\n gap: {\n type: \"number\",\n label: \"Item gap\",\n description:\n \"Spacing between items in pixels (applies in grid/horizontal/vertical layouts).\",\n minimum: 0,\n },\n },\n};\n","// src/react/inputs/registry/entries/number.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const numberDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"number\", // MUST\n\n // sensible defaults (optional — you can remove if you prefer)\n mode: \"decimal\",\n useGrouping: true,\n format: true,\n allowEmpty: true,\n step: 1,\n\n // for ShadcnNumberVariant\n showButtons: false,\n buttonLayout: \"stacked\",\n },\n\n ui: {\n // shared (supported via text base)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // numeric mode\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Number formatting mode (decimal or currency).\",\n items: [\n { type: \"string\", title: \"Decimal\", value: \"decimal\" },\n { type: \"string\", title: \"Currency\", value: \"currency\" },\n ],\n },\n\n currency: {\n type: \"string\",\n label: \"Currency code\",\n description:\n 'ISO currency code used when mode is \"currency\" (e.g. \"USD\", \"NGN\").',\n },\n\n currencyDisplay: {\n type: \"anyOf\",\n label: \"Currency display\",\n description: \"How currency is displayed when mode is currency.\",\n items: [\n { type: \"string\", title: \"Symbol\", value: \"symbol\" },\n {\n type: \"string\",\n title: \"Narrow symbol\",\n value: \"narrowSymbol\",\n },\n { type: \"string\", title: \"Code\", value: \"code\" },\n { type: \"string\", title: \"Name\", value: \"name\" },\n ],\n },\n\n // locale + grouping\n locale: {\n type: \"string\",\n label: \"Locale\",\n description:\n 'Locale used for formatting (e.g. \"en-US\", \"en-GB\"). If unset, runtime uses browser locale.',\n },\n\n useGrouping: {\n type: \"boolean\",\n label: \"Use grouping\",\n description: \"If enabled, format with thousands separators.\",\n },\n\n // fraction digits\n minFractionDigits: {\n type: \"number\",\n label: \"Min fraction digits\",\n description: \"Minimum number of fractional digits to show.\",\n minimum: 0,\n },\n\n maxFractionDigits: {\n type: \"number\",\n label: \"Max fraction digits\",\n description: \"Maximum number of fractional digits to show.\",\n minimum: 0,\n },\n\n // limits + stepping\n min: {\n type: \"number\",\n label: \"Minimum\",\n description: \"Minimum allowed numeric value.\",\n },\n\n max: {\n type: \"number\",\n label: \"Maximum\",\n description: \"Maximum allowed numeric value.\",\n },\n\n step: {\n type: \"number\",\n label: \"Step\",\n description: \"Step increment used for arrow keys and +/- buttons.\",\n },\n\n // behavior\n allowEmpty: {\n type: \"boolean\",\n label: \"Allow empty\",\n description:\n \"If enabled, the field can be cleared to an empty state (null).\",\n },\n\n format: {\n type: \"boolean\",\n label: \"Format\",\n description:\n \"If enabled, uses Intl formatting (grouping/currency) when blurred. If disabled, shows raw text.\",\n },\n\n // affixes (allowed — not InputField props)\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description:\n \"Fixed prefix rendered as part of the displayed value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description:\n \"Fixed suffix rendered as part of the displayed value.\",\n },\n\n // ShadcnNumberVariant extras (buttons)\n showButtons: {\n type: \"boolean\",\n label: \"Show +/- buttons\",\n description:\n \"Show increment/decrement buttons around the number field.\",\n },\n\n buttonLayout: {\n type: \"anyOf\",\n label: \"Button layout\",\n description:\n 'How +/- buttons are arranged when \"Show +/- buttons\" is enabled.',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Stacked\", value: \"stacked\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/password.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const passwordDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"password\", // MUST\n\n // sensible defaults (optional)\n revealToggle: true,\n meterStyle: \"simple\",\n },\n\n ui: {\n // shared text-like tuning supported by password (it types against text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // password-specific\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum number of characters permitted.\",\n },\n\n autoComplete: {\n type: \"string\",\n label: \"Autocomplete\",\n description:\n 'Browser autocomplete hint (e.g. \"current-password\", \"new-password\").',\n },\n\n revealToggle: {\n type: \"boolean\",\n label: \"Reveal toggle\",\n description:\n \"Show an eye button to toggle between obscured/plain text.\",\n },\n\n defaultRevealed: {\n type: \"boolean\",\n label: \"Default revealed\",\n description: \"Start in the revealed (plain text) state.\",\n },\n\n meterStyle: {\n type: \"anyOf\",\n label: \"Meter style\",\n description:\n 'Built-in meter style: \"simple\" (bar + label) or \"rules\" (bar + checklist).',\n items: [\n { type: \"string\", title: \"Simple\", value: \"simple\" },\n { type: \"string\", title: \"Rules\", value: \"rules\" },\n ],\n },\n\n /**\n * Strength meter config\n * - Runtime accepts: boolean | StrengthOptions\n * - We expose it as an object; if present (even empty), it enables the meter\n * and merges with defaults.\n *\n * NOTE: we intentionally do NOT expose `calc` (function).\n */\n strengthMeter: {\n type: \"object\",\n label: \"Strength meter\",\n description:\n \"Configure the built-in strength meter. If set (even partially), the meter is enabled and defaults are merged.\",\n editable: false,\n fields: {\n labels: {\n type: \"array\",\n label: \"Labels\",\n description: \"Labels for each score bucket (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"string\",\n label: \"Label\",\n description: \"Label for a score bucket.\",\n },\n },\n\n thresholds: {\n type: \"array\",\n label: \"Thresholds\",\n description:\n \"Thresholds for score steps using a 0–100 bar (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"number\",\n label: \"Threshold\",\n description: \"Threshold value (0–100).\",\n minimum: 0,\n maximum: 100,\n },\n },\n\n minScore: {\n type: \"number\",\n label: \"Minimum score\",\n description:\n \"Minimum score required to consider the password acceptable (visual only unless enforced elsewhere).\",\n minimum: 0,\n maximum: 4,\n },\n\n showLabel: {\n type: \"boolean\",\n label: \"Show label\",\n description:\n \"Show the textual label next to/under the bar.\",\n },\n\n display: {\n type: \"anyOf\",\n label: \"Display\",\n description:\n 'Where to render the meter: \"inline\" (compact) or \"block\" (stacked).',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Block\", value: \"block\" },\n ],\n },\n },\n order: [\"display\", \"showLabel\", \"minScore\", \"labels\", \"thresholds\"],\n },\n\n ruleUses: {\n type: \"array\",\n label: \"Rule uses\",\n description:\n 'Selection of rule aliases to apply. Prefix with \"!\" to mark a rule as important.',\n editable: true,\n item: {\n type: \"string\",\n label: \"Rule\",\n description: 'Rule alias (e.g. \"length\" or \"!length\").',\n },\n },\n },\n};\n","// src/react/inputs/registry/entries/slider.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const sliderDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"slider\", // MUST\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: true,\r\n valuePlacement: \"end\",\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n controlVariant: \"none\",\r\n },\r\n\r\n ui: {\r\n // slider supports size + density but its density enum is compact/comfortable/loose\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical padding preset for the slider container.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n min: {\r\n type: \"number\",\r\n label: \"Minimum\",\r\n description: \"Minimum value for the slider.\",\r\n },\r\n\r\n max: {\r\n type: \"number\",\r\n label: \"Maximum\",\r\n description: \"Maximum value for the slider.\",\r\n },\r\n\r\n step: {\r\n type: \"number\",\r\n label: \"Step\",\r\n description: \"Step between values.\",\r\n },\r\n\r\n showValue: {\r\n type: \"boolean\",\r\n label: \"Show value\",\r\n description: \"Show the current value as text next to the slider.\",\r\n },\r\n\r\n valuePlacement: {\r\n type: \"anyOf\",\r\n label: \"Value placement\",\r\n description: 'Where the value label appears (\"start\" or \"end\").',\r\n items: [\r\n { type: \"string\", title: \"Start\", value: \"start\" },\r\n { type: \"string\", title: \"End\", value: \"end\" },\r\n ],\r\n },\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n controlVariant: {\r\n type: \"anyOf\",\r\n label: \"Built-in +/- controls\",\r\n description:\r\n 'Built-in step buttons around the slider (\"none\", \"boxed\", or \"edge\").',\r\n items: [\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n { type: \"string\", title: \"Boxed\", value: \"boxed\" },\r\n { type: \"string\", title: \"Edge\", value: \"edge\" },\r\n ],\r\n },\r\n\r\n controlStep: {\r\n type: \"number\",\r\n label: \"Control step\",\r\n description:\r\n \"Step used when clicking the +/- controls. If unset, falls back to Step.\",\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/toggle.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle\", // MUST\n // optional defaults (the variant already defaults these)\n // size: \"md\",\n // density: \"default\",\n // controlPlacement: \"left\",\n },\n\n ui: {\n // toggle supports the same size union as text\n size: sharedUi.size,\n\n // but density is different from your text density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Row density (vertical padding & gap).\",\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n ],\n },\n\n controlPlacement: {\n type: \"anyOf\",\n label: \"Control placement\",\n description:\n \"Place the switch on the left or right of the state text.\",\n items: [\n { type: \"string\", title: \"Left\", value: \"left\" },\n { type: \"string\", title: \"Right\", value: \"right\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/treeselect.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const treeSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"treeselect\", // MUST\n\n // sensible defaults (optional; component already has these defaults)\n multiple: true,\n searchable: true,\n clearable: true,\n expandAll: false,\n leafOnly: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options + mapping (no className-related stuff)\n ...sharedUi.optionMapping,\n\n // treeselect-specific: selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple nodes can be selected (emits a string array). If disabled, emits a single string.\",\n },\n\n // shared: search UX\n ...sharedUi.searchUx,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description:\n \"Placeholder text for the search input within the tree dropdown.\",\n },\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when search returns no matching nodes.\",\n },\n\n // tree-only UX text (not an InputField placeholder)\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description:\n \"Text shown when there are no options/nodes available.\",\n },\n\n // shared-ish picker toggle (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n },\n\n // tree expansion behavior\n expandAll: {\n type: \"boolean\",\n label: \"Expand all\",\n description:\n \"If enabled, expands all nodes by default when the dropdown opens.\",\n },\n\n defaultExpandedValues: {\n type: \"array\",\n label: \"Default expanded values\",\n description:\n \"List of node values to expand initially (useful when not expanding everything).\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Node value\",\n description: \"The node value to expand on load.\",\n },\n },\n\n leafOnly: {\n type: \"boolean\",\n label: \"Leaf only\",\n description: \"If enabled, only leaf nodes can be selected.\",\n },\n\n // shared layout knobs (default-mode only; we keep them since they're booleans)\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/multi-select.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const multiSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"multi-select\", // MUST\n\n // sensible defaults (optional)\n searchable: true,\n clearable: true,\n autoCap: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options mapping\n ...sharedUi.optionMapping,\n\n // shared: search ux\n ...sharedUi.searchUx,\n\n // common picker knobs (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing all selected values.\",\n },\n\n // multi-select behavior knobs (safe)\n closeOnSelect: {\n type: \"boolean\",\n label: \"Close on select\",\n description:\n \"If enabled, the dropdown closes after selecting an option.\",\n },\n\n maxSelected: {\n type: \"number\",\n label: \"Max selected\",\n description:\n \"Maximum number of selections allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/select.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const selectDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"select\", // MUST\r\n\r\n // sensible defaults (optional)\r\n searchable: true,\r\n clearable: true,\r\n autoCap: false,\r\n\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // common tuning\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n // options + mapping\r\n ...sharedUi.optionMapping,\r\n\r\n // search UX\r\n ...sharedUi.searchUx,\r\n\r\n // picker basics (allowed)\r\n clearable: {\r\n type: \"boolean\",\r\n label: \"Clearable\",\r\n description: \"Allow clearing the current selection.\",\r\n },\r\n\r\n // layout knobs (allowed)\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/radio.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const radioDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"radio\", // MUST\r\n autoCap: false,\r\n },\r\n\r\n ui: {\r\n // common tuning (radio supports these in your palette variants)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n /**\r\n * Options\r\n * Radio supports primitive shorthands + objects, using option* mapping keys.\r\n */\r\n ...sharedUi.optionMapping,\r\n\r\n // small radio-only behavior knobs (safe)\r\n multiple: {\r\n type: \"boolean\",\r\n label: \"Multiple\",\r\n description:\r\n \"If enabled, behaves like a multi-pick radio group (emits a string array). Leave off for classic single-choice radio.\",\r\n },\r\n\r\n // Note: no placeholder (InputField prop), no className props, no render/callback props.\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/checkbox.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const checkboxDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"checkbox\", // MUST\r\n\r\n single: false,\r\n tristate: false,\r\n layout: \"list\",\r\n columns: 2,\r\n itemGapPx: 8,\r\n size: \"md\",\r\n density: \"comfortable\",\r\n autoCap: false,\r\n },\r\n adapter: {\r\n\r\n },\r\n\r\n ui: {\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical density of each option row.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n // group vs single behavior\r\n single: {\r\n type: \"boolean\",\r\n label: \"Single\",\r\n description:\r\n \"If enabled, behaves like a single checkbox (boolean). Otherwise renders a group (array).\",\r\n },\r\n\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state\",\r\n description:\r\n 'Enable tri-state behaviour (supports an internal \"none\" state).',\r\n },\r\n\r\n // layout\r\n layout: {\r\n type: \"anyOf\",\r\n label: \"Layout\",\r\n description: \"Arrange options as a vertical list or grid.\",\r\n items: [\r\n { type: \"string\", title: \"List\", value: \"list\" },\r\n { type: \"string\", title: \"Grid\", value: \"grid\" },\r\n ],\r\n },\r\n\r\n columns: {\r\n type: \"number\",\r\n label: \"Columns\",\r\n description: \"Number of columns when layout is grid.\",\r\n minimum: 1,\r\n },\r\n\r\n itemGapPx: {\r\n type: \"number\",\r\n label: \"Item gap (px)\",\r\n description: \"Gap between option rows/items in pixels.\",\r\n minimum: 0,\r\n },\r\n\r\n autoCap: {\r\n type: \"boolean\",\r\n label: \"Auto capitalise\",\r\n description:\r\n \"Capitalise the first letter of labels (only when label resolves to a string).\",\r\n },\r\n\r\n // options (primitive arrays or object arrays)\r\n options: {\r\n type: \"array\",\r\n label: \"Options\",\r\n description:\r\n \"Checkbox options. Can be primitives (string/number/boolean) or objects (label/value/description/disabled/tristate).\",\r\n editable: true,\r\n item: {\r\n type: \"object\",\r\n label: \"Option\",\r\n description: \"An option item for group mode.\",\r\n editable: true,\r\n fields: {\r\n value: {\r\n type: \"string\",\r\n label: \"Value\",\r\n description: \"Unique option value (string).\",\r\n },\r\n label: {\r\n type: \"string\",\r\n label: \"Label\",\r\n description: \"Display label for the option.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n label: \"Description\",\r\n description: \"Optional helper text under the label.\",\r\n },\r\n disabled: {\r\n type: \"boolean\",\r\n label: \"Disabled\",\r\n description: \"Disable this option.\",\r\n },\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state override\",\r\n description:\r\n \"Override tri-state behaviour for this option (if unset, uses variant tristate).\",\r\n },\r\n },\r\n order: [\r\n \"value\",\r\n \"label\",\r\n \"description\",\r\n \"disabled\",\r\n \"tristate\",\r\n ],\r\n } as any,\r\n },\r\n\r\n // mapping keys (for custom item shapes)\r\n optionValue: {\r\n type: \"string\",\r\n label: \"Option value key\",\r\n description:\r\n \"Property name to read the option value from when using custom option objects.\",\r\n },\r\n\r\n optionLabel: {\r\n type: \"string\",\r\n label: \"Option label key\",\r\n description:\r\n \"Property name to read the option label from when using custom option objects.\",\r\n },\r\n\r\n // intentionally excluded:\r\n // - items (alias to options; keeping one is enough for builder)\r\n // - mappers (functions)\r\n // - renderOption (function)\r\n // - singleLabel/singleDescription (ReactNode)\r\n // - all *ClassName props (not allowed)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/chips.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const chipsDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"chips\", // MUST\n\n // sensible defaults (these match the variant defaults)\n addOnEnter: true,\n addOnTab: true,\n addOnBlur: true,\n allowDuplicates: false,\n backspaceRemovesLast: true,\n clearable: false,\n textareaMode: false,\n placement: \"inline\",\n },\n\n ui: {\n // chips \"also supports most ShadcnTextVariantProps\" (size/density/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // NOTE: placeholder is an InputField prop in your system — exclude it here.\n\n separators: {\n type: \"array\",\n label: \"Separators\",\n description:\n 'Separators used to split raw input into chips (strings only in builder UI). Runtime default: [\",\", \";\"].',\n editable: true,\n item: {\n type: \"string\",\n label: \"Separator\",\n description: 'A string separator (e.g. \",\" or \";\").',\n },\n },\n\n addOnEnter: {\n type: \"boolean\",\n label: \"Add on Enter\",\n description: \"Commit chips when the user presses Enter.\",\n },\n\n addOnTab: {\n type: \"boolean\",\n label: \"Add on Tab\",\n description: \"Commit chips when the user presses Tab.\",\n },\n\n addOnBlur: {\n type: \"boolean\",\n label: \"Add on blur\",\n description: \"Commit chips when the input loses focus.\",\n },\n\n allowDuplicates: {\n type: \"boolean\",\n label: \"Allow duplicates\",\n description: \"If disabled, duplicate chips are ignored.\",\n },\n\n maxChips: {\n type: \"number\",\n label: \"Max chips\",\n description:\n \"Maximum number of chips allowed. Leave unset for unlimited.\",\n minimum: 1,\n },\n\n backspaceRemovesLast: {\n type: \"boolean\",\n label: \"Backspace removes last\",\n description:\n \"If enabled, Backspace on an empty input removes the last chip.\",\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear-all button.\",\n },\n\n maxVisibleChips: {\n type: \"number\",\n label: \"Max visible chips\",\n description:\n 'Maximum number of chips to render before summarizing the rest as \"+N more\".',\n minimum: 1,\n },\n\n maxChipChars: {\n type: \"number\",\n label: \"Max chip chars\",\n description:\n \"Soft cap for chip display label length (UI-only; value is not truncated).\",\n minimum: 1,\n },\n\n maxChipWidth: {\n type: \"string\",\n label: \"Max chip width\",\n description:\n 'Soft cap for chip label width (CSS value, e.g. \"160px\" or \"12rem\").',\n },\n\n textareaMode: {\n type: \"boolean\",\n label: \"Textarea mode\",\n description:\n \"Use a textarea entry control instead of a single-line input.\",\n },\n\n placement: {\n type: \"anyOf\",\n label: \"Placement\",\n description:\n \"Where chips are rendered relative to the entry control.\",\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Below\", value: \"below\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/color.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const colorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"color\", // MUST\r\n\r\n // sensible defaults (matches variant defaults)\r\n showPreview: true,\r\n showPickerToggle: true,\r\n previewSize: 18,\r\n\r\n // forwarded from text UI\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // color inherits most text UI props (but we still only expose the shared-safe ones)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n ...sharedUi.padding,\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n showPreview: {\r\n type: \"boolean\",\r\n label: \"Show preview\",\r\n description: \"Show the color swatch preview control.\",\r\n },\r\n\r\n showPickerToggle: {\r\n type: \"boolean\",\r\n label: \"Show picker toggle\",\r\n description: \"Show the picker toggle control/icon.\",\r\n },\r\n\r\n previewSize: {\r\n type: \"number\",\r\n label: \"Preview size\",\r\n description: \"Size of the color swatch in pixels.\",\r\n minimum: 8,\r\n maximum: 64,\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/date.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const dateDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"date\", // MUST\n\n // sensible defaults (matches the variant defaults shown in code)\n mode: \"single\",\n kind: \"date\",\n clearable: true,\n\n // text-ui bits that date supports\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared text-like tuning (date reuses ShadcnTextVariantProps minus value/onValue/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Single date input or a date range picker.\",\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Range\", value: \"range\" },\n ],\n },\n\n kind: {\n type: \"anyOf\",\n label: \"Kind\",\n description:\n \"Logical temporal kind. Controls default mask + formatting/parsing.\",\n items: [\n { type: \"string\", title: \"Date\", value: \"date\" },\n { type: \"string\", title: \"Date & time\", value: \"datetime\" },\n { type: \"string\", title: \"Time\", value: \"time\" },\n { type: \"string\", title: \"Hour\", value: \"hour\" },\n { type: \"string\", title: \"Month/Year\", value: \"monthYear\" },\n { type: \"string\", title: \"Year\", value: \"year\" },\n ],\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear control to remove the selected value.\",\n },\n\n showCalendar: {\n type: \"boolean\",\n label: \"Show calendar\",\n description:\n \"Render the calendar popover. Defaults to true for date/datetime, false for time-only kinds.\",\n },\n\n // Formatting / display\n formatSingle: {\n type: \"string\",\n label: \"Single format\",\n description:\n 'Display pattern for single values (e.g. \"yyyy-MM-dd\", \"yyyy-MM-dd HH:mm\", \"HH:mm\").',\n },\n\n // NOTE: DateVariantProps allows formatRange as function too; builder exposes string only.\n formatRange: {\n type: \"string\",\n label: \"Range format\",\n description:\n \"Pattern applied to both ends of the range (string form only).\",\n },\n\n rangeSeparator: {\n type: \"string\",\n label: \"Range separator\",\n description:\n 'Separator between from/to in range display (default \" – \").',\n },\n\n stayOpenOnSelect: {\n type: \"boolean\",\n label: \"Stay open on select\",\n description:\n \"Keep the calendar open after selection (range stays open until both ends are picked).\",\n },\n\n inputMask: {\n type: \"string\",\n label: \"Input mask\",\n description:\n \"Optional explicit mask for typed input. Uses mask tokens: 9=digit, a=letter, *=alphanumeric.\",\n },\n\n // Intentionally excluded (non-builder-safe / non-serializable):\n // - placeholder (ReactNode)\n // - minDate/maxDate (Date objects)\n // - disabledDays (complex Calendar disabled type)\n // - open/onOpenChange (controlled popover)\n },\n};\n","// src/react/inputs/registry/entries/keyvalue.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const keyValueDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"keyvalue\", // MUST\n\n min: 0,\n max: Infinity,\n\n // legacy (optional)\n // minVisible: undefined,\n // maxVisible: undefined,\n\n showValue: false,\n\n // text labels (strings are fine; variant accepts ReactNode)\n dialogTitle: \"Edit Item\",\n keyLabel: \"Key\",\n valueLabel: \"Value\",\n submitLabel: \"Save Changes\",\n emptyLabel: \"No items added\",\n },\n\n ui: {\n // keyvalue has its own density union (compact/comfortable/loose)\n size: sharedUi.size,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Vertical spacing preset for chips and controls.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n min: {\n type: \"number\",\n label: \"Min items\",\n description:\n \"Minimum number of entries allowed (prevents deletion below this).\",\n minimum: 0,\n },\n\n max: {\n type: \"number\",\n label: \"Max items\",\n description:\n \"Maximum number of entries allowed (prevents adding above this).\",\n minimum: 0,\n },\n\n // legacy compatibility knobs\n minVisible: {\n type: \"number\",\n label: \"Min visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n maxVisible: {\n type: \"number\",\n label: \"Max visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n showValue: {\n type: \"boolean\",\n label: \"Show value inline\",\n description:\n 'If enabled, inline chips show \"key : value\". In the dropdown, values are still available via info.',\n },\n\n dialogTitle: {\n type: \"string\",\n label: \"Dialog title\",\n description: \"Title shown at the top of the edit dialog.\",\n },\n\n keyLabel: {\n type: \"string\",\n label: \"Key label\",\n description: \"Label for the key input in the dialog.\",\n },\n\n valueLabel: {\n type: \"string\",\n label: \"Value label\",\n description: \"Label for the value input in the dialog.\",\n },\n\n submitLabel: {\n type: \"string\",\n label: \"Submit label\",\n description: \"Text for the dialog submit button.\",\n },\n\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description: \"Text shown when there are no entries.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop; injected by registry helper)\n // - moreLabel (function)\n // - className/chipsClassName/chipClassName\n // - renderChip (render function)\n },\n};\n","// src/react/inputs/registry/entries/editor.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const editorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"editor\", // MUST\r\n\r\n height: \"400px\",\r\n previewStyle: \"vertical\",\r\n editType: \"wysiwyg\",\r\n useCommandShortcut: true,\r\n\r\n // stored value format\r\n format: \"html\",\r\n\r\n // toolbar mode (we only support the safe enum values here)\r\n toolbar: \"default\",\r\n\r\n pastePlainText: false,\r\n },\r\n\r\n ui: {\r\n // editor supports size + density from VariantBaseProps\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n height: {\r\n type: \"string\",\r\n label: \"Height\",\r\n description: 'Editor height (CSS value, e.g. \"400px\", \"60vh\").',\r\n },\r\n\r\n previewStyle: {\r\n type: \"anyOf\",\r\n label: \"Preview style\",\r\n description: \"How the preview is displayed (for markdown mode).\",\r\n items: [\r\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\r\n { type: \"string\", title: \"Tab\", value: \"tab\" },\r\n ],\r\n },\r\n\r\n editType: {\r\n type: \"anyOf\",\r\n label: \"Edit mode\",\r\n description: \"Initial editor mode.\",\r\n items: [\r\n { type: \"string\", title: \"WYSIWYG\", value: \"wysiwyg\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n useCommandShortcut: {\r\n type: \"boolean\",\r\n label: \"Command shortcuts\",\r\n description: \"Enable editor keyboard shortcuts.\",\r\n },\r\n\r\n format: {\r\n type: \"anyOf\",\r\n label: \"Stored format\",\r\n description: \"Which format is stored in the form value.\",\r\n items: [\r\n { type: \"string\", title: \"HTML\", value: \"html\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n toolbar: {\r\n type: \"anyOf\",\r\n label: \"Toolbar\",\r\n description:\r\n 'Toolbar mode. \"default\" uses built-in tools; \"none\" hides tools and mode switch.',\r\n items: [\r\n { type: \"string\", title: \"Default\", value: \"default\" },\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n ],\r\n },\r\n\r\n pastePlainText: {\r\n type: \"boolean\",\r\n label: \"Paste as plain text\",\r\n description: \"If enabled, paste is inserted as plain text only.\",\r\n },\r\n\r\n // excluded on purpose:\r\n // - placeholder (InputField prop; injected by registry helper)\r\n // - className (not allowed)\r\n // - toolbar as array (ToastToolbarItem[][] not builder-safe)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/lister.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\nimport type { Ui } from \"@/schema\";\n\nconst listerUi = {\n // ─────────────────────────────────────────────\n // Selection behaviour\n // ─────────────────────────────────────────────\n mode: {\n type: \"anyOf\",\n label: \"Selection mode\",\n description: 'Whether the lister selects one value (\"single\") or many (\"multiple\").',\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Multiple\", value: \"multiple\" },\n ],\n } satisfies Ui,\n\n confirm: {\n type: \"boolean\",\n label: \"Confirm\",\n description:\n 'When enabled (single-mode only), require confirmation before committing selection.',\n } satisfies Ui,\n\n remoteDebounceMs: {\n type: \"number\",\n label: \"Remote debounce (ms)\",\n description: \"Debounce duration for remote search requests.\",\n minimum: 0,\n } satisfies Ui,\n\n // permissions?: string[] (primitive array)\n permissions: {\n type: \"array\",\n label: \"Permissions\",\n description: \"Optional permission keys passed to the lister provider/open UI.\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Permission\",\n description: \"One permission key.\",\n } satisfies Ui,\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Inline source (when not using a base `def`)\n // ─────────────────────────────────────────────\n endpoint: {\n type: \"string\",\n label: \"Endpoint\",\n description: \"Inline endpoint for fetching options (standalone mode).\",\n } satisfies Ui,\n\n method: {\n type: \"anyOf\",\n label: \"HTTP method\",\n description: \"HTTP method for inline endpoint requests.\",\n items: [\n { type: \"string\", title: \"GET\", value: \"GET\" },\n { type: \"string\", title: \"POST\", value: \"POST\" },\n ],\n } satisfies Ui,\n\n selector: {\n type: \"string\",\n label: \"Selector\",\n description:\n 'Selector key/path for extracting the list from a response (e.g. \"data\").',\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Mapping (ctx-aware in code, but schema-configurable as keys)\n // ─────────────────────────────────────────────\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value/id from each raw option object.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the display label from each raw option object.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description: \"Key to read the description line from each raw option object.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description: \"Key to read an icon value from each raw option object.\",\n } satisfies Ui,\n\n optionGroup: {\n type: \"string\",\n label: \"Option group key\",\n description: \"Key used to group options (if grouping is supported by the open UI).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Search spec / open options (primitive-friendly subset)\n // ─────────────────────────────────────────────\n title: {\n type: \"string\",\n label: \"Title\",\n description: \"Title shown on the open/picker UI.\",\n } satisfies Ui,\n\n searchMode: {\n type: \"string\",\n label: \"Search mode\",\n description: \"Search behaviour/mode for the open UI (provider-defined).\",\n } satisfies Ui,\n\n initialQuery: {\n type: \"string\",\n label: \"Initial query\",\n description: \"Initial query state for the open UI.\",\n } satisfies Ui,\n\n showRefresh: {\n type: \"boolean\",\n label: \"Show refresh\",\n description: \"Show refresh button in the open UI.\",\n } satisfies Ui,\n\n refreshMode: {\n type: \"string\",\n label: \"Refresh mode\",\n description: \"Refresh behaviour/mode (provider-defined).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Trigger display (primitive subset)\n // ─────────────────────────────────────────────\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n maxDisplayItems: {\n type: \"number\",\n label: \"Max display items\",\n description:\n \"Maximum number of selected items to render in the closed trigger summary.\",\n minimum: 0,\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n\n // IMPORTANT: trigger style is documented in README as `mode`,\n // but `mode` is already selection mode in the real prop surface.\n triggerMode: {\n type: \"anyOf\",\n label: \"Trigger style\",\n description: 'Trigger style: \"default\" (input-like) or \"button\" (custom trigger).',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Button\", value: \"button\" },\n ],\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Shared layout knobs you *do* want exposed\n // ─────────────────────────────────────────────\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n size: sharedUi.size,\n density: sharedUi.density,\n padding: {\n type: \"object\",\n label: \"Padding\",\n description: \"Padding overrides.\",\n editable: false,\n fields: {\n px: sharedUi.padding.px,\n py: sharedUi.padding.py,\n ps: sharedUi.padding.ps,\n pe: sharedUi.padding.pe,\n pb: sharedUi.padding.pb,\n },\n } satisfies Ui,\n} as const;\n\nexport const listerDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: { variant: \"lister\" },\n ui: listerUi,\n};","// src/react/inputs/registry/entries/file.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const fileDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"file\", // MUST\n\n // sensible defaults (optional)\n multiple: false,\n mergeMode: \"append\",\n showDropArea: false,\n showCheckboxes: true,\n custom: false,\n // placeholder exists on the variant, but per your rule we DON'T declare it here\n },\n\n ui: {\n size: sharedUi.size,\n\n // file has its own density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Spacing preset for the trigger + list UI.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description: \"Allow selecting multiple files.\",\n },\n\n accept: {\n type: \"array\",\n label: \"Accepted types\",\n description:\n 'Accepted MIME types / extensions (e.g. \"image/*\", \".png\", \"application/pdf\").',\n editable: true,\n item: {\n type: \"string\",\n label: \"Type\",\n description: \"A MIME type or extension.\",\n },\n },\n\n maxFiles: {\n type: \"number\",\n label: \"Max files\",\n description:\n \"Maximum number of files allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n maxTotalSize: {\n type: \"number\",\n label: \"Max total size (bytes)\",\n description:\n \"Maximum total size across all selected files in bytes (leave unset for unlimited).\",\n minimum: 1,\n },\n\n mergeMode: {\n type: \"anyOf\",\n label: \"Merge mode\",\n description:\n 'How new picks are merged into the current selection (\"append\" or \"replace\").',\n items: [\n { type: \"string\", title: \"Append\", value: \"append\" },\n { type: \"string\", title: \"Replace\", value: \"replace\" },\n ],\n },\n\n showDropArea: {\n type: \"boolean\",\n label: \"Show drop area\",\n description: \"Show a drag-and-drop area inside the picker.\",\n },\n\n // these are ReactNode in the variant, but strings are safe + useful in builder\n dropTitle: {\n type: \"string\",\n label: \"Drop title\",\n description: \"Title text shown in the drop area.\",\n },\n\n dropDescription: {\n type: \"string\",\n label: \"Drop description\",\n description: \"Supporting text shown in the drop area.\",\n },\n\n custom: {\n type: \"boolean\",\n label: \"Custom loader\",\n description:\n \"Enable a host-provided custom loader (host must wire customLoader at runtime).\",\n },\n\n showCheckboxes: {\n type: \"boolean\",\n label: \"Show checkboxes\",\n description:\n \"Show selection checkboxes for file rows inside the picker.\",\n },\n\n asRaw: {\n type: \"boolean\",\n label: \"As raw (legacy)\",\n description:\n \"Legacy compatibility flag. The submitted value is still File|string; raw items are available via change detail meta.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop, injected by your registry helper)\n // - dropIcon (ReactNode)\n // - renderDropArea / renderFileItem (functions)\n // - customLoader (function)\n // - formatFileName / formatFileSize (functions)\n // - all *ClassName props (not allowed)\n // - button mode trigger props (ReactNode/functions)\n },\n};\n","// src/react/inputs/registry/entries/index.ts\nimport type {InputDescriptor, Registry} from \"@/react\";\n\nimport {textDescriptor} from \"./text\";\nimport {textareaDescriptor} from \"./textarea\";\nimport {phoneDescriptor} from \"./phone\";\nimport {toggleGroupDescriptor} from \"./toggle-group\";\nimport {numberDescriptor} from \"./number\";\nimport {passwordDescriptor} from \"./password\";\nimport {sliderDescriptor} from \"./slider\";\nimport {toggleDescriptor} from \"./toggle\";\nimport {treeSelectDescriptor} from \"./treeselect\";\nimport {multiSelectDescriptor} from \"./multiselect\";\nimport {selectDescriptor} from \"./select\";\nimport {radioDescriptor} from \"./radio\";\nimport {checkboxDescriptor} from \"./checkbox\";\nimport {chipsDescriptor} from \"./chips\";\nimport {colorDescriptor} from \"./color\";\nimport {dateDescriptor} from \"./date\";\nimport {keyValueDescriptor} from \"./keyvalue\";\nimport {editorDescriptor} from \"./editor\";\nimport {listerDescriptor} from \"./lister\";\nimport {fileDescriptor} from \"./file\";\nimport {Field, FieldOption, ServicePropsNotice, Ui} from \"@/schema\";\n\n/**\n * InputField-level UI props (injected for every descriptor at registration time).\n * NOTE: keep this list tight—only props that truly belong to InputField itself.\n */\nconst inputFieldUi: Record<string, Ui> = {\n // --- Chrome / helper text (builder-friendly) ---\n sublabel: {\n type: \"string\",\n label: \"Sublabel\",\n description:\n \"Secondary label text shown near the main label (if supported).\",\n },\n\n description: {\n type: \"string\",\n label: \"Description\",\n description: \"Helper description shown under the label.\",\n },\n\n helpText: {\n type: \"string\",\n label: \"Help text\",\n description: \"Additional helper text shown in the help slot.\",\n },\n\n // --- Placement hints (layout-only; host decides exact behavior) ---\n labelPlacement: {\n type: \"string\",\n label: \"Label placement\",\n description: \"Layout hint for where the label is rendered.\",\n } as Ui,\n\n sublabelPlacement: {\n type: \"string\",\n label: \"Sublabel placement\",\n description: \"Layout hint for where the sublabel is rendered.\",\n } as Ui,\n\n descriptionPlacement: {\n type: \"string\",\n label: \"Description placement\",\n description: \"Layout hint for where the description is rendered.\",\n } as Ui,\n\n helpTextPlacement: {\n type: \"string\",\n label: \"Help text placement\",\n description: \"Layout hint for where the help text is rendered.\",\n } as Ui,\n\n tagPlacement: {\n type: \"string\",\n label: \"Tag placement\",\n description: \"Layout hint for where tags are rendered.\",\n } as Ui,\n\n // --- Tags (builder-safe subset; host maps to FieldTag) ---\n tags: {\n type: \"array\",\n label: \"Tags\",\n description:\n \"Small tag badges shown near the label. Builder-safe subset (label/color/bgColor).\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Tag\",\n description: \"A label tag.\",\n editable: true,\n fields: {\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Tag text.\",\n },\n color: {\n type: \"string\",\n label: \"Text color\",\n description: 'CSS color value (e.g. \"#fff\" or \"rgb(...)\").',\n },\n bgColor: {\n type: \"string\",\n label: \"Background color\",\n description: 'CSS color value (e.g. \"#111\").',\n },\n },\n order: [\"label\", \"color\", \"bgColor\"],\n } as Ui,\n } satisfies Ui,\n\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable user interaction with the field.\",\n },\n\n readOnly: {\n type: \"boolean\",\n label: \"Read-only\",\n description: \"Prevent edits while still allowing focus/selection.\",\n },\n\n // --- Layout flags ---\n inline: {\n type: \"boolean\",\n label: \"Inline\",\n description:\n \"Render label + input in an inline row layout (if supported).\",\n },\n\n fullWidth: {\n type: \"boolean\",\n label: \"Full width\",\n description:\n \"Stretch the field to fill its container width (if supported).\",\n },\n};\n\nfunction withInputFieldUi(desc: InputDescriptor): InputDescriptor {\n return {\n ...desc,\n adapter: {\n getValue(e: any) {\n return e.value;\n },\n valueProp: \"value\",\n changeProp: \"onChange\",\n getInputPropsFromField({ field, props }) {\n const severityPillClassMap = {\n info: \"border-blue-200 bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-200\",\n warning:\n \"border-amber-200 bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200\",\n error: \"border-red-200 bg-red-50 text-red-700 ring-1 ring-inset ring-red-200\",\n } as const;\n\n const pillBaseClassName =\n \"inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\";\n\n const toTagPill = (tag: any) => ({\n label: tag.title,\n bgColor: tag.color,\n className: `${pillBaseClassName} ${severityPillClassMap[tag.severity as keyof typeof severityPillClassMap] ?? severityPillClassMap.info}`,\n });\n\n const matchesNotice = (\n target: Field | FieldOption,\n notice: ServicePropsNotice,\n ) => {\n const isNodeTargetMatch =\n notice.target.scope === \"node\" &&\n notice.target.node_id === target.id;\n const isLegacyGlobalIdMatch =\n notice.target.scope === \"global\" &&\n notice.id === target.id;\n const isServiceMatch =\n !!target.service_id &&\n String(target.service_id) === notice.id;\n\n return (\n isNodeTargetMatch ||\n isLegacyGlobalIdMatch ||\n isServiceMatch\n );\n };\n\n const notices = props.notices ?? [];\n\n const fieldNotices = notices.filter((notice) =>\n matchesNotice(field, notice),\n );\n\n return {\n label: field.label,\n tags: fieldNotices.map(toTagPill),\n required: field.required,\n\n ...(field.options?.length\n ? {\n options: field.options.map((item) => {\n // @ts-ignore\n const optionNotices = notices.filter(\n (notice) => matchesNotice(item, notice),\n );\n\n return {\n ...item,\n tags: optionNotices.map(toTagPill),\n };\n }),\n }\n : {}),\n };\n },\n getSelectedOptions(next, currentt, ctx) {\n return ((next as any)?.detail?.selectedOptions ?? [])?.map(\n (item: any) => item.id,\n );\n },\n\n isActive(stored, ctx) {\n return Boolean(stored);\n },\n },\n ui: {\n ...inputFieldUi,\n ...(desc.ui ?? {}),\n },\n };\n}\n\nfunction variantOf(desc: InputDescriptor): string {\n const v = (desc.defaultProps as any)?.variant;\n if (!v || typeof v !== \"string\") {\n throw new Error(\n `[inputs] Descriptor is missing defaultProps.variant: ${String(v)}`,\n );\n }\n return v;\n}\n\n/**\n * Register all built-in entries.\n * - You said \"variant is the only thing necessary\", so we treat kind as a constant.\n */\nexport function registerEntries(registry: Registry): void {\n const entries: InputDescriptor[] = [\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n ];\n\n registry.registerMany(\n entries.map((descriptor) => {\n const finalDescriptor = withInputFieldUi(descriptor);\n const variant = variantOf(finalDescriptor);\n\n return {\n kind: variant,\n descriptor: finalDescriptor,\n };\n }),\n );\n}\n\n// re-export entries (optional convenience)\nexport {\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n};\n","import React from \"react\";\r\nimport type { ServiceIdRef } from \"@/schema\";\r\nimport { useFallbackEditorContext } from \"./FallbackEditorProvider\";\r\n\r\nexport function useFallbackEditor() {\r\n return useFallbackEditorContext();\r\n}\r\n\r\nexport function useActiveFallbackRegistrations() {\r\n const { activeServiceId, get, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n if (activeServiceId === undefined || activeServiceId === null)\r\n return [];\r\n return get(activeServiceId);\r\n }, [activeServiceId, get, version]);\r\n}\r\n\r\nexport function usePrimaryServiceList() {\r\n const { primaryServices, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n return Object.values(primaryServices ?? {}) as Array<{\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n }>;\r\n }, [primaryServices, version]);\r\n}\r\n\r\nexport function useEligibleServiceList() {\r\n const { eligibleServices, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n return Object.values(eligibleServices ?? {}) as Array<{\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n }>;\r\n }, [eligibleServices, version]);\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport type { OrderSnapshot } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport {\r\n createFallbackEditor,\r\n type FallbackEditor,\r\n} from \"@/core/fallback-editor\";\r\n\r\ntype TabKey = \"registrations\" | \"settings\";\r\n\r\nexport type FallbackEditorProviderProps = {\r\n children: React.ReactNode;\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices?: DgpServiceMap;\r\n eligibleServices?: DgpServiceMap;\r\n\r\n settings?: FallbackSettings;\r\n initialServiceId?: ServiceIdRef;\r\n initialTab?: TabKey;\r\n\r\n onSettingsChange?: (\r\n next: FallbackSettings,\r\n ) => Promise<FallbackSettings> | FallbackSettings;\r\n\r\n onSave?: (\r\n next: ServiceProps[\"fallbacks\"],\r\n ) =>\r\n | Promise<ServiceProps[\"fallbacks\"] | void>\r\n | ServiceProps[\"fallbacks\"]\r\n | void;\r\n\r\n onValidate?: (next: ServiceProps[\"fallbacks\"]) => Promise<void> | void;\r\n\r\n onReset?: () => Promise<void> | void;\r\n};\r\n\r\ntype FallbackEditorContextValue = {\r\n editor: FallbackEditor;\r\n version: number;\r\n\r\n serviceProps?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices: DgpServiceMap;\r\n eligibleServices: DgpServiceMap;\r\n\r\n activeServiceId?: ServiceIdRef;\r\n setActiveServiceId: React.Dispatch<\r\n React.SetStateAction<ServiceIdRef | undefined>\r\n >;\r\n\r\n activeTab: TabKey;\r\n setActiveTab: React.Dispatch<React.SetStateAction<TabKey>>;\r\n\r\n state: ReturnType<FallbackEditor[\"state\"]>;\r\n value: ReturnType<FallbackEditor[\"value\"]>;\r\n\r\n settings: FallbackSettings;\r\n settingsSaving: boolean;\r\n\r\n headerSaving: boolean;\r\n headerValidating: boolean;\r\n headerResetting: boolean;\r\n\r\n saveSettings: (next: FallbackSettings) => Promise<FallbackSettings>;\r\n saveFallbacks: () => Promise<ServiceProps[\"fallbacks\"] | void>;\r\n validateFallbacks: () => Promise<void>;\r\n resetEditor: () => Promise<void>;\r\n\r\n reset: () => void;\r\n\r\n get: FallbackEditor[\"get\"];\r\n getScope: FallbackEditor[\"getScope\"];\r\n check: FallbackEditor[\"check\"];\r\n eligible: FallbackEditor[\"eligible\"];\r\n\r\n add: FallbackEditor[\"add\"];\r\n addMany: FallbackEditor[\"addMany\"];\r\n remove: FallbackEditor[\"remove\"];\r\n replace: FallbackEditor[\"replace\"];\r\n clear: FallbackEditor[\"clear\"];\r\n};\r\n\r\nconst FallbackEditorContext =\r\n React.createContext<FallbackEditorContextValue | null>(null);\r\n\r\nexport function FallbackEditorProvider({\r\n children,\r\n fallbacks,\r\n props,\r\n snapshot,\r\n primaryServices,\r\n eligibleServices,\r\n settings: initialSettings,\r\n initialServiceId,\r\n initialTab = \"registrations\",\r\n onSettingsChange,\r\n onSave,\r\n onValidate,\r\n onReset,\r\n}: FallbackEditorProviderProps) {\r\n const [settings, setSettings] = React.useState<FallbackSettings>(\r\n initialSettings ?? {},\r\n );\r\n const [settingsSaving, setSettingsSaving] = React.useState(false);\r\n\r\n const [headerSaving, setHeaderSaving] = React.useState(false);\r\n const [headerValidating, setHeaderValidating] = React.useState(false);\r\n const [headerResetting, setHeaderResetting] = React.useState(false);\r\n\r\n const [version, setVersion] = React.useState(0);\r\n const [activeServiceId, setActiveServiceId] = React.useState<\r\n ServiceIdRef | undefined\r\n >(initialServiceId);\r\n const [activeTab, setActiveTab] = React.useState<TabKey>(initialTab);\r\n\r\n React.useEffect(() => {\r\n setSettings(initialSettings ?? {});\r\n }, [initialSettings]);\r\n\r\n const resolvedPrimaryServices = React.useMemo<DgpServiceMap>(\r\n () => primaryServices ?? {},\r\n [primaryServices],\r\n );\r\n\r\n const resolvedEligibleServices = React.useMemo<DgpServiceMap>(\r\n () => eligibleServices ?? primaryServices ?? {},\r\n [eligibleServices, primaryServices],\r\n );\r\n\r\n const editorRef = React.useRef<FallbackEditor | null>(null);\r\n\r\n const buildEditor = React.useCallback(\r\n (next?: {\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n settings?: FallbackSettings;\r\n services?: DgpServiceMap;\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n }) => {\r\n const currentValue = editorRef.current?.value();\r\n\r\n editorRef.current = createFallbackEditor({\r\n fallbacks: next?.fallbacks ?? currentValue ?? fallbacks ?? {},\r\n props: next?.props ?? props,\r\n snapshot: next?.snapshot ?? snapshot,\r\n services: next?.services ?? resolvedEligibleServices,\r\n settings: next?.settings ?? settings,\r\n });\r\n\r\n setVersion((v) => v + 1);\r\n },\r\n [fallbacks, props, snapshot, resolvedEligibleServices, settings],\r\n );\r\n\r\n if (!editorRef.current) {\r\n editorRef.current = createFallbackEditor({\r\n fallbacks: fallbacks ?? {},\r\n props,\r\n snapshot,\r\n services: resolvedEligibleServices,\r\n settings,\r\n });\r\n }\r\n\r\n React.useEffect(() => {\r\n buildEditor({\r\n fallbacks: fallbacks ?? {},\r\n props,\r\n snapshot,\r\n services: resolvedEligibleServices,\r\n settings,\r\n });\r\n }, [fallbacks, props, snapshot, resolvedEligibleServices, buildEditor]);\r\n\r\n const editor = editorRef.current;\r\n\r\n const bump = React.useCallback(() => {\r\n setVersion((v) => v + 1);\r\n }, []);\r\n\r\n const syncAfterMutation = React.useCallback(() => {\r\n bump();\r\n }, [bump]);\r\n\r\n const reset = React.useCallback(() => {\r\n editor.reset();\r\n syncAfterMutation();\r\n }, [editor, syncAfterMutation]);\r\n\r\n const add = React.useCallback<FallbackEditor[\"add\"]>(\r\n (context, candidate, options) => {\r\n const next = editor.add(context, candidate, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const addMany = React.useCallback<FallbackEditor[\"addMany\"]>(\r\n (context, candidates, options) => {\r\n const next = editor.addMany(context, candidates, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const remove = React.useCallback<FallbackEditor[\"remove\"]>(\r\n (context, candidate) => {\r\n const next = editor.remove(context, candidate);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const replace = React.useCallback<FallbackEditor[\"replace\"]>(\r\n (context, candidates, options) => {\r\n const next = editor.replace(context, candidates, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const clear = React.useCallback<FallbackEditor[\"clear\"]>(\r\n (context) => {\r\n const next = editor.clear(context);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const saveSettings = React.useCallback(\r\n async (next: FallbackSettings) => {\r\n setSettingsSaving(true);\r\n try {\r\n const resolved = onSettingsChange\r\n ? await onSettingsChange(next)\r\n : next;\r\n\r\n const finalSettings = resolved ?? next;\r\n setSettings(finalSettings);\r\n\r\n buildEditor({\r\n settings: finalSettings,\r\n fallbacks: editor.value(),\r\n });\r\n\r\n return finalSettings;\r\n } finally {\r\n setSettingsSaving(false);\r\n }\r\n },\r\n [onSettingsChange, buildEditor, editor],\r\n );\r\n\r\n const saveFallbacks = React.useCallback(async () => {\r\n const next = editor.value();\r\n\r\n setHeaderSaving(true);\r\n try {\r\n const resolved = onSave ? await onSave(next) : next;\r\n if (resolved) {\r\n buildEditor({ fallbacks: resolved });\r\n }\r\n return resolved;\r\n } finally {\r\n setHeaderSaving(false);\r\n }\r\n }, [editor, onSave, buildEditor]);\r\n\r\n const validateFallbacks = React.useCallback(async () => {\r\n const next = editor.value();\r\n\r\n setHeaderValidating(true);\r\n try {\r\n if (onValidate) {\r\n await onValidate(next);\r\n }\r\n } finally {\r\n setHeaderValidating(false);\r\n }\r\n }, [editor, onValidate]);\r\n\r\n const resetEditor = React.useCallback(async () => {\r\n setHeaderResetting(true);\r\n try {\r\n editor.reset();\r\n syncAfterMutation();\r\n\r\n if (onReset) {\r\n await onReset();\r\n }\r\n } finally {\r\n setHeaderResetting(false);\r\n }\r\n }, [editor, syncAfterMutation, onReset]);\r\n\r\n const value = React.useMemo(() => editor.value(), [editor, version]);\r\n const state = React.useMemo(() => editor.state(), [editor, version]);\r\n\r\n const ctx = React.useMemo<FallbackEditorContextValue>(\r\n () => ({\r\n editor,\r\n version,\r\n\r\n serviceProps: props,\r\n snapshot,\r\n\r\n primaryServices: resolvedPrimaryServices,\r\n eligibleServices: resolvedEligibleServices,\r\n\r\n activeServiceId,\r\n setActiveServiceId,\r\n\r\n activeTab,\r\n setActiveTab,\r\n\r\n state,\r\n value,\r\n\r\n settings,\r\n settingsSaving,\r\n\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n\r\n saveSettings,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n\r\n reset,\r\n\r\n get: editor.get,\r\n getScope: editor.getScope,\r\n check: editor.check,\r\n eligible: editor.eligible,\r\n\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n }),\r\n [\r\n editor,\r\n version,\r\n props,\r\n snapshot,\r\n resolvedPrimaryServices,\r\n resolvedEligibleServices,\r\n activeServiceId,\r\n activeTab,\r\n state,\r\n value,\r\n settings,\r\n settingsSaving,\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n saveSettings,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n reset,\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n ],\r\n );\r\n\r\n return (\r\n <FallbackEditorContext.Provider value={ctx}>\r\n {children}\r\n </FallbackEditorContext.Provider>\r\n );\r\n}\r\n\r\nexport function useFallbackEditorContext() {\r\n const ctx = React.useContext(FallbackEditorContext);\r\n if (!ctx) {\r\n throw new Error(\r\n \"useFallbackEditorContext must be used inside FallbackEditorProvider\",\r\n );\r\n }\r\n return ctx;\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport type { OrderSnapshot } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport {\r\n FallbackEditorProvider,\r\n type FallbackEditorProviderProps,\r\n} from \"@/react\";\r\nimport { FallbackEditorHeader } from \"@/react\";\r\nimport { FallbackServiceSidebar } from \"@/react\";\r\nimport { FallbackRegistrationsPanel } from \"@/react\";\r\nimport { FallbackSettingsPanel } from \"@/react\";\r\nimport { FallbackDetailsPanel } from \"@/react\";\r\nimport { useFallbackEditor } from \"@/react/fallback-editor/useFallbackEditor\";\r\n\r\ntype Props = {\r\n className?: string;\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices?: DgpServiceMap;\r\n eligibleServices?: DgpServiceMap;\r\n\r\n settings?: FallbackSettings;\r\n initialServiceId?: ServiceIdRef;\r\n\r\n onSettingsChange?: FallbackEditorProviderProps[\"onSettingsChange\"];\r\n onSave?: FallbackEditorProviderProps[\"onSave\"];\r\n onValidate?: FallbackEditorProviderProps[\"onValidate\"];\r\n onReset?: FallbackEditorProviderProps[\"onReset\"];\r\n};\r\n\r\nexport function FallbackEditor({\r\n className,\r\n fallbacks,\r\n props,\r\n snapshot,\r\n primaryServices,\r\n eligibleServices,\r\n settings,\r\n initialServiceId,\r\n onSettingsChange,\r\n onSave,\r\n onValidate,\r\n onReset,\r\n}: Props) {\r\n return (\r\n <FallbackEditorProvider\r\n fallbacks={fallbacks}\r\n props={props}\r\n snapshot={snapshot}\r\n primaryServices={primaryServices}\r\n eligibleServices={eligibleServices}\r\n settings={settings}\r\n initialServiceId={initialServiceId}\r\n onSettingsChange={onSettingsChange}\r\n onSave={onSave}\r\n onValidate={onValidate}\r\n onReset={onReset}\r\n >\r\n <FallbackEditorInner className={className} />\r\n </FallbackEditorProvider>\r\n );\r\n}\r\n\r\nfunction FallbackEditorInner({ className }: { className?: string }) {\r\n const {\r\n activeTab,\r\n setActiveTab,\r\n activeServiceId,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n } = useFallbackEditor();\r\n\r\n return (\r\n <div\r\n className={[\r\n \"min-h-screen bg-zinc-100 p-4 text-zinc-900 dark:bg-zinc-950 dark:text-zinc-100\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\r\n <FallbackEditorHeader\r\n onReset={resetEditor}\r\n onValidate={validateFallbacks}\r\n onSave={saveFallbacks as any}\r\n resetting={headerResetting}\r\n validating={headerValidating}\r\n saving={headerSaving}\r\n />\r\n\r\n <div className=\"grid gap-4 xl:grid-cols-[300px_minmax(0,1fr)_360px]\">\r\n <FallbackServiceSidebar />\r\n\r\n <div className=\"flex min-h-0 flex-col gap-4\">\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\r\n {activeServiceId !== undefined\r\n ? `Service #${String(activeServiceId)}`\r\n : \"No service selected\"}\r\n </h2>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Edit fallback registrations and inspect\r\n validation.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <TabButton\r\n active={activeTab === \"registrations\"}\r\n onClick={() =>\r\n setActiveTab(\"registrations\")\r\n }\r\n >\r\n Registrations\r\n </TabButton>\r\n <TabButton\r\n active={activeTab === \"settings\"}\r\n onClick={() => setActiveTab(\"settings\")}\r\n >\r\n Settings\r\n </TabButton>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {activeTab === \"registrations\" ? (\r\n <FallbackRegistrationsPanel />\r\n ) : (\r\n <FallbackSettingsPanel />\r\n )}\r\n </div>\r\n\r\n <FallbackDetailsPanel />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TabButton({\r\n active,\r\n onClick,\r\n children,\r\n}: {\r\n active: boolean;\r\n onClick: () => void;\r\n children: React.ReactNode;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className={[\r\n \"rounded-xl px-3 py-2 text-sm font-medium transition\",\r\n active\r\n ? \"bg-blue-600 text-white\"\r\n : \"border border-zinc-300 bg-white text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\",\r\n ].join(\" \")}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef } from \"@/schema\";\r\n\r\ntype Item = {\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n};\r\n\r\ntype Props = {\r\n items: Item[];\r\n selected: Set<string>;\r\n onToggle: (id: ServiceIdRef) => void;\r\n height?: number;\r\n rowHeight?: number;\r\n emptyText?: string;\r\n};\r\n\r\nexport function VirtualServiceList({\r\n items,\r\n selected,\r\n onToggle,\r\n height = 420,\r\n rowHeight = 52,\r\n emptyText = \"No services found.\",\r\n}: Props) {\r\n const [scrollTop, setScrollTop] = React.useState(0);\r\n\r\n const total = items.length;\r\n const visibleCount = Math.ceil(height / rowHeight);\r\n const overscan = 8;\r\n\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\r\n const end = Math.min(total, start + visibleCount + overscan * 2);\r\n\r\n const visible = items.slice(start, end);\r\n\r\n if (total === 0) {\r\n return (\r\n <div\r\n className=\"flex items-center justify-center rounded-xl border border-zinc-200 bg-zinc-50 text-sm text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-400\"\r\n style={{ height }}\r\n >\r\n {emptyText}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"overflow-auto rounded-xl border border-zinc-200 dark:border-zinc-800\"\r\n style={{ height }}\r\n onScroll={(e) => setScrollTop(e.currentTarget.scrollTop)}\r\n >\r\n <div className=\"relative\" style={{ height: total * rowHeight }}>\r\n {visible.map((item, i) => {\r\n const index = start + i;\r\n const key = String(item.id);\r\n const checked = selected.has(key);\r\n\r\n return (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n onClick={() => onToggle(item.id)}\r\n className=\"absolute left-0 right-0 flex items-center justify-between border-b border-zinc-100 bg-white px-3 text-left hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:bg-zinc-800\"\r\n style={{\r\n top: index * rowHeight,\r\n height: rowHeight,\r\n }}\r\n >\r\n <div className=\"min-w-0\">\r\n <div className=\"truncate text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n #{String(item.id)} ·{\" \"}\r\n {item.name ?? \"Unnamed\"}\r\n </div>\r\n <div className=\"mt-0.5 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {item.platform ?? \"Unknown\"}\r\n {typeof item.rate === \"number\"\r\n ? ` · rate ${item.rate}`\r\n : \"\"}\r\n </div>\r\n </div>\r\n\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n readOnly\r\n className=\"h-4 w-4 rounded border-zinc-300\"\r\n />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { useFallbackEditor, usePrimaryServiceList } from \"./useFallbackEditor\";\r\n\r\nexport function FallbackDetailsPanel() {\r\n const { activeServiceId, state, settings } = useFallbackEditor();\r\n const services = usePrimaryServiceList();\r\n\r\n const service = React.useMemo(\r\n () => services.find((s) => String(s.id) === String(activeServiceId)),\r\n [services, activeServiceId],\r\n );\r\n\r\n return (\r\n <aside className=\"flex min-h-0 flex-col gap-4\">\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Primary service info\r\n </h3>\r\n\r\n {!service ? (\r\n <p className=\"mt-3 text-sm text-zinc-500 dark:text-zinc-400\">\r\n No service selected.\r\n </p>\r\n ) : (\r\n <div className=\"mt-3 space-y-2 text-sm\">\r\n <Detail label=\"ID\" value={String(service.id)} />\r\n <Detail\r\n label=\"Name\"\r\n value={service.name ?? \"Unnamed\"}\r\n />\r\n <Detail\r\n label=\"Platform\"\r\n value={service.platform ?? \"—\"}\r\n />\r\n <Detail\r\n label=\"Rate\"\r\n value={\r\n typeof service.rate === \"number\"\r\n ? String(service.rate)\r\n : \"—\"\r\n }\r\n />\r\n <Detail\r\n label=\"Changed\"\r\n value={state.changed ? \"yes\" : \"no\"}\r\n />\r\n </div>\r\n )}\r\n </section>\r\n\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Active policy\r\n </h3>\r\n\r\n <div className=\"mt-3 space-y-2 text-sm\">\r\n <Detail\r\n label=\"Constraint fit\"\r\n value={\r\n settings.requireConstraintFit\r\n ? \"enabled\"\r\n : \"disabled\"\r\n }\r\n />\r\n <Detail\r\n label=\"Rate policy\"\r\n value={\n settings.ratePolicy?.kind === \"eq_primary\"\n ? \"eq_primary\"\n : settings.ratePolicy?.kind === \"within_pct\"\n ? `within_pct (${settings.ratePolicy.pct}%)`\n : settings.ratePolicy?.kind ===\n \"at_least_pct_lower\"\n ? `at_least_pct_lower (${settings.ratePolicy.pct}%)`\n : settings.ratePolicy?.kind ===\n \"lte_primary\"\n ? `lte_primary (${settings.ratePolicy.pct}%)`\n : \"lte_primary (5%)\"\n }\n />\n <Detail\r\n label=\"Strategy\"\r\n value={settings.selectionStrategy ?? \"priority\"}\r\n />\r\n <Detail label=\"Mode\" value={settings.mode ?? \"strict\"} />\r\n </div>\r\n </section>\r\n\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Current payload\r\n </h3>\r\n\r\n <pre className=\"mt-3 overflow-auto rounded-xl bg-zinc-950 p-3 text-xs text-zinc-100\">\r\n {JSON.stringify(state.current, null, 2)}\r\n </pre>\r\n </section>\r\n </aside>\r\n );\r\n}\r\n\r\nfunction Detail({ label, value }: { label: string; value: string }) {\r\n return (\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <span className=\"text-zinc-500 dark:text-zinc-400\">{label}</span>\r\n <span className=\"text-right text-zinc-900 dark:text-zinc-100\">\r\n {value}\r\n </span>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\ntype Props = {\r\n onReset?: () => void | Promise<void>;\r\n onValidate?: () => void | Promise<void>;\r\n onSave?: () => void | Promise<void>;\r\n resetting?: boolean;\r\n validating?: boolean;\r\n saving?: boolean;\r\n};\r\n\r\nexport function FallbackEditorHeader({\r\n onReset,\r\n onValidate,\r\n onSave,\r\n resetting = false,\r\n validating = false,\r\n saving = false,\r\n}: Props) {\r\n return (\r\n <div className=\"flex flex-col gap-3 rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900 md:flex-row md:items-center md:justify-between\">\r\n <div>\r\n <h1 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Fallback Editor\r\n </h1>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Manage global and node-scoped fallback registrations with\r\n live validation hints.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n disabled={resetting}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n {resetting ? \"Resetting...\" : \"Reset\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onValidate}\r\n disabled={validating}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n {validating ? \"Validating...\" : \"Validate\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onSave}\r\n disabled={saving}\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n {saving ? \"Saving...\" : \"Save\"}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\r\nimport { useFallbackEditorContext } from \"./FallbackEditorProvider\";\r\n\r\nexport function FallbackSettingsPanel() {\r\n const { settings, saveSettings, settingsSaving } =\r\n useFallbackEditorContext();\r\n\r\n const [draft, setDraft] = React.useState<FallbackSettings>(settings);\r\n const [error, setError] = React.useState<string | null>(null);\r\n const [saved, setSaved] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setDraft(settings);\r\n setSaved(false);\r\n setError(null);\r\n }, [settings]);\r\n\r\n const changed =\r\n JSON.stringify(draft ?? {}) !== JSON.stringify(settings ?? {});\r\n\r\n async function handleSave() {\r\n setError(null);\r\n setSaved(false);\r\n\r\n try {\r\n await saveSettings(draft);\r\n setSaved(true);\r\n } catch (err) {\r\n setError(\r\n err instanceof Error\r\n ? err.message\r\n : \"Failed to save fallback settings.\",\r\n );\r\n }\r\n }\r\n\r\n function setRatePolicy(next: RatePolicy) {\r\n setDraft((prev) => ({\r\n ...prev,\r\n ratePolicy: next,\r\n }));\r\n }\r\n\r\n const ratePolicy: RatePolicy = draft.ratePolicy ?? {\n kind: \"lte_primary\",\n pct: 5,\n };\n\r\n return (\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"mb-4 flex items-start justify-between gap-3\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Fallback settings\r\n </h3>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n These settings can be persisted by the host and returned\r\n into the editor.\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!changed || settingsSaving}\r\n className={[\r\n \"rounded-xl px-3 py-2 text-sm font-medium transition\",\r\n !changed || settingsSaving\r\n ? \"cursor-not-allowed bg-zinc-200 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-500\"\r\n : \"bg-blue-600 text-white hover:bg-blue-700\",\r\n ].join(\" \")}\r\n >\r\n {settingsSaving ? \"Saving...\" : \"Save settings\"}\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <SettingRow\r\n title=\"Require constraint fit\"\r\n hint=\"Reject or warn when a candidate does not match effective tag constraints.\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n requireConstraintFit:\r\n !prev?.requireConstraintFit,\r\n }))\r\n }\r\n className={[\r\n \"inline-flex items-center gap-2 rounded-full border px-3 py-2 text-sm\",\r\n draft.requireConstraintFit\r\n ? \"border-green-300 bg-green-50 text-green-700 dark:border-green-900/50 dark:bg-green-950/30 dark:text-green-300\"\r\n : \"border-zinc-300 bg-white text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\",\r\n ].join(\" \")}\r\n >\r\n <span>\r\n {draft.requireConstraintFit\r\n ? \"Enabled\"\r\n : \"Disabled\"}\r\n </span>\r\n <span\r\n className={[\r\n \"h-2.5 w-2.5 rounded-full\",\r\n draft.requireConstraintFit\r\n ? \"bg-green-500\"\r\n : \"bg-zinc-400\",\r\n ].join(\" \")}\r\n />\r\n </button>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Rate policy\"\r\n hint=\"Controls how fallback service rates are compared against the primary service.\"\r\n >\r\n <div className=\"flex flex-col gap-2 md:items-end\">\r\n <select\r\n value={ratePolicy.kind}\r\n onChange={(e) => {\r\n const kind = e.target\r\n .value as RatePolicy[\"kind\"];\r\n\r\n if (kind === \"eq_primary\") {\n setRatePolicy({ kind: \"eq_primary\" });\n return;\n }\n\n const currentPct =\n ratePolicy.kind === \"eq_primary\"\n ? 5\n : ratePolicy.pct;\n\n if (kind === \"lte_primary\") {\n setRatePolicy({\n kind: \"lte_primary\",\n pct: currentPct,\n });\n return;\n }\n\n if (kind === \"within_pct\") {\n setRatePolicy({\n kind: \"within_pct\",\n pct: currentPct,\n });\n return;\n }\n\n setRatePolicy({\n kind: \"at_least_pct_lower\",\n pct: currentPct,\n });\n }}\r\n className=\"w-56 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"eq_primary\">eq_primary</option>\n <option value=\"lte_primary\">lte_primary</option>\n <option value=\"within_pct\">within_pct</option>\n <option value=\"at_least_pct_lower\">\n at_least_pct_lower\n </option>\n </select>\n\n {ratePolicy.kind !== \"eq_primary\" && (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={0}\r\n step=\"0.01\"\r\n value={ratePolicy.pct}\r\n onChange={(e) => {\r\n const pct = Number(e.target.value || 0);\r\n\r\n setRatePolicy({ ...ratePolicy, pct });\n }}\n className=\"w-32 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n />\r\n <span className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n %\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Selection strategy\"\r\n hint=\"How valid fallback candidates are ordered in previews.\"\r\n >\r\n <select\r\n value={draft.selectionStrategy ?? \"priority\"}\r\n onChange={(e) =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n selectionStrategy: e.target.value as\r\n | \"priority\"\r\n | \"cheapest\",\r\n }))\r\n }\r\n className=\"w-48 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"priority\">priority</option>\r\n <option value=\"cheapest\">cheapest</option>\r\n </select>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Mode\"\r\n hint=\"Use strict for enforced filtering, dev for advisory feedback.\"\r\n >\r\n <select\r\n value={draft.mode ?? \"strict\"}\r\n onChange={(e) =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n mode: e.target.value as \"strict\" | \"dev\",\r\n }))\r\n }\r\n className=\"w-48 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"strict\">strict</option>\r\n <option value=\"dev\">dev</option>\r\n </select>\r\n </SettingRow>\r\n </div>\r\n\r\n {saved && !error ? (\r\n <div className=\"mt-4 rounded-xl border border-green-200 bg-green-50 px-3 py-2 text-sm text-green-700 dark:border-green-900/50 dark:bg-green-950/20 dark:text-green-300\">\r\n Settings saved.\r\n </div>\r\n ) : null}\r\n\r\n {error ? (\r\n <div className=\"mt-4 rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-300\">\r\n {error}\r\n </div>\r\n ) : null}\r\n </section>\r\n );\r\n}\r\n\r\nfunction SettingRow({\r\n title,\r\n hint,\r\n children,\r\n}: {\r\n title: string;\r\n hint: string;\r\n children: React.ReactNode;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col gap-3 border-b border-dashed border-zinc-200 pb-4 last:border-b-0 last:pb-0 dark:border-zinc-800 md:flex-row md:items-center md:justify-between\">\r\n <div className=\"max-w-xl\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n {title}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {hint}\r\n </div>\r\n </div>\r\n <div>{children}</div>\r\n </div>\r\n );\r\n}\r\n","import React, { useMemo, useState } from \"react\";\r\nimport { useFallbackEditor, usePrimaryServiceList } from \"./useFallbackEditor\";\r\n\r\nexport function FallbackServiceSidebar() {\r\n const { activeServiceId, setActiveServiceId, get } = useFallbackEditor();\r\n const services = usePrimaryServiceList();\r\n const [query, setQuery] = useState(\"\");\r\n\r\n const filtered = useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n if (!q) return services;\r\n\r\n return services.filter(\r\n (service) =>\r\n String(service.id).includes(q) ||\r\n String(service.name ?? \"\")\r\n .toLowerCase()\r\n .includes(q) ||\r\n String(service.platform ?? \"\")\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n }, [query, services]);\r\n\r\n return (\r\n <aside className=\"flex min-h-0 flex-col rounded-2xl border border-zinc-200 bg-white shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h2 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Primary services\r\n </h2>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Services currently active in the builder/runtime context.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex min-h-0 flex-1 flex-col p-4\">\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search primary service...\"\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n />\r\n\r\n <div className=\"mt-3 flex-1 space-y-2 overflow-auto\">\r\n {filtered.map((service) => {\r\n const active =\r\n String(service.id) === String(activeServiceId);\r\n const count = get(service.id).length;\r\n\r\n return (\r\n <button\r\n key={String(service.id)}\r\n type=\"button\"\r\n onClick={() => setActiveServiceId(service.id)}\r\n className={[\r\n \"w-full rounded-2xl border p-3 text-left transition\",\r\n active\r\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-950/30\"\r\n : \"border-zinc-200 bg-zinc-50 hover:border-zinc-300 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:border-zinc-700\",\r\n ].join(\" \")}\r\n >\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"min-w-0\">\r\n <div className=\"truncate text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n #{String(service.id)} ·{\" \"}\r\n {service.name ?? \"Unnamed\"}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {service.platform ?? \"Unknown\"}\r\n {typeof service.rate === \"number\"\r\n ? ` · rate ${service.rate}`\r\n : \"\"}\r\n </div>\r\n </div>\r\n\r\n <span className=\"rounded-full border border-zinc-200 bg-white px-2 py-1 text-[11px] text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\">\r\n {count} reg\r\n </span>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type {\r\n FallbackRegistration,\r\n FallbackScopeRef,\r\n ServiceIdRef,\r\n} from \"@/schema\";\r\nimport {\r\n useActiveFallbackRegistrations,\r\n useEligibleServiceList,\r\n useFallbackEditor,\r\n} from \"./useFallbackEditor\";\r\nimport { FallbackAddCandidatesDialog } from \"./FallbackAddCandidatesDialog\";\r\nimport { FallbackAddRegistrationDialog } from \"./FallbackAddRegistrationDialog\";\r\n\r\nexport function FallbackRegistrationsPanel() {\r\n const { activeServiceId, remove, clear, check } = useFallbackEditor();\r\n\r\n const registrations = useActiveFallbackRegistrations();\r\n const eligibleServices = useEligibleServiceList();\r\n\r\n const [candidatePickerOpen, setCandidatePickerOpen] = React.useState(false);\r\n const [candidateContext, setCandidateContext] =\r\n React.useState<FallbackScopeRef | null>(null);\r\n const [candidatePrimaryId, setCandidatePrimaryId] = React.useState<\r\n ServiceIdRef | undefined\r\n >(undefined);\r\n\r\n const [registrationDialogOpen, setRegistrationDialogOpen] =\r\n React.useState(false);\r\n\r\n const makeContext = React.useCallback(\r\n (registration: FallbackRegistration): FallbackScopeRef => {\r\n if (registration.scope === \"global\") {\r\n return {\r\n scope: \"global\",\r\n primary: registration.primary,\r\n };\r\n }\r\n\r\n return {\r\n scope: \"node\",\r\n nodeId: registration.scopeId!,\r\n };\r\n },\r\n [],\r\n );\r\n\r\n const openCandidatePicker = React.useCallback(\r\n (context: FallbackScopeRef, primaryId?: ServiceIdRef) => {\r\n setCandidateContext(context);\r\n setCandidatePrimaryId(primaryId);\r\n setCandidatePickerOpen(true);\r\n },\r\n [],\r\n );\r\n\r\n if (activeServiceId === undefined || activeServiceId === null) {\r\n return (\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"rounded-2xl border border-dashed border-zinc-300 p-6 text-sm text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\">\r\n Select a primary service to start editing.\r\n </div>\r\n </section>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"mb-4 flex items-start justify-between gap-3\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Registered fallbacks\r\n </h3>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Use eligible services as fallback candidates for the\r\n selected primary.\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setRegistrationDialogOpen(true)}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Add registration\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n {registrations.length === 0 ? (\r\n <div className=\"rounded-2xl border border-dashed border-zinc-300 p-6 text-sm text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\">\r\n No registrations yet for this primary service.\r\n </div>\r\n ) : (\r\n registrations.map((reg, index) => {\r\n const context = makeContext(reg);\r\n const candidates = reg.services;\r\n\r\n return (\r\n <div\r\n key={`${reg.scope}:${String(reg.scopeId ?? \"global\")}:${index}`}\r\n className=\"rounded-2xl border border-zinc-200 bg-zinc-50 p-4 dark:border-zinc-800 dark:bg-zinc-950\"\r\n >\r\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\r\n <div>\r\n <div className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n {reg.scope === \"global\"\r\n ? \"Global registration\"\r\n : `Node · ${reg.scopeId}`}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Primary #{String(reg.primary)}\r\n </div>\r\n </div>\r\n\r\n <span className=\"rounded-full border border-zinc-200 bg-white px-2 py-1 text-[11px] text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\">\r\n {reg.scope}\r\n {reg.scopeId\r\n ? ` · ${reg.scopeId}`\r\n : \"\"}\r\n </span>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-wrap gap-2\">\r\n {candidates.length === 0 ? (\r\n <span className=\"text-xs text-zinc-500 dark:text-zinc-400\">\r\n No fallback services yet.\r\n </span>\r\n ) : (\r\n candidates.map((candidate) => {\r\n const preview = check(context, [\r\n candidate,\r\n ]);\r\n const rejected =\r\n preview.rejected[0];\r\n const tone = rejected\r\n ? \"border-red-200 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/30 dark:text-red-300\"\r\n : \"border-zinc-200 bg-white text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-200\";\r\n\r\n const service =\r\n eligibleServices.find(\r\n (s) =>\r\n String(s.id) ===\r\n String(candidate),\r\n );\r\n\r\n return (\r\n <div\r\n key={String(candidate)}\r\n className={`inline-flex items-center gap-2 rounded-xl border px-3 py-2 text-xs ${tone}`}\r\n >\r\n <span>\r\n {service\r\n ? `#${String(service.id)} · ${service.name ?? \"Unnamed\"}`\r\n : `#${String(candidate)}`}\r\n </span>\r\n {rejected ? (\r\n <span className=\"rounded-full border border-current/20 px-2 py-0.5 text-[10px]\">\r\n {rejected.reasons.join(\r\n \", \",\r\n )}\r\n </span>\r\n ) : (\r\n <span className=\"rounded-full border border-current/20 px-2 py-0.5 text-[10px]\">\r\n valid\r\n </span>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n remove(\r\n context,\r\n candidate,\r\n )\r\n }\r\n className=\"text-current/70 hover:text-current\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n <div className=\"mt-4 flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n openCandidatePicker(\r\n context,\r\n reg.primary,\r\n )\r\n }\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Add fallback\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => clear(context)}\r\n className=\"rounded-xl border border-red-300 bg-white px-3 py-2 text-sm font-medium text-red-600 hover:bg-red-50 dark:border-red-900/50 dark:bg-zinc-900 dark:text-red-300 dark:hover:bg-red-950/20\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n </section>\r\n\r\n <FallbackAddRegistrationDialog\r\n open={registrationDialogOpen}\r\n onClose={() => setRegistrationDialogOpen(false)}\r\n onSelect={(context, primaryId) => {\r\n setRegistrationDialogOpen(false);\r\n openCandidatePicker(context, primaryId);\r\n }}\r\n />\r\n\r\n <FallbackAddCandidatesDialog\r\n open={candidatePickerOpen}\r\n onClose={() => setCandidatePickerOpen(false)}\r\n context={candidateContext}\r\n primaryId={candidatePrimaryId}\r\n />\r\n </>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackScopeRef, ServiceIdRef } from \"@/schema\";\r\nimport { useEligibleServiceList, useFallbackEditor } from \"./useFallbackEditor\";\r\nimport { VirtualServiceList } from \"./VirtualServiceList\";\r\n\r\ntype Props = {\r\n open: boolean;\r\n onClose: () => void;\r\n context: FallbackScopeRef | null;\r\n primaryId?: ServiceIdRef;\r\n};\r\n\r\nexport function FallbackAddCandidatesDialog({\r\n open,\r\n onClose,\r\n context,\r\n primaryId,\r\n}: Props) {\r\n const { eligible, addMany } = useFallbackEditor();\r\n const eligibleServices = useEligibleServiceList();\r\n\r\n const [query, setQuery] = React.useState(\"\");\r\n const [filterEligibleOnly, setFilterEligibleOnly] = React.useState(true);\r\n const [selected, setSelected] = React.useState<Set<string>>(new Set());\r\n const [submitting, setSubmitting] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!open) {\r\n setQuery(\"\");\r\n setFilterEligibleOnly(true);\r\n setSelected(new Set());\r\n }\r\n }, [open]);\r\n\r\n const allowedIds = React.useMemo(() => {\r\n if (!context) return null;\r\n if (!filterEligibleOnly) return null;\r\n return new Set(eligible(context).map((id) => String(id)));\r\n }, [context, filterEligibleOnly, eligible]);\r\n\r\n const items = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n\r\n return eligibleServices.filter((service) => {\r\n if (\r\n primaryId !== undefined &&\r\n String(service.id) === String(primaryId)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (allowedIds && !allowedIds.has(String(service.id))) {\r\n return false;\r\n }\r\n\r\n if (!q) return true;\r\n\r\n return (\r\n String(service.id).includes(q) ||\r\n String(service.name ?? \"\")\r\n .toLowerCase()\r\n .includes(q) ||\r\n String(service.platform ?? \"\")\r\n .toLowerCase()\r\n .includes(q)\r\n );\r\n });\r\n }, [eligibleServices, allowedIds, query, primaryId]);\r\n\r\n function toggle(id: ServiceIdRef) {\r\n setSelected((prev) => {\r\n const next = new Set(prev);\r\n const key = String(id);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n }\r\n\r\n async function handleAdd() {\r\n if (!context || selected.size === 0) return;\r\n\r\n setSubmitting(true);\r\n try {\r\n const ids = items\r\n .filter((item) => selected.has(String(item.id)))\r\n .map((item) => item.id);\r\n\r\n addMany(context, ids);\r\n onClose();\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n }\r\n\r\n if (!open || !context) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\r\n <div className=\"flex max-h-[85vh] w-full max-w-3xl flex-col rounded-2xl border border-zinc-200 bg-white shadow-2xl dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h3 className=\"text-base font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Add fallback services\r\n </h3>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Search and select one or more eligible fallback\r\n candidates.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-3 p-4\">\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search eligible services...\"\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n />\r\n\r\n <label className=\"inline-flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300\">\r\n <input\r\n type=\"checkbox\"\r\n checked={filterEligibleOnly}\r\n onChange={(e) =>\r\n setFilterEligibleOnly(e.target.checked)\r\n }\r\n className=\"h-4 w-4 rounded border-zinc-300\"\r\n />\r\n Filter eligible only\r\n </label>\r\n\r\n <VirtualServiceList\r\n items={items}\r\n selected={selected}\r\n onToggle={toggle}\r\n emptyText=\"No eligible services found.\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between border-t border-zinc-200 p-4 dark:border-zinc-800\">\r\n <div className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n {selected.size} selected\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleAdd}\r\n disabled={selected.size === 0 || submitting}\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n {submitting ? \"Adding...\" : \"Add selected\"}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackScopeRef, ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport {\r\n useActiveFallbackRegistrations,\r\n useFallbackEditor,\r\n} from \"./useFallbackEditor\";\r\n\r\ntype NodeTarget = {\r\n id: string;\r\n kind: \"tag\" | \"field\" | \"option\" | \"node\";\r\n label: string;\r\n serviceId: ServiceIdRef;\r\n};\r\n\r\ntype Props = {\r\n open: boolean;\r\n onClose: () => void;\r\n onSelect: (context: FallbackScopeRef, primaryId: ServiceIdRef) => void;\r\n};\r\n\r\ntype RegistrationMode = \"snapshot\" | \"props\" | \"none\";\r\n\r\nexport function FallbackAddRegistrationDialog({\r\n open,\r\n onClose,\r\n onSelect,\r\n}: Props) {\r\n const { activeServiceId, serviceProps, snapshot } = useFallbackEditor();\r\n const registrations = useActiveFallbackRegistrations();\r\n\r\n const [scope, setScope] = React.useState<\"global\" | \"node\">(\"global\");\r\n const [nodeId, setNodeId] = React.useState(\"\");\r\n\r\n const mode = React.useMemo<RegistrationMode>(() => {\r\n if (snapshot) return \"snapshot\";\r\n if (serviceProps) return \"props\";\r\n return \"none\";\r\n }, [snapshot, serviceProps]);\r\n\r\n React.useEffect(() => {\r\n if (open) {\r\n setScope(\"global\");\r\n setNodeId(\"\");\r\n }\r\n }, [open]);\r\n\r\n const hasGlobal = React.useMemo(() => {\r\n return registrations.some((r) => r.scope === \"global\");\r\n }, [registrations]);\r\n\r\n const nodeTargets = React.useMemo<NodeTarget[]>(() => {\r\n if (activeServiceId === undefined || activeServiceId === null) {\r\n return [];\r\n }\r\n\r\n if (mode === \"snapshot\" && snapshot?.serviceMap) {\r\n const out: NodeTarget[] = [];\r\n\r\n for (const [id, primaryIds] of Object.entries(\r\n snapshot.serviceMap,\r\n )) {\r\n const matchesPrimary = (primaryIds ?? []).some(\r\n (serviceId) =>\r\n String(serviceId) === String(activeServiceId),\r\n );\r\n\r\n if (!matchesPrimary) continue;\r\n\r\n const meta = resolveNodeMeta(serviceProps, id);\r\n\r\n out.push({\r\n id,\r\n kind: meta.kind,\r\n label: meta.label,\r\n serviceId: activeServiceId,\r\n });\r\n }\r\n\r\n // keep active tag near the top if present\r\n const activeTagId = snapshot.selection?.tag;\r\n\r\n out.sort((a, b) => {\r\n if (\r\n activeTagId &&\r\n a.id === activeTagId &&\r\n b.id !== activeTagId\r\n ) {\r\n return -1;\r\n }\r\n if (\r\n activeTagId &&\r\n b.id === activeTagId &&\r\n a.id !== activeTagId\r\n ) {\r\n return 1;\r\n }\r\n return a.label.localeCompare(b.label);\r\n });\r\n\r\n const seen = new Set<string>();\r\n return out.filter((item) => {\r\n if (seen.has(item.id)) return false;\r\n seen.add(item.id);\r\n return true;\r\n });\r\n }\r\n\r\n if (mode === \"props\" && serviceProps) {\r\n const out: NodeTarget[] = [];\r\n\r\n for (const tag of serviceProps.filters ?? []) {\r\n if (tag?.service_id === undefined || tag?.service_id === null) {\r\n continue;\r\n }\r\n\r\n if (String(tag.service_id) !== String(activeServiceId)) {\r\n continue;\r\n }\r\n\r\n out.push({\r\n id: tag.id,\r\n kind: \"tag\",\r\n label:\r\n tag.label ??\r\n (tag as { title?: string }).title ??\r\n tag.id,\r\n serviceId: tag.service_id,\r\n });\r\n }\r\n\r\n for (const field of serviceProps.fields ?? []) {\r\n if (\r\n field?.service_id !== undefined &&\r\n field?.service_id !== null &&\r\n String(field.service_id) === String(activeServiceId)\r\n ) {\r\n out.push({\r\n id: field.id,\r\n kind: \"field\",\r\n label:\r\n field.label ??\r\n (field as { title?: string }).title ??\r\n field.id,\r\n serviceId: field.service_id,\r\n });\r\n }\r\n\r\n for (const option of field.options ?? []) {\r\n if (\r\n option?.service_id === undefined ||\r\n option?.service_id === null\r\n ) {\r\n continue;\r\n }\r\n\r\n if (String(option.service_id) !== String(activeServiceId)) {\r\n continue;\r\n }\r\n\r\n out.push({\r\n id: option.id,\r\n kind: \"option\",\r\n label:\r\n option.label ??\r\n (option as { title?: string }).title ??\r\n String(\r\n (option as { value?: unknown }).value ??\r\n option.id,\r\n ),\r\n serviceId: option.service_id,\r\n });\r\n }\r\n }\r\n\r\n const seen = new Set<string>();\r\n return out.filter((item) => {\r\n if (seen.has(item.id)) return false;\r\n seen.add(item.id);\r\n return true;\r\n });\r\n }\r\n\r\n return [];\r\n }, [mode, snapshot, serviceProps, activeServiceId]);\r\n\r\n React.useEffect(() => {\r\n if (hasGlobal && scope === \"global\") {\r\n setScope(\"node\");\r\n }\r\n }, [hasGlobal, scope]);\r\n\r\n React.useEffect(() => {\r\n if (scope === \"node\" && nodeId) {\r\n const exists = nodeTargets.some((node) => node.id === nodeId);\r\n if (!exists) setNodeId(\"\");\r\n }\r\n }, [scope, nodeId, nodeTargets]);\r\n\r\n function handleContinue() {\r\n if (activeServiceId === undefined || activeServiceId === null) return;\r\n\r\n if (scope === \"global\") {\r\n onSelect(\r\n {\r\n scope: \"global\",\r\n primary: activeServiceId,\r\n },\r\n activeServiceId,\r\n );\r\n return;\r\n }\r\n\r\n if (!nodeId) return;\r\n\r\n const node = nodeTargets.find((n) => n.id === nodeId);\r\n onSelect(\r\n {\r\n scope: \"node\",\r\n nodeId,\r\n },\r\n node?.serviceId ?? activeServiceId,\r\n );\r\n }\r\n\r\n if (!open) return null;\r\n\r\n const nodeScopeDisabled = nodeTargets.length === 0;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\r\n <div className=\"w-full max-w-lg rounded-2xl border border-zinc-200 bg-white shadow-2xl dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h3 className=\"text-base font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Add registration\r\n </h3>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Choose the registration scope before selecting fallback\r\n candidates.\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-4 p-4\">\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Scope\r\n </div>\r\n\r\n <div className=\"grid gap-2\">\r\n {!hasGlobal && (\r\n <label className=\"flex cursor-pointer items-start gap-3 rounded-xl border border-zinc-200 p-3 dark:border-zinc-800\">\r\n <input\r\n type=\"radio\"\r\n name=\"scope\"\r\n checked={scope === \"global\"}\r\n onChange={() => setScope(\"global\")}\r\n className=\"mt-1 h-4 w-4\"\r\n />\r\n <div>\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Global\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Use one global registration for this\r\n primary service.\r\n </div>\r\n </div>\r\n </label>\r\n )}\r\n\r\n <label\r\n className={[\r\n \"flex items-start gap-3 rounded-xl border p-3\",\r\n nodeScopeDisabled\r\n ? \"cursor-not-allowed border-zinc-200 opacity-60 dark:border-zinc-800\"\r\n : \"cursor-pointer border-zinc-200 dark:border-zinc-800\",\r\n ].join(\" \")}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"scope\"\r\n checked={scope === \"node\"}\r\n onChange={() => setScope(\"node\")}\r\n disabled={nodeScopeDisabled}\r\n className=\"mt-1 h-4 w-4\"\r\n />\r\n <div>\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Node\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {mode === \"snapshot\"\r\n ? \"Pick a node currently active in the order snapshot for this primary service.\"\r\n : mode === \"props\"\r\n ? \"Pick a tag, field, or option from ServiceProps that maps to this primary service.\"\r\n : \"Node-scoped registration is unavailable without OrderSnapshot or ServiceProps.\"}\r\n </div>\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {scope === \"node\" && (\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Node id\r\n </div>\r\n <select\r\n value={nodeId}\r\n onChange={(e) => setNodeId(e.target.value)}\r\n className=\"w-full rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n >\r\n <option value=\"\">Select node…</option>\r\n {nodeTargets.map((node) => (\r\n <option key={node.id} value={node.id}>\r\n [{node.kind}] {node.label} · #\r\n {String(node.serviceId)}\r\n </option>\r\n ))}\r\n </select>\r\n\r\n {nodeScopeDisabled ? (\r\n <div className=\"text-xs text-zinc-500 dark:text-zinc-400\">\r\n {mode === \"snapshot\"\r\n ? \"No active snapshot nodes were found for this primary service.\"\r\n : mode === \"props\"\r\n ? \"No ServiceProps nodes were found for this primary service.\"\r\n : \"Node-scoped registration requires either OrderSnapshot or ServiceProps.\"}\r\n </div>\r\n ) : null}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center justify-end gap-2 border-t border-zinc-200 p-4 dark:border-zinc-800\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleContinue}\r\n disabled={\r\n activeServiceId === undefined ||\r\n (scope === \"node\" && !nodeId)\r\n }\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction resolveNodeMeta(\r\n props: ServiceProps | undefined,\r\n nodeId: string,\r\n): { kind: \"tag\" | \"field\" | \"option\" | \"node\"; label: string } {\r\n if (!props) {\r\n return { kind: \"node\", label: nodeId };\r\n }\r\n\r\n const tag = props.filters?.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return {\r\n kind: \"tag\",\r\n label: tag.label ?? (tag as { title?: string }).title ?? tag.id,\r\n };\r\n }\r\n\r\n const field = props.fields?.find((f) => f.id === nodeId);\r\n if (field) {\r\n return {\r\n kind: \"field\",\r\n label:\r\n field.label ?? (field as { title?: string }).title ?? field.id,\r\n };\r\n }\r\n\r\n for (const fieldItem of props.fields ?? []) {\r\n const option = fieldItem.options?.find((o) => o.id === nodeId);\r\n if (option) {\r\n return {\r\n kind: \"option\",\r\n label:\r\n option.label ??\r\n (option as { title?: string }).title ??\r\n String((option as { value?: unknown }).value ?? option.id),\r\n };\r\n }\r\n }\r\n\r\n return { kind: \"node\", label: nodeId };\r\n}\r\n"],"mappings":";AAGO,IAAM,WAAN,MAAmC;AAAA,EAAnC;AACH,SAAQ,YAAY,oBAAI,IAAoC;AAAA;AAAA,EAE5D,GAAsB,OAAU,SAA8C;AANlF;AAOQ,UAAM,OAAM,UAAK,UAAU,IAAI,KAAK,MAAxB,YAA6B,oBAAI,IAAI;AACjD,QAAI,IAAI,OAAc;AACtB,SAAK,UAAU,IAAI,OAAO,GAAG;AAC7B,WAAO,MAAM;AACT,UAAI,OAAO,OAAc;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEA,KAAwB,OAAU,SAA8C;AAC5E,UAAM,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM;AAC9B,UAAI;AACJ,cAAQ,CAAC;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,KAAwB,OAAU,SAAqB;AACnD,UAAM,MAAM,KAAK,UAAU,IAAI,KAAK;AACpC,QAAI,CAAC,OAAO,IAAI,SAAS,EAAG;AAC5B,eAAW,KAAK,MAAM,KAAK,GAAG,EAAG,KAAI;AACjC,MAAC,EAAU,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACJ;AAAA,EAEA,QAAc;AACV,SAAK,UAAU,MAAM;AAAA,EACzB;AACJ;;;ACbO,IAAM,aAAN,MAAiB;AAAA,EAKpB,YAAY,OAAqB,CAAC,GAAG;AAHrC,SAAQ,OAAO,oBAAI,IAAkF;AACrG,SAAQ,SAAS;AAzBrB;AA4BQ,SAAK,OAAO;AAAA,MACR,UAAS,UAAK,YAAL,YAAgB;AAAA,MACzB,cAAa,UAAK,gBAAL,YAAoB;AAAA,MACjC,cAAa,UAAK,gBAAL,YAAoB;AAAA,MACjC,aAAY,UAAK,eAAL,YAAmB;AAAA,MAC/B,SAAQ,UAAK,WAAL,YAAe;AAAA,MACvB,iBAAgB,UAAK,mBAAL,YAAuB;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEA,QAAQ;AACJ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,SAAS;AACL,SAAK,SAAS;AACd,SAAK,MAAM;AAAA,EACf;AAAA;AAAA,EAGA,QAAQ,KAAwB;AAhDpC;AAiDQ,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAC/B,QAAI,KAAK,KAAK,IAAI,IAAI,EAAE,EAAG,QAAO;AAClC,SAAK,KAAK,IAAI,IAAI,IAAI,EAAC,KAAK,SAAS,EAAC,CAAC;AACvC,cAAI,aAAJ,6BAAe,aAAa,EAAC,SAAS,EAAC;AACvC,SAAK,KAAK,IAAI,EAAE;AAChB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,IAAqB;AAC5B,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,QAAI,QAAQ;AACZ,SAAK,KAAK,IAAI,IAAI;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,IAAqB;AAnEhC;AAoEQ,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,QAAI,YAAY;AAChB,oBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,IAAI,QAAO;AACrD,SAAK,KAAK,OAAO,EAAE;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,aAAuB;AACnB,WAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,OAAe;AACX,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,SAAS,IAAqB;AAC1B,WAAO,KAAK,KAAK,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,QAAc;AAzFlB;AA0FQ,eAAW,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,UAAI,YAAY;AAChB,sBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,IAAI,QAAO;AACrD,WAAK,KAAK,OAAO,EAAE;AAAA,IACvB;AAAA,EACJ;AAAA,EAEQ,QAAQ;AACZ,eAAW,MAAM,KAAK,KAAK,KAAK,EAAG,MAAK,KAAK,EAAE;AAAA,EACnD;AAAA,EAEQ,SAAS,SAAyB;AACtC,UAAM,EAAC,aAAa,YAAY,OAAM,IAAI,KAAK;AAC/C,UAAM,MAAM,KAAK,IAAI,YAAY,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;AACpF,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,KAAK,OAAO,IAAI,MAAM;AAChC,WAAO,KAAK,IAAI,YAAY,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EACnD;AAAA,EAEA,MAAc,KAAK,IAAY,YAAY,OAAO;AA9GtD;AA+GQ,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,OAAO,IAAI,UAAW;AAE3B,QAAI,KAAK,UAAU,CAAC,UAAW;AAE/B,UAAM,UAAU,IAAI,UAAU;AAC9B,UAAM,MAAM,YAAY;AArHhC,UAAAA,KAAAC,KAAA;AAsHY,UAAI,IAAI,UAAW;AACnB,OAAAA,OAAAD,MAAA,IAAI,KAAI,aAAR,gBAAAC,IAAA,KAAAD,KAAmB,YAAY,EAAC,QAAO;AACvC,UAAI;AACA,cAAM,KAAK,MAAM,IAAI,IAAI,QAAQ,OAAO;AACxC,YAAI,IAAI;AACJ,0BAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,QAAO;AACxC,eAAK,KAAK,OAAO,EAAE;AACnB;AAAA,QACJ;AAAA,MACJ,SAAS,KAAK;AAEV,wBAAI,KAAI,aAAR,4BAAmB,UAAU,EAAC,SAAS,OAAO,IAAG;AAAA,MACrD;AAEA,UAAI,WAAW,KAAK,KAAK,aAAa;AAClC,wBAAI,KAAI,aAAR,4BAAmB,UAAU,EAAC,QAAO;AACrC,aAAK,KAAK,OAAO,EAAE;AACnB;AAAA,MACJ;AAEA,UAAI,UAAU;AACd,YAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,sBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,aAAa,MAAK;AAC5D,UAAI,QAAQ,WAAW,MAAM,KAAK,KAAK,EAAE,GAAG,KAAK;AAAA,IACrD;AAEA,QAAI,UAAW,OAAM,IAAI;AAAA,SACpB;AAED,YAAM,QAAQ,KAAK,KAAK,kBAAkB,YAAY,IAAI,IAAI,KAAK,SAAS,OAAO;AAEnF,UAAI,OAAO;AACP,wBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,GAAG,aAAa,MAAK;AAC/D,YAAI,QAAQ,WAAW,KAAK,KAAK;AAAA,MACrC,OAAO;AACH,aAAK,IAAI;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACzIA,IAAI,QAAQ;AACZ,IAAM,aAAa,CAAC,IAAI,UACpB,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,CAAC;AAWtD,IAAM,cAAN,MAAkB;AAAA,EAMrB,YAAY,KAA6B,OAAqB,CAAC,GAAG;AALlE,SAAQ,UAAU,oBAAI,IAA0B;AAM5C,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,QAAQ,IAAI,WAAW,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEQ,QAAkC;AA7C9C;AA8CQ,YAAO,gBAAK,MAAK,aAAV;AAAA,EACX;AAAA,EAEQ,SACJ,IACA,UACA,WACA,QACA,MAKI;AACJ,SAAK,IAAI,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,IAChB,CAAC;AAAA,EACL;AAAA;AAAA,EAIA,MAAM,UAAyB;AAC3B,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,CAAC,MAAO;AAEZ,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,YAAY,KAAK;AAErD,QAAI,CAAC,IAAI,IAAI;AACT,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,SAAS,IAAI,MAAM;AAAA,QACnB,MAAM,IAAI,MAAM;AAAA,QAChB,MAAM,IAAI,MAAM;AAAA,MACpB,CAAC;AACD;AAAA,IACJ;AAEA,SAAK,QAAQ,MAAM;AACnB,eAAW,MAAM,IAAI,OAAO;AACxB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAsB,OAAO,SAAS,CAAC;AAAA,IACzE;AAGA,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,OAAiB,CAAC;AAAA,EACvE;AAAA;AAAA,EAIA,OAAwB;AACpB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EACxC,IAAI,CAAC,MAAM,CAAkB;AAAA,EACtC;AAAA,EAEA,IAAI,IAAyC;AACzC,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC9B;AAAA;AAAA,EAIA,MAAM,OACF,QACA,aACA,MACiB;AArHzB;AAsHQ,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAU,WAAW,GAAG;AAC9B,UAAM,QAAQ,WAAW,GAAG;AAE5B,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAE5D,UAAM,QAAoB;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,UAAU,CAAC,EAAE,IAAI,OAAO,MAAM,aAAa,WAAW,IAAI,CAAC;AAAA,MAC3D;AAAA,MACA,OAAO,aAAa,YAAY;AAAA,IACpC;AAEA,SAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,MAAa,CAAC;AAE/D,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAE/B,UAAM,cAAc,YAA+B;AAC/C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,aAAa,OAAO;AAAA,QACrD;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAGvB,WAAK,QAAQ,OAAO,OAAO;AAE3B,YAAM,WAAuB;AAAA,QACzB,GAAI,IAAI;AAAA,QACR,OAAO;AAAA,MACX;AAEA,WAAK,QAAQ,IAAI,SAAS,IAAI,QAAQ;AACtC,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,SAAgB,CAAC;AAElE,aAAO,SAAS;AAAA,IACpB;AAEA,QAAI;AACA,YAAM,WAAW,MAAM,YAAY;AACnC,aAAO;AAAA,IACX,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,0BAA0B,SAAS,IAAI,OAAO;AAE5D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,YAAM,QAAQ;AACd,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,MAAa,CAAC;AAE/D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,MACF,UACA,MACA,MACkB;AAlN1B;AAmNQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,WAAW,GAAG;AAE/B,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAE5D,UAAM,WAA2B;AAAA,MAC7B,IAAI;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACJ;AAEA,OAAG,SAAS,KAAK,QAAQ;AACzB,OAAG,YAAY;AACf,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,0BAA0B;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,IACb,CAAC;AACD,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAE/B,UAAM,cAAc,YAAgC;AAChD,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,WAAW,OAAO;AAAA,QACnD,UAAU,GAAG;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,YAAM,YAAY,IAAI;AACtB,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC1D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI;AAEjC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,aAAO,UAAU;AAAA,IACrB;AAEA,QAAI;AACA,YAAM,YAAY,MAAM,YAAY;AACpC,aAAO;AAAA,IACX,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,wBAAwB,SAAS,IAAI,QAAQ,IAAI,QAAQ;AAEvE,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,YACF,UACA,WACA,MACa;AA9SrB;AA+SQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACvD,QAAI,CAAC,KAAM;AAEX,UAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,SAAK,OAAO;AACZ,SAAK,WAAW,KAAK,IAAI;AACzB,OAAG,YAAY,KAAK;AAEpB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,YAAY,OAAO;AAAA,QACpD,UAAU,GAAG;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI,IAAI;AAErC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,yBAAyB,SAAS,IAAI,QAAQ,IAAI,SAAS;AAEzE,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI;AAEjC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,cACF,UACA,WACa;AA7XrB;AA8XQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,SAAS,CAAC,GAAG,GAAG,QAAQ;AAE9B,OAAG,WAAW,GAAG,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAC1D,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,cAAc,OAAO;AAAA,QACtD,UAAU,GAAG;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,2BAA2B,SAAS,IAAI,QAAQ,IAAI,SAAS;AAE3E,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,WAAW;AACd,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,KAAK,UAAoB,QAAsC;AAhczE;AAicQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG;AAEhB,OAAG,SAAS;AACZ,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,gBAAgB,EAAE,QAAQ,GAAU,CAAC;AACnD,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,WAAW,OAAO;AAAA,QACnD,UAAU,GAAG;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAI,OAAyB,OAAO,SAAS,CAAC;AAC5E,WAAK,IAAI,KAAK,yBAAyB;AAAA,QACnC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACrC,CAAC;AAAA,IACL;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,wBAAwB,SAAS,IAAI,QAAQ;AAE3D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,SAAS;AACZ,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,UAAoB,QAAQ,MAAqB;AAtgBnE;AAugBQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG;AAEhB,OAAG,WAAW;AACd,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,mBAAmB,EAAE,QAAQ,IAAW,UAAU,MAAM,CAAC;AACvE,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,cAAc,OAAO;AAAA,QACtD,UAAU,GAAG;AAAA,QACb,UAAU;AAAA,MACd,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAI,OAAyB,OAAO,SAAS,CAAC;AAC5E,WAAK,IAAI,KAAK,yBAAyB;AAAA,QACnC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACrC,CAAC;AAAA,IACL;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,2BAA2B,SAAS,IAAI,QAAQ;AAE9D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,WAAW;AACd,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,aAAa,UAAmC;AA5kB1D;AA6kBQ,UAAM,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACtC,QAAI,CAAC,KAAM;AAEX,SAAK,QAAQ,OAAO,QAAQ;AAC5B,SAAK,IAAI,KAAK,yBAAyB,EAAE,SAAS,CAAC;AAEnD,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,aAAa,OAAO,EAAE,SAAS,CAAC;AACrE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAAA,IAC3B;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,0BAA0B,SAAS,IAAI,QAAQ;AAE7D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAGD,WAAK,QAAQ,IAAI,UAAU,IAAI;AAC/B,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,KAAY,CAAC;AAAA,IAClE;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,OAAwB;AAC7B,WAAO,KAAK,MAAM,WAAW,KAAK;AAAA,EACtC;AAAA,EAEA,UAAU,OAAwB;AAC9B,WAAO,KAAK,MAAM,OAAO,KAAK;AAAA,EAClC;AAAA,EAEA,cAAwB;AACpB,WAAO,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA;AAAA,EAGQ,OAAO,UAAgC;AAC3C,UAAM,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACpC,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAChE,WAAO;AAAA,EACX;AACJ;;;ACtpBA,SAAS,aAAAE,kBAAiB;;;ACE1B,SAAS,iBAAiB;AAmBnB,SAAS,UACZ,OACA,OAAyB,CAAC,GACd;AAxBhB;AAyBI,QAAM,WAAuB,UAAK,uBAAL,YAA2B;AACxD,QAAM,eAAc,UAAK,gBAAL,YAAoB,CAAC,UAAU,UAAU,UAAU;AACvE,QAAM,MAAM,SAAS,KAAK;AAG1B,QAAM,aAAa,MAAM,QAAS,IAAY,OAAO,IAC9C,IAAY,UACb,CAAC;AACP,QAAM,YAAY,MAAM,QAAS,IAAY,MAAM,IAC5C,IAAY,SACb,CAAC;AAEP,QAAM,uBAAuB;AAAA,IACxB,IAAY;AAAA,EACjB;AACA,QAAM,uBAAuB;AAAA,IACxB,IAAY;AAAA,EACjB;AACA,QAAM,UAAU,cAAe,IAAY,OAAO;AAGlD,MAAI,UAAiB,WAAW,IAAI,CAAC,MAAW,UAAU,GAAG,WAAW,CAAC;AACzE,QAAM,SAAkB,UAAU,IAAI,CAAC,MAAW,YAAY,GAAG,OAAO,CAAC;AAGzE,MAAI,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,GAAG;AACzC,cAAU,CAAC,EAAE,IAAI,UAAU,OAAO,OAAO,GAAG,GAAG,OAAO;AAAA,EAC1D;AAGA,QAAM,YAAY,gBAAiB,IAAY,SAAS;AAExD,QAAM,MAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,gBAAiB,IAAY;AAAA,IAC7B,GAAI,WAAW,oBAAoB,KAAK,EAAE,qBAAqB;AAAA,IAC/D,GAAI,WAAW,oBAAoB,KAAK,EAAE,qBAAqB;AAAA,IAC/D,GAAI,cACC,WAAW,UAAU,KAAK,KAAK,WAAW,UAAU,MAAM,MAAM;AAAA,MAC7D;AAAA,IACJ;AAAA,IACJ,GAAI,QAAQ,SAAS,KAAK,EAAE,QAAQ;AAAA,IACpC,gBACI,OAAQ,IAAY,mBAAmB,WAChC,IAAY,iBACb;AAAA,EACd;AAEA,uBAAqB,KAAK,WAAW;AACrC,SAAO;AACX;AAcA,SAAS,qBAAqB,OAAqB,UAA0B;AACzE,QAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAC7D,MAAI,CAAC,KAAK,OAAQ;AAElB,QAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,QAAM,WAAW,oBAAI,IAAmB;AAExC,aAAW,KAAK,MAAM;AAClB,UAAM,MAAM,EAAE;AACd,QAAI,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,EAAG;AAC5B,QAAI,CAAC,SAAS,IAAI,GAAG,EAAG,UAAS,IAAI,KAAK,CAAC,CAAC;AAC5C,aAAS,IAAI,GAAG,EAAG,KAAK,CAAC;AAAA,EAC7B;AAEA,QAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC;AACnE,QAAM,SAAS,MAAM,SAAS,QAAQ;AAGtC,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,QAAQ,CAAC,KAAU,cAAyB;AA9GtD;AA+GQ,QAAI,QAAQ,IAAI,IAAI,EAAE,EAAG;AACzB,YAAQ,IAAI,IAAI,EAAE;AAKlB,UAAM,QAAQ,WAAU,SAAI,gBAAJ,YAAmB,CAAC,CAAC;AAC7C,QAAI,IAAI,uBAAuB;AAC3B,iBAAW,CAAC,GAAG,IAAI,KAAK,OAAO,QAAQ,IAAI,qBAAqB,GAAG;AAC/D,YAAI,KAAM,OAAM,CAAC,IAAI,KAAK;AAAA,MAC9B;AAAA,IACJ;AAEA,UAAM,OAAyC,CAAC;AAChD,UAAM,SAA0C,CAAC;AACjD,UAAM,YAAuD,CAAC;AAE9D,eAAW,KAAK,UAAU;AACtB,YAAM,MAAM,UAAU,CAAC;AACvB,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,KAAK;AACL,YAAI,SAAS,UAAa,SAAS,IAAI,KAAK;AACxC,eAAK,CAAC,IAAI,IAAI;AACd,iBAAO,CAAC,IAAI,IAAI;AAAA,QACpB,OAAO;AACH,eAAK,CAAC,IAAI,IAAI;AACd,iBAAO,CAAC,IAAI,IAAI;AAChB,oBAAU,CAAC,IAAI;AAAA,YACX,MAAM;AAAA,YACN,IAAI,IAAI;AAAA,YACR,QAAQ,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ,WAAW,SAAS,QAAW;AAC3B,aAAK,CAAC,IAAI;AACV,eAAO,CAAC,IAAI,IAAI;AAAA,MACpB;AAAA,IACJ;AAEA,QAAI,cAAc,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO;AACpD,QAAI,qBAAqB,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAC/D,QAAI,wBAAwB,OAAO,KAAK,SAAS,EAAE,SAAS,YAAY;AAExE,UAAM,WAAsB,EAAE,GAAG,UAAU;AAC3C,eAAW,KAAK,UAAU;AACtB,UAAI,KAAK,CAAC,MAAM,UAAa,OAAO,CAAC,MAAM,QAAW;AAClD,iBAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,GAAc,QAAQ,OAAO,CAAC,EAAG;AAAA,MAChE;AAAA,IACJ;AACA,eAAW,MAAK,cAAS,IAAI,IAAI,EAAE,MAAnB,YAAwB,CAAC,EAAG,OAAM,GAAG,QAAQ;AAAA,EACjE;AAEA,aAAW,KAAK,OAAQ,OAAM,GAAG,CAAC,CAAC;AACvC;AAIA,SAAS,UAAU,KAAU,UAAyB;AAClD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAC5C,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,UAAU,IAAI,IAAI,OAAO,MAAM,MAAM,WAAW,SAAY;AAClE,QAAM,aAAa,uBAAuB,IAAI,UAAU;AAExD,QAAM,WAAW,cAAc,IAAI,QAAQ;AAC3C,QAAM,WAAW,cAAc,IAAI,QAAQ;AAE3C,MAAI,cAAmD;AACvD,MAAI,IAAI,eAAe,OAAO,IAAI,gBAAgB,UAAU;AACxD,kBAAc,CAAC;AACf,eAAW,KAAK,UAAU;AACtB,YAAM,IAAK,IAAI,YAAoB,CAAC;AACpC,UAAI,MAAM,QAAW;AACjB,oBAAY,CAAC,IAAI,KAAK,CAAC;AAAA,MAC3B;AAAA,IACJ;AACA,QAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACvC,oBAAc;AAAA,IAClB;AAAA,EACJ;AAEA,QAAM,wBACF,IAAI,yBAAyB,OAAO,IAAI,0BAA0B,WAC3D,IAAI,wBACL;AAEV,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WACzB,IAAI,OACL;AAEV,QAAM,MAAW;AAAA,IACb,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAI,MAAM,EAAE,GAAG;AAAA,IACf,GAAI,SAAS,EAAE,MAAM;AAAA,IACrB,GAAI,WAAW,EAAE,QAAQ;AAAA,IACzB,GAAI,eAAe,UAAa,EAAE,WAAW;AAAA,IAC7C,GAAI,eAAe,EAAE,YAAY;AAAA,IACjC,GAAI,yBAAyB,EAAE,sBAAsB;AAAA,IACrD,GAAI,SAAS,UAAU,EAAE,UAAU,OAAO,QAAQ,EAAE;AAAA,IACpD,GAAI,SAAS,UAAU,EAAE,UAAU,OAAO,QAAQ,EAAE;AAAA,IACpD,GAAI,QAAQ,EAAE,KAAK;AAAA,EACvB;AACA,SAAO;AACX;AACA,SAAS,YAAY,KAAU,SAA6B;AACxD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAE5C,QAAM,UAAU,gBAAgB,IAAI,OAAO;AAC3C,QAAM,OAAO,IAAI,IAAI,IAAI,KAAK;AAC9B,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAGvD,QAAM,QAAQ,IAAI,IAAI,KAAK,KAAK;AAChC,QAAM,WAAW,CAAC,CAAC,IAAI;AAGvB,QAAM,KACF,IAAI,MAAM,OAAO,IAAI,OAAO,WACrB,IAAI,KACL;AACV,QAAM,WACF,IAAI,YAAY,OAAO,IAAI,aAAa,WACjC,IAAI,WACL;AAGV,QAAM,eACF,IAAI,iBAAiB,aAAa,IAAI,iBAAiB,SACjD,IAAI,eACJ;AAGV,QAAM,gBAAgB,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,SAAS;AACzE,QAAM,UAAU,gBACT,IAAI,QAAkB,IAAI,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,IAC/D;AAGN,QAAM,YACF,SAAS,WAAW,IAAI,IAAI,SAAS,KAAK,SAAY;AAG1D,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WAC1B,EAAE,GAAI,IAAI,KAAa,IACvB;AAKV,QAAM,SAAkB,gBAAgB,OAAO,IAAI,WAAW;AAC9D,QAAM,aAAa,yBAAyB,IAAI,UAAU;AAG1D,QAAM,uBAAuB,uBAAuB,IAAI,UAAU;AAClE,QAAM,mBACF,UACA,iBAAiB,aACjB,yBAAyB,SACnB,uBACA;AAEV,QAAM,QAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,WAAW,QAAQ,UAAU,EAAE,QAAQ;AAAA,IAC3C,GAAI,aAAa,EAAE,UAAU;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,MAAM,EAAE,GAAc;AAAA,IAC1B,GAAI,YAAY,EAAE,SAAS;AAAA,IAC3B,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,cAAc,EAAE,WAAW;AAAA,IAC/B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,GAAI,qBAAqB,UAAa,EAAE,YAAY,iBAAiB;AAAA,EACzE;AAEA,SAAO;AACX;AAEA,SAAS,aAAa,KAAU,aAAuC;AACnE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAC5C,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,aAAa,uBAAuB,IAAI,UAAU;AACxD,QAAM,QACF,OAAO,IAAI,UAAU,YAAY,OAAO,IAAI,UAAU,WAC/C,IAAI,QACL;AAEV,QAAM,eACF,IAAI,iBAAiB,aAAa,IAAI,iBAAiB,SACjD,IAAI,eACJ;AAEV,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WACzB,IAAI,OACL;AAEV,QAAM,SAAsB;AAAA,IACxB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAI,MAAM,EAAE,GAAG;AAAA,IACf,GAAI,SAAS,EAAE,MAAM;AAAA,IACrB,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,IACnC,GAAI,eAAe,UAAa,EAAE,WAAW;AAAA,IAC7C;AAAA,IACA,GAAI,QAAQ,EAAE,KAAK;AAAA,EACvB;AACA,SAAO;AACX;AAIA,SAAS,gBAAgB,KAAuC;AAC5D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,QAAM,MAAuB,CAAC;AAC9B,QAAM,IAAK,IAAY;AACvB,QAAM,IAAK,IAAY;AAEvB,MAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,UAAM,KAAqC,CAAC;AAC5C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,CAAC,GAAG;AACpC,YAAM,MAAM,OAAO,CAAC;AACpB,YAAM,MAAM,iBAAiB,CAAC;AAC9B,YAAM,QAAQ,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC;AACzD,UAAI,MAAM,OAAQ,IAAG,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,OAAO,KAAK,EAAE,EAAE,OAAQ,KAAI,SAAS;AAAA,EAC7C;AAEA,MAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,UAAM,KAAqC,CAAC;AAC5C,eAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,GAAG;AACzC,YAAM,MAAM,OAAO,MAAM;AACzB,YAAM,MAAM,iBAAiB,CAAC;AAC9B,YAAM,QAAQ,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC;AACzD,UAAI,MAAM,OAAQ,IAAG,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,OAAO,KAAK,EAAE,EAAE,OAAQ,KAAI,QAAQ;AAAA,EAC5C;AAEA,SAAO,IAAI,SAAS,IAAI,SAAS,MAAM;AAC3C;AAIA,SAAS,SAAS,OAAyC;AACvD,MAAI,SAAS,OAAO,UAAU;AAC1B,WAAO;AACX,QAAM,IAAI,UAAU,yCAAyC;AACjE;AAEA,SAAS,gBAAgB,MAA8C;AACnE,MAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAG,QAAO,KAAK,KAAK;AAC9D,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,UAAM,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AACpE,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAI,IAAI,WAAW,EAAG,QAAO,IAAI,CAAC;AAClC,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,iBAAiB,KAAgD;AACtE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAgC,CAAC;AACvC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACtC,QAAI,CAAC,EAAG;AACR,UAAM,MAAM,cAAc,CAAC;AAC3B,QAAI,IAAI,OAAQ,KAAI,CAAC,IAAI,OAAO,GAAG;AAAA,EACvC;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,MAAM;AAC3C;AAEA,SAAS,cAAc,GAAkB;AACrC,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC/B,SAAO,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;AAC3E;AAEA,SAAS,cAAc,GAA8B;AACjD,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC/B,SAAO,EACF,OAAO,CAAC,SAAS,QAAQ,OAAO,SAAS,QAAQ,EACjD,IAAI,CAAC,SAAS,UAAU,IAA0B,CAAC;AAC5D;AAEA,SAAS,uBAAuB,GAAkC;AAC9D,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,MAAI,OAAO,MAAM,UAAU;AACvB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EACpC;AACA,MAAI,OAAO,MAAM,UAAU;AACvB,UAAM,UAAU,EAAE,KAAK;AACvB,WAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EAC1C;AACA,SAAO;AACX;AAEA,SAAS,IAAI,GAA4B;AACrC,MAAI,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,EAAG,QAAO,EAAE,KAAK;AAChE,SAAO;AACX;AAEA,SAAS,KAAK,GAA6B;AACvC,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,CAAC,CAAC;AACb;AAEA,SAAS,OAAU,KAAe;AAC9B,SAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC;AAClC;AAEA,SAAS,WACL,KACqB;AACrB,SAAO,CAAC,CAAC,OAAO,OAAO,KAAK,GAAG,EAAE,SAAS;AAC9C;AAEA,SAAS,iBAAiB,GAAwB;AAC9C,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC/B,SAAO,EACF;AAAA,IAAI,CAAC,MACF,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAAA,EACjE,EACC;AAAA,IACG,CAAC,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM;AAAA,EAC3C;AACR;AAGA,SAAS,6BACL,OAC+B;AAC/B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AAEV,QAAM,KAAK,EAAE;AACb,MACI,OAAO,QACP,OAAO,SACP,OAAO,QACP,OAAO,SACP,OAAO,QACP,OAAO,SACP,OAAO,aACP,OAAO,QACP,OAAO,SACP,OAAO,YACP,OAAO,WACP,OAAO,SACT;AACE,WAAO;AAAA,EACX;AAEA,QAAM,UACF,EAAE,YAAY,WAAW,EAAE,YAAY,YAAY,EAAE,YAAY,SAC3D,EAAE,UACF;AAEV,QAAM,MAA2B;AAAA,IAC7B;AAAA,IACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EACjC;AAEA,MAAI,WAAW,EAAG,KAAI,QAAQ,EAAE;AAChC,MAAI,OAAO,EAAE,QAAQ,YAAY,OAAO,SAAS,EAAE,GAAG,EAAG,KAAI,MAAM,EAAE;AACrE,MAAI,OAAO,EAAE,QAAQ,YAAY,OAAO,SAAS,EAAE,GAAG,EAAG,KAAI,MAAM,EAAE;AACrE,MAAI,MAAM,QAAQ,EAAE,MAAM,EAAG,KAAI,SAAS,CAAC,GAAG,EAAE,MAAM;AACtD,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,KAAK,EAAG,KAAI,UAAU,EAAE;AACvE,MAAI,OAAO,EAAE,UAAU,SAAU,KAAI,QAAQ,EAAE;AAC/C,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,KAAK,EAAG,KAAI,UAAU,EAAE;AAEvE,MAAI,YAAY,UAAU,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,KAAK,GAAG;AACnE,QAAI,OAAO,EAAE;AAAA,EACjB;AAEA,SAAO;AACX;AAEO,SAAS,yBACZ,OACiC;AACjC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,UAAM,QAAQ,MACT,IAAI,4BAA4B,EAChC,OAAO,OAAO;AACnB,WAAO,MAAM,SAAS,QAAQ;AAAA,EAClC;AAEA,QAAM,MAAM,6BAA6B,KAAK;AAC9C,SAAO,MAAM,CAAC,GAAG,IAAI;AACzB;;;ACteO,SAAS,eAAe,GAAyB;AACpD,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AACrD;AAEO,SAAS,eAAe,GAAkD;AAC7E,SACK,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,KAC3C,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AAEnD;AAEO,SAAS,oBAAoB,GAAmB;AArCvD;AAsCI,WAAQ,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,eAAe,EAAE,UAAU,CAAC;AACrE;AAQO,SAAS,UAAU,KAAc,MAAmC;AACvE,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QAAkB,KAAK,MAAM,GAAG;AACtC,MAAI,MAAW;AAEf,aAAW,KAAK,OAAO;AACnB,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,IAAI,CAAC;AAAA,EACf;AAEA,SAAO;AACX;AAMO,SAAS,WAAW,GAAoB;AAC3C,MAAI;AACA,WAAO,KAAK,UAAU,CAAC;AAAA,EAC3B,QAAQ;AACJ,WAAO,OAAO,CAAC;AAAA,EACnB;AACJ;AAEO,SAAS,QAAQ,GAAY,GAAqB;AACrD,MAAI,OAAO,GAAG,GAAG,CAAC,EAAG,QAAO;AAC5B,SAAO,WAAW,CAAC,MAAM,WAAW,CAAC;AACzC;AAEO,SAAS,cACZ,KACA,QACO;AACP,aAAW,KAAK,KAAK;AACjB,QAAI,QAAQ,GAAG,MAAM,EAAG,QAAO;AAAA,EACnC;AACA,SAAO;AACX;AAEO,SAAS,aACZ,KACA,OACO;AA3FX;AA4FI,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AAEzC,QAAM,OAAgC,EAAE,SAAS,IAAI;AAErD,aAAW,UAAU,OAAO;AACxB,UAAM,OAAe,OAAO;AAC5B,UAAM,MAAa,YAAO,OAAP,YAAa;AAChC,UAAM,QAAiB,OAAO;AAE9B,UAAM,MAAe,UAAU,MAAM,IAAI;AAEzC,QAAI,OAAO,UAAU;AACjB,UAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C;AAAA,IACJ;AACA,QAAI,OAAO,UAAU;AACjB,UAAI,CAAC,IAAK,QAAO;AACjB;AAAA,IACJ;AACA,QAAI,OAAO,SAAS;AAChB,UAAI,IAAK,QAAO;AAChB;AAAA,IACJ;AAEA,QAAI,OAAO,QAAQ,OAAO,OAAO;AAC7B,YAAM,OAAkB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACxD,YAAM,MAAe,cAAc,MAAM,GAAG;AAC5C,UAAI,OAAO,QAAQ,CAAC,IAAK,QAAO;AAChC,UAAI,OAAO,SAAS,IAAK,QAAO;AAChC;AAAA,IACJ;AAEA,QAAI,OAAO,OAAO;AACd,UAAI,QAAQ,KAAK,KAAK,EAAG,QAAO;AAChC;AAAA,IACJ;AAEA,QAAI,OAAO,MAAM;AACb,YAAM,IAAY,OAAO,oBAAO,EAAE;AAClC,YAAM,SAAiB,OAAO,wBAAS,EAAE;AACzC,UAAI,CAAC,EAAE,WAAW,MAAM,EAAG,QAAO;AAClC;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,QAAO;AAAA,EACrC;AAEA,SAAO;AACX;AAEO,SAAS,iBACZ,KACA,QACmB;AACnB,QAAM,QAAkB,IAAY;AACpC,QAAM,QACF,SAAS,OAAO,UAAU,WAAY,MAAc,MAAM,IAAI;AAElE,QAAM,UACF,SAAS,OAAO,UAAU,WAAY,MAAc,UAAU;AAElE,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,YAAY,MAAO,QAAO;AAE9B,SAAO;AACX;AAEO,SAAS,qBACZ,KACA,QACO;AACP,SAAO,iBAAiB,KAAK,MAAM,MAAM;AAC7C;AAGO,SAAS,aACZ,SACA,KACmC;AACnC,MAAI,CAAC,OAAO,IAAI,UAAU,EAAG,QAAO;AACpC,SAAO,EAAE,GAAI,4BAAW,CAAC,GAAI,aAAa,IAAI;AAClD;;;ACvJO,SAAS,aAAa,OAA8B;AAvB3D;AAwBI,QAAM,MAAe,oBAAI,IAAI;AAE7B,aAAW,MAAK,WAAM,YAAN,YAAiB,CAAC,GAAG;AACjC,QAAI,CAAC,IAAI,IAAI,EAAE,EAAE,EAAG,KAAI,IAAI,EAAE,IAAI,EAAE,MAAM,OAAO,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;AAAA,EACxE;AAEA,aAAW,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG;AAChC,QAAI,CAAC,IAAI,IAAI,EAAE,EAAE,EAAG,KAAI,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;AAEtE,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,UAAI,CAAC,IAAI,IAAI,EAAE,EAAE;AACb,YAAI,IAAI,EAAE,IAAI;AAAA,UACV,MAAM;AAAA,UACN,IAAI,EAAE;AAAA,UACN,MAAM;AAAA,UACN,SAAS,EAAE;AAAA,QACf,CAAC;AAAA,IACT;AAAA,EACJ;AAEA,SAAO;AACX;AAoBO,SAAS,eACZ,SACA,SACsB;AAEtB,QAAM,MAAM,QAAQ,QAAQ,IAAI;AAChC,MAAI,QAAQ,IAAI;AACZ,UAAM,UAAU,QAAQ,MAAM,GAAG,GAAG;AACpC,UAAM,WAAW,QAAQ,MAAM,MAAM,CAAC;AACtC,WAAO,EAAE,MAAM,aAAa,YAAY,SAAS,SAAS,SAAS;AAAA,EACvE;AAGA,QAAM,SAAS,QAAQ,IAAI,OAAO;AAClC,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,SAAS,UAAU;AAC1B,WAAO;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,IACpB;AAAA,EACJ;AAEA,SAAO,EAAE,MAAM,OAAO,MAAM,YAAY,SAAS,IAAI,OAAO,GAAG;AACnE;;;AC/EO,SAAS,qBACZ,OACA,OACA,OAA0B,CAAC,GACnB;AAhBZ;AAiBI,QAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAEhC,QAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,QAAM,MAAM,QAAQ,IAAI,KAAK;AAC7B,MAAI,CAAC,IAAK,QAAO,CAAC;AAGlB,QAAM,UAAmB,aAAa,KAAK;AAG3C,QAAM,eAAe,oBAAI,IAAoB;AAC7C;AACI,UAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAI,MAAuB;AAC3B,QAAI,IAAI;AACR,WAAO,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG;AAC9B,mBAAa,IAAI,IAAI,IAAI,GAAG;AAC5B,YAAM,IAAI,IAAI,EAAE;AAChB,YAAM,WAA+B,IAAI;AACzC,YAAM,WAAW,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACJ;AAEA,QAAM,iBAAiB,CAAC,OAAe,aAAa,IAAI,EAAE;AAE1D,QAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEtD,QAAM,qBAAqB,CAAC,MAAiC;AACzD,UAAM,IAAI,EAAE;AACZ,QAAI,CAAC,EAAG,QAAO;AAEf,QAAI,OAAO,MAAM,SAAU,QAAO,aAAa,IAAI,CAAC;AAEpD,QAAI,OAA2B;AAC/B,eAAW,MAAM,GAAG;AAChB,YAAM,IAAI,aAAa,IAAI,EAAE;AAC7B,UAAI,KAAK,KAAM;AACf,UAAI,QAAQ,QAAQ,IAAI,KAAM,QAAO;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AAEA,QAAM,0BAA0B,CAC5B,eACqB;AACrB,UAAM,IAAI,eAAe,YAAY,OAAO;AAC5C,QAAI,CAAC,EAAG,QAAO;AAGf,QAAI,EAAE,SAAS,aAAa;AACxB,YAAM,IAAI,UAAU,IAAI,EAAE,OAAO;AACjC,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,mBAAmB,CAAC;AAAA,IAC/B;AAGA,QAAI,EAAE,SAAS,SAAS;AACpB,YAAM,IAAI,UAAU,IAAI,EAAE,EAAE;AAC5B,UAAI,CAAC,KAAK,EAAE,WAAW,KAAM,QAAO;AACpC,aAAO,mBAAmB,CAAC;AAAA,IAC/B;AAGA,QAAI,EAAE,SAAS,UAAU;AACrB,YAAM,IAAI,EAAE,UAAU,UAAU,IAAI,EAAE,OAAO,IAAI;AACjD,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,mBAAmB,CAAC;AAAA,IAC/B;AAGA,WAAO;AAAA,EACX;AAGA,QAAM,aAAa,IAAI,KAAI,SAAI,aAAJ,YAAgB,CAAC,CAAC;AAC7C,QAAM,aAAa,IAAI,KAAI,SAAI,aAAJ,YAAgB,CAAC,CAAC;AAG7C,QAAM,YAAW,UAAK,iBAAL,YAAqB,oBAAI,IAAY;AACtD,QAAM,UAAS,WAAM,yBAAN,YAA8B,CAAC;AAC9C,QAAM,UAAS,WAAM,yBAAN,YAA8B,CAAC;AAI9C,QAAM,0BAAoC,CAAC;AAC3C,aAAW,OAAO,UAAU;AACxB,UAAM,IAAI,wBAAwB,GAAG;AACrC,QAAI,KAAK,KAAM;AACf,4BAAwB,KAAK,GAAG;AAAA,EACpC;AAGA,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,mBAAmB,CAAC,MAAsB;AAC5C,UAAM,IAAI,EAAE;AACZ,QAAI,CAAC,EAAG,QAAO;AACf,QAAI,OAAO,MAAM,SAAU,QAAO,eAAe,CAAC;AAClD,eAAW,MAAM,EAAG,KAAI,eAAe,EAAE,EAAG,QAAO;AACnD,WAAO;AAAA,EACX;AAEA,aAAW,KAAK,QAAQ;AACpB,QAAI,iBAAiB,CAAC,EAAG,SAAQ,IAAI,EAAE,EAAE;AACzC,QAAI,WAAW,IAAI,EAAE,EAAE,EAAG,SAAQ,IAAI,EAAE,EAAE;AAAA,EAC9C;AAGA,aAAW,MAAM,WAAY,SAAQ,OAAO,EAAE;AAK9C,QAAM,SAAS,oBAAI,IAA4B;AAE/C,QAAM,gBAAgB,CAAC,SAAiB,SAAyB;AAC7D,UAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,QAAI,CAAC,KAAM,QAAO,KAAK,OAAO,IAAI,SAAS,IAAI;AAE/C,QAAI,KAAK,QAAQ,KAAK,MAAO,QAAO,KAAK,OAAO,IAAI,SAAS,IAAI;AACjE,QAAI,KAAK,QAAQ,KAAK,MAAO;AAE7B,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS,WAAW;AACpD,aAAO,IAAI,SAAS,IAAI;AAAA,IAC5B;AAAA,EACJ;AAGA,QAAM,gBAA0B,CAAC;AACjC,QAAM,eAAe,oBAAI,IAAY;AAErC,aAAW,cAAc,yBAAyB;AAC9C,UAAM,QAAQ,wBAAwB,UAAU;AAChD,QAAI,SAAS,KAAM;AAEnB,eAAW,OAAM,YAAO,UAAU,MAAjB,YAAsB,CAAC,GAAG;AACvC,oBAAc,IAAI,EAAE,OAAO,MAAM,UAAU,CAAC;AAE5C,UAAI,CAAC,aAAa,IAAI,EAAE,GAAG;AACvB,qBAAa,IAAI,EAAE;AACnB,sBAAc,KAAK,EAAE;AAAA,MACzB;AAAA,IACJ;AAEA,eAAW,OAAM,YAAO,UAAU,MAAjB,YAAsB,CAAC,GAAG;AACvC,oBAAc,IAAI,EAAE,OAAO,MAAM,UAAU,CAAC;AAAA,IAChD;AAAA,EACJ;AAGA,aAAW,CAAC,KAAK,CAAC,KAAK,QAAQ;AAC3B,QAAI,EAAE,SAAS,UAAW,SAAQ,IAAI,GAAG;AAAA,QACpC,SAAQ,OAAO,GAAG;AAAA,EAC3B;AAGA,QAAM,OAAO,OAAO,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAGpE,QAAM,SAAQ,WAAM,mBAAN,mBAAuB;AACrC,MAAI,SAAS,MAAM,QAAQ;AACvB,UAAM,UAAU,MAAM,OAAO,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AACtD,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,UAAM,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;AACtD,WAAO,CAAC,GAAG,SAAS,GAAG,IAAI;AAAA,EAC/B;AAGA,SAAO;AACX;AAGO,SAAS,mBACZ,OACA,OACA,OAA0B,CAAC,GACpB;AAlMX;AAmMI,QAAM,MAAM,qBAAqB,OAAO,OAAO,IAAI;AACnD,QAAM,YAAY,IAAI,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpE,SAAO,IAAI,IAAI,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC,EAAE,OAAO,OAAO;AAC5D;;;AC1LO,SAAS,yBACZ,GAC0B;AAC1B,SAAO,CAAC,UAA2B;AAC/B,WAAO,mBAAmB,EAAE,OAAO,OAAO;AAAA,MACtC,cAAc,EAAE;AAAA,IACpB,CAAC;AAAA,EACL;AACJ;AAyCA,SAAS,qBAAqB,MAA2B;AACrD,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG;AAC3C;AAEA,SAAS,gBAAgB,MAAoB;AACzC,QAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAE,EAAU,OAAO;AACpD,SAAO,MAAM,SAAS,QAAQ,KAAK,MAAM,GAAG,CAAC;AACjD;AAEA,SAAS,mBAAmB,GAAkB,SAA0B;AAtExE;AAuEI,QAAM,OAAM,OAAE,MAAM,yBAAR,YAAgC,CAAC;AAC7C,QAAM,OAAM,OAAE,MAAM,yBAAR,YAAgC,CAAC;AAC7C,WAAQ,eAAI,OAAO,MAAX,mBAAc,WAAd,YAAwB,KAAK,OAAM,eAAI,OAAO,MAAX,mBAAc,WAAd,YAAwB,KAAK;AAC5E;AAEA,SAAS,mCACL,GACA,OACA,cACA,eACQ;AAjFZ;AAkFI,QAAM,UAAU,mBAAmB,EAAE,OAAO,OAAO;AAAA,IAC/C;AAAA,EACJ,CAAC;AAED,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,SAAS;AAErB,QAAK,EAAU,WAAW,MAAM;AAC5B,YAAM,IAAI,EAAE;AACZ,UAAI,CAAC,iBAAiB,mBAAmB,GAAG,CAAC,EAAG,UAAS,KAAK,CAAC;AAAA,IACnE;AAGA,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAM,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE;AAC1B,UAAI,CAAC,iBAAiB,mBAAmB,GAAG,CAAC,EAAG,UAAS,KAAK,CAAC;AAAA,IACnE;AAAA,EACJ;AAGA,WAAS,KAAK;AACd,SAAO;AACX;AAMA,SAAS,uBAAuB,GAAwB;AA/GxD;AAiHI,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,UAAmB,EAAE,mBAAmB,EAAE,EAAE;AAClD,UAAM,OAA4B,oBAAI,IAAoB;AAE1D,eAAW,KAAK,SAAS;AACrB,YAAM,UAAiB,OAAE,UAAF,YAAW,IAAI,KAAK;AAC3C,UAAI,CAAC,MAAO;AAEZ,UAAI,KAAK,IAAI,KAAK,GAAG;AACjB,cAAM,UAA8B,KAAK,IAAI,KAAK;AAElD,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,4BAA4B,KAAK,gBAAgB,EAAE,EAAE;AAAA,UAC9D,QAAQ,EAAE;AAAA,UACV,SAAS;AAAA,YACL,EAAE,OAAO,EAAE,IAAI,OAAO,SAAS,MAAM;AAAA,YACrC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAAA,UACjD;AAAA,QACJ,CAAC;AAAA,MACL,OAAO;AACH,aAAK,IAAI,OAAO,EAAE,EAAE;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,UAAmB,EAAE,mBAAmB,EAAE,EAAE;AAClD,UAAM,UAAoB,CAAC;AAE3B,eAAW,KAAK,SAAS;AACrB,YAAM,KAAc,OAAE,SAAF,mBAAgB;AACpC,UAAI,EAAG,SAAQ,KAAK,EAAE,EAAE;AAAA,IAC5B;AAEA,QAAI,QAAQ,SAAS,GAAG;AACpB,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,8CAA8C,EAAE,EAAE;AAAA,QAC3D,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,OAAO,EAAE,IAAI,QAAQ,GAAG;AAAA,UAC5C,EAAE;AAAA,UACF,GAAG;AAAA,QACP,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,UAAmB,EAAE,mBAAmB,EAAE,EAAE;AAElD,QAAI,UAAmB;AACvB,QAAI,aAAsB;AAC1B,UAAM,mBAA6B,CAAC;AAEpC,eAAW,KAAK,SAAS;AACrB,iBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAI,CAAC,eAAe,EAAE,UAAU,EAAG;AAEnC,cAAM,QACF,aAAE,iBAAF,YAAmB,EAAU,iBAA7B,YAA6C;AAEjD,YAAI,SAAS,OAAQ,WAAU;AAAA,iBACtB,SAAS,WAAW;AACzB,uBAAa;AACb,2BAAiB,KAAK,EAAE,EAAE;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,cAAc,CAAC,SAAS;AACxB,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,2CAA2C,EAAE,EAAE;AAAA,QACxD,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,OAAO,EAAE,IAAI,iBAAiB,GAAG;AAAA,UACrD,EAAE;AAAA,UACF,GAAG;AAAA,QACP,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAKA,SAAS,oBAAoB,GAAkB,YAA0B;AACrE,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,WAAW,CAAC,MAAW;AAhNjC;AAiNQ,UAAM,SAAQ,wCAAG,YAAH,mBAAY,UAAZ,aAAqB,kCAAG,YAAH,mBAAY,aAAZ,mBAAsB,UAA3C,YAAoD;AAClE,UAAM,SAAQ,kCAAG,YAAH,mBAAY,UAAZ,YAAqB;AACnC,WAAO,IAAG,4BAAG,SAAH,YAAW,EAAE,MAAK,4BAAG,WAAH,YAAa,EAAE,KAAK,KAAK,KAAK,KAAK,MAAK,4BAAG,YAAH,YAAc,EAAE;AAAA,EACxF;AAEA,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,YAAY,IAAI,EAAE,OAAO,QAAQ,KAAK;AAC/C,UAAM,IAAI,EAAE,OAAO,CAAC;AACpB,UAAM,IAAI,SAAS,CAAC;AACpB,QAAI,KAAK,IAAI,CAAC,EAAG;AACjB,SAAK,IAAI,CAAC;AACV,SAAK,KAAK,CAAC;AAAA,EACf;AAEA,IAAE,OAAO,OAAO,YAAY,EAAE,OAAO,SAAS,YAAY,GAAG,IAAI;AACrE;AAUO,SAAS,mBACZ,GACA,UAAqC,CAAC,GAClC;AA7OR;AA8OI,QAAM,WAAW,QAAQ,aAAa;AAEtC,MAAI,CAAC,UAAU;AACX,2BAAuB,CAAC;AACxB;AAAA,EACJ;AAEA,QAAM,YAAY,KAAK,IAAI,IAAG,aAAQ,cAAR,YAAqB,GAAG;AACtD,QAAM,WAAW,KAAK,IAAI,IAAG,aAAQ,aAAR,YAAoB,CAAC;AAClD,QAAM,gBAAgB,QAAQ,0BAA0B;AAExD,QAAM,QAAQ,gBAAgB,EAAE,IAAI;AACpC,QAAM,WAAW,QAAQ,mBAAmB,QAAQ,MAAM,MAAM,GAAG,CAAC;AAGpE,QAAM,mBAAmB,IAAI,KAAI,OAAE,iBAAF,YAAkB,CAAC,CAAC;AAGrD,QAAM,cAAc,EAAE,OAAO;AAG7B,QAAM,UAAU,oBAAI,IAAY;AAGhC,QAAM,QAAiB,CAAC;AAGxB,aAAW,MAAM,UAAU;AACvB,UAAM,KAAK;AAAA,MACP,WAAW,GAAG;AAAA,MACd,UAAU,IAAI,IAAI,gBAAgB;AAAA,MAClC,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,MAAI,kBAAkB;AAEtB,SAAO,MAAM,QAAQ;AACjB,QAAI,mBAAmB,UAAW;AAElC,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAM,MAAM,qBAAqB,MAAM,QAAQ;AAE/C,QAAI,QAAQ,IAAI,GAAG,EAAG;AACtB,YAAQ,IAAI,GAAG;AAGf,MAAE,eAAe,MAAM;AAGvB;AACA,2BAAuB,CAAC;AAGxB,QAAI,MAAM,SAAS,SAAU;AAG7B,UAAM,WAAW;AAAA,MACb;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACJ;AAGA,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,YAAM,OAAO,SAAS,CAAC;AACvB,UAAI,MAAM,SAAS,IAAI,IAAI,EAAG;AAE9B,YAAM,OAAO,IAAI,IAAI,MAAM,QAAQ;AACnC,WAAK,IAAI,IAAI;AAEb,YAAM,KAAK;AAAA,QACP,WAAW,MAAM;AAAA,QACjB,UAAU;AAAA,QACV,OAAO,MAAM,QAAQ;AAAA,MACzB,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,IAAE,eAAe;AAGjB,sBAAoB,GAAG,WAAW;AAKtC;;;AClUO,SAAS,kBAAkB,GAAwB;AACtD,QAAM,OAAO,EAAE;AACf,QAAM,SAAS,EAAE;AAGjB,MAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,GAAG;AACtC,MAAE,OAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AAGA,QAAM,WAAwB,oBAAI,IAAY;AAC9C,QAAM,UAAuB,oBAAI,IAAY;AAE7C,QAAM,eAAe,CAAC,OAAwB;AAtBlD;AAuBQ,QAAI,SAAS,IAAI,EAAE,EAAG,QAAO;AAC7B,QAAI,QAAQ,IAAI,EAAE,EAAG,QAAO;AAE5B,aAAS,IAAI,EAAE;AAEf,UAAM,UAA6B,OAAE,QAAQ,IAAI,EAAE,MAAhB,mBAAmB;AACtD,QAAI,UAAU,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,MAAM;AACtD,aAAO;AAEX,aAAS,OAAO,EAAE;AAClB,YAAQ,IAAI,EAAE;AACd,WAAO;AAAA,EACX;AAEA,aAAW,KAAK,MAAM;AAClB,QAAI,aAAa,EAAE,EAAE,GAAG;AACpB,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oDAAoD,EAAE,EAAE;AAAA,QACjE,QAAQ,EAAE;AAAA,QACV,SAAS,EAAE,OAAO,EAAE,GAAG;AAAA,MAC3B,CAAC;AACD;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,MAAM;AAClB,QAAI,EAAE,WAAW,CAAC,EAAE,QAAQ,IAAI,EAAE,OAAO,GAAG;AACxC,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,QAAQ,EAAE,EAAE,kCAAkC,EAAE,OAAO;AAAA,QAChE,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;AAAA,MACpD,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,aAAW,KAAK,QAAQ;AACpB,UAAM,IAAI,EAAE;AAEZ,QAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,iBAAW,MAAM,GAAG;AAChB,YAAI,CAAC,EAAE,QAAQ,IAAI,EAAE,GAAG;AACpB,YAAE,OAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,UAAU,EAAE,EAAE,2BAA2B,EAAE;AAAA,YACpD,QAAQ,EAAE;AAAA,YACV,SAAS,aAAa,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;AAAA,UAC7C,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ,WAAW,OAAO,MAAM,UAAU;AAC9B,UAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,GAAG;AACnB,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,UAAU,EAAE,EAAE,2BAA2B,CAAC;AAAA,UACnD,QAAQ,EAAE;AAAA,UACV,SAAS,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAAA,QAC5C,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,OAAK;AACT;;;ACzFO,SAAS,iBAAiB,GAAwB;AAJzD;AAKI,QAAM,OAAO,EAAE;AACf,QAAM,SAAS,EAAE;AAGjB;AACI,UAAM,YAAiC,oBAAI,IAAoB;AAC/D,UAAM,OAAoB,oBAAI,IAAY;AAE1C,eAAW,KAAK,MAAM;AAClB,UAAI,KAAK,IAAI,EAAE,EAAE,GAAG;AAChB,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,iBAAiB,EAAE,EAAE;AAAA,UAC9B,QAAQ,EAAE;AAAA;AAAA,QAEd,CAAC;AAAA,MACL,OAAO;AACH,aAAK,IAAI,EAAE,EAAE;AACb,kBAAU,IAAI,EAAE,IAAI,KAAK;AAAA,MAC7B;AAAA,IACJ;AAEA,eAAW,KAAK,QAAQ;AACpB,UAAI,KAAK,IAAI,EAAE,EAAE,GAAG;AAChB,cAAM,QAAe,eAAU,IAAI,EAAE,EAAE,MAAlB,YAAuB;AAC5C,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,iBAAiB,EAAE,EAAE,4CAAuC,IAAI;AAAA,UACzE,QAAQ,EAAE;AAAA,QACd,CAAC;AAAA,MACL,OAAO;AACH,aAAK,IAAI,EAAE,EAAE;AACb,kBAAU,IAAI,EAAE,IAAI,OAAO;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAGA;AACI,UAAM,OAA4B,oBAAI,IAAoB;AAE1D,eAAW,KAAK,MAAM;AAClB,UAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,GAAG;AAC7B,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,QAAQ,EAAE,EAAE;AAAA,UACrB,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,MAAM,MAAM;AAAA,QAC3B,CAAC;AACD;AAAA,MACJ;AAEA,YAAM,IAAY,EAAE;AAEpB,UAAI,KAAK,IAAI,CAAC,GAAG;AACb,cAAM,UAA8B,KAAK,IAAI,CAAC;AAC9C,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,wBAAwB,CAAC,mBAAmB,EAAE,EAAE;AAAA,UACzD,QAAQ,EAAE;AAAA,UACV,SAAS;AAAA,YACL,EAAE,OAAO,SAAS,OAAO,EAAE;AAAA,YAC3B,UAAU,CAAC,EAAE,IAAI,OAAO,IAAI;AAAA,UAChC;AAAA,QACJ,CAAC;AAAA,MACL,OAAO;AACH,aAAK,IAAI,GAAG,EAAE,EAAE;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAGA;AACI,UAAM,YAAiC,oBAAI,IAAoB;AAE/D,eAAW,KAAK,QAAQ;AACpB,UAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,GAAG;AAC7B,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,UAAU,EAAE,EAAE;AAAA,UACvB,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,MAAM,QAAQ;AAAA,QAC7B,CAAC;AAAA,MACL;AAEA,YAAM,cAAuB,CAAC,CAAC,EAAE,QAAQ,CAAC,oBAAoB,CAAC;AAE/D,UAAI,eAAe,EAAE,MAAM;AACvB,cAAM,IAAY,EAAE;AAEpB,YAAI,UAAU,IAAI,CAAC,GAAG;AAClB,gBAAM,UAA8B,UAAU,IAAI,CAAC;AACnD,YAAE,OAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,yBAAyB,CAAC,qBAAqB,EAAE,EAAE;AAAA,YAC5D,QAAQ,EAAE;AAAA,YACV,SAAS;AAAA,cACL,EAAE,OAAO,SAAS,MAAM,EAAE;AAAA,cAC1B,UAAU,CAAC,EAAE,IAAI,OAAO,IAAI;AAAA,YAChC;AAAA,UACJ,CAAC;AAAA,QACL,OAAO;AACH,oBAAU,IAAI,GAAG,EAAE,EAAE;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,QAAQ;AACpB,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,UAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,GAAG;AAC7B,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,WAAW,EAAE,EAAE,aAAa,EAAE,EAAE;AAAA,UACzC,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,SAAS,EAAE,GAAG;AAAA,QAC7C,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC9HA,SAAS,oBAAoB,KAAoC;AAC7D,QAAM,MAAM,IAAI,QAAQ,IAAI;AAC5B,MAAI,QAAQ,GAAI,QAAO;AAEvB,QAAM,UAAU,IAAI,MAAM,GAAG,GAAG,EAAE,KAAK;AACvC,QAAM,WAAW,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK;AAEzC,MAAI,CAAC,WAAW,CAAC,SAAU,QAAO;AAClC,SAAO,EAAE,SAAS,SAAS;AAC/B;AAEA,SAAS,UAAU,GAAkB,KAAa,KAAsB;AAlBxE;AAmBI,QAAM,IAAI,EAAE,UAAU,IAAI,GAAG;AAC7B,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,CAAC,GAAE,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AACvD;AAEO,SAAS,mBAAmB,GAAwB;AAxB3D;AAyBI,QAAM,UAAmC,OAAE,MAAM,yBAAR,YAAgC,CAAC;AAC1E,QAAM,UAAmC,OAAE,MAAM,yBAAR,YAAgC,CAAC;AAE1E,QAAM,gBAAgB,CAAC,QACnB,4BAA4B,GAAG;AAUnC,QAAM,qBAAqB,CACvB,QAKC;AACD,UAAM,MAAM,EAAE,QAAQ,IAAI,GAAG;AAE7B,QAAI,KAAK;AACL,UAAI,IAAI,SAAS,UAAU;AAEvB,eAAO;AAAA,UACH,IAAI;AAAA,UACJ,QAAQ,IAAI;AAAA,UACZ,UAAU,CAAC,IAAI,SAAS,IAAI,EAAE;AAAA,QAClC;AAAA,MACJ;AAEA,UAAI,IAAI,SAAS,SAAS;AACtB,cAAMC,YAAY,IAAI,KAAa,WAAW;AAC9C,YAAI,CAACA;AACD,iBAAO,EAAE,IAAI,OAAO,QAAQ,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE;AAC3D,eAAO,EAAE,IAAI,MAAM,QAAQ,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE;AAAA,MAC1D;AAGA,aAAO,EAAE,IAAI,OAAO,QAAQ,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE;AAAA,IAC3D;AAGA,UAAM,IAAI,oBAAoB,GAAG;AACjC,QAAI,CAAC,EAAG,QAAO,EAAE,IAAI,MAAM;AAE3B,QAAI,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,QAAQ;AACnC,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,EAAE;AAAA,QACV,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,MACpC;AAEJ,WAAO;AAAA,MACH,IAAI;AAAA,MACJ,QAAQ,EAAE;AAAA,MACV,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpC;AAAA,EACJ;AAGA,aAAW,KAAK,OAAO,KAAK,MAAM,GAAG;AACjC,UAAM,IAAI,mBAAmB,CAAC;AAC9B,QAAI,CAAC,EAAE,IAAI;AACP,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,cAAc,CAAC;AAAA,QACxB,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ;AAAA,MAChD,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,aAAW,KAAK,OAAO,KAAK,MAAM,GAAG;AACjC,UAAM,IAAI,mBAAmB,CAAC;AAC9B,QAAI,CAAC,EAAE,IAAI;AACP,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,cAAc,CAAC;AAAA,QACxB,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ;AAAA,MAChD,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,aAAW,KAAK,OAAO,KAAK,MAAM,GAAG;AACjC,QAAI,EAAE,KAAK,QAAS;AAEpB,UAAM,IAAI,mBAAmB,CAAC;AAC9B,MAAE,OAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,oBAAoB,CAAC;AAAA,MAC9B,QAAQ,EAAE;AAAA,MACV,SAAS,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ;AAAA,IAChD,CAAC;AAAA,EACL;AACJ;;;AC3HO,SAAS,2BAA2B,GAAwB;AAC/D,aAAW,KAAK,EAAE,QAAQ;AACtB,UAAM,SAAkB,oBAAoB,CAAC;AAC7C,UAAM,UAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,KAAK;AAElD,QAAI,EAAE,SAAS,YAAY,QAAQ;AAC/B,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iBAAiB,EAAE,EAAE;AAAA,QAC9B,QAAQ,EAAE;AAAA,QACV,SAAS,EAAE,QAAQ,4BAA4B;AAAA,MACnD,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,SAAS;AAEV,UAAI,CAAC,QAAQ;AACT,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,yBAAyB,EAAE,EAAE;AAAA,UACtC,QAAQ,EAAE;AAAA,QACd,CAAC;AAAA,MACL;AAAA,IACJ,OAAO;AAEH,UAAI,QAAQ;AACR,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,qBAAqB,EAAE,EAAE;AAAA,UAClC,QAAQ,EAAE;AAAA,QACd,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACrCO,SAAS,uBAAuB,GAAwB;AAJ/D;AAKI,QAAM,wBAAqC,oBAAI,IAAY;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAGD,aAAW,KAAK,EAAE,QAAQ;AACtB,UAAM,UAAU,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,UAAU,CAAC;AACxD,eAAW,KAAK,SAAS;AACrB,YAAM,QAAe,aAAE,iBAAF,YAAkB,EAAE,iBAApB,YAAoC;AACzD,YAAM,aAAsB,eAAe,EAAE,UAAU;AACvD,YAAM,QAAiB,OAAE,SAAF,mBAAgB;AAEvC,UAAI,SAAS,aAAa,YAAY;AAClC,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,0BAA0B,EAAE,EAAE,aAAa,EAAE,EAAE;AAAA,UACxD,QAAQ,EAAE;AAAA,UACV,SAAS;AAAA,YACL;AAAA,cACI,SAAS,EAAE;AAAA,cACX,UAAU,EAAE;AAAA,cACZ,YAAY,EAAE;AAAA,YAClB;AAAA,YACA,CAAC,EAAE,IAAI,EAAE,EAAE;AAAA,UACf;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,UAAI,MAAM;AACN,cAAM,OAAiB,KAAa;AACpC,cAAM,OAAiB,KAAa;AAEpC,YAAI,CAAC,eAAe,IAAI,GAAG;AACvB,YAAE,OAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,kCAAkC,EAAE,EAAE,aAAa,EAAE,EAAE;AAAA,YAChE,QAAQ,EAAE;AAAA,YACV,SAAS;AAAA,cACL,EAAE,SAAS,EAAE,IAAI,UAAU,EAAE,GAAG;AAAA,cAChC,CAAC,EAAE,IAAI,EAAE,EAAE;AAAA,YACf;AAAA,UACJ,CAAC;AAAA,QACL;AAEA,YAAI,CAAC,sBAAsB,IAAI,OAAO,IAAI,CAAC,GAAG;AAC1C,YAAE,OAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,kCAAkC,EAAE,EAAE,aAAa,EAAE,EAAE,wBAAwB;AAAA,cACpF;AAAA,YACJ,CAAC;AAAA,YACD,QAAQ,EAAE;AAAA,YACV,SAAS;AAAA,cACL,EAAE,SAAS,EAAE,IAAI,UAAU,EAAE,IAAI,KAAK;AAAA,cACtC,CAAC,EAAE,IAAI,EAAE,EAAE;AAAA,YACf;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,EAAE,QAAQ;AACtB,UAAM,QAAiB,OAAE,SAAF,mBAAgB;AACvC,QAAI,CAAC,KAAM;AAEX,UAAM,OAAiB,KAAa;AACpC,UAAM,OAAiB,KAAa;AAEpC,QAAI,CAAC,eAAe,IAAI,GAAG;AACvB,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iCAAiC,EAAE,EAAE;AAAA,QAC9C,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;AAAA,MACnD,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,sBAAsB,IAAI,OAAO,IAAI,CAAC,GAAG;AAC1C,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iCAAiC,EAAE,EAAE,uBAAuB;AAAA,UACjE;AAAA,QACJ,CAAC;AAAA,QACD,QAAQ,EAAE;AAAA,QACV,SAAS,aAAa,EAAE,SAAS,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;AAAA,MACzD,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;AChGO,SAAS,aAAa,GAAmB;AANhD;AAOI,QAAM,KAAK,EAAE,QAAQ,IAAI,YAAY;AACrC,QAAM,YAAY,CAAC,GAAC,OAAE,SAAF,mBAAQ;AAC5B,SAAO,MAAM,iBAAiB,MAAM,cAAc;AACtD;;;ACAO,SAAS,eAAe,GAAoB;AAC/C,QAAM,IAAI,OAAO,CAAC;AAClB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACpC;AAMO,SAAS,gBACZ,QACA,WACA,aACO;AACP,QAAM,MAAM,qBAAqB,QAAQ,SAAS;AAClD,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,YAAY,aAAa,QAAQ,CAAC,IAAI,SAAU,QAAO;AAC3D,MAAI,YAAY,WAAW,QAAQ,CAAC,IAAI,OAAQ,QAAO;AACvD,SAAO,EAAE,YAAY,WAAW,QAAQ,CAAC,IAAI;AAEjD;AAEO,SAAS,qBACZ,QACA,WACgC;AAChC,MAAI,cAAc,UAAa,cAAc,KAAM,QAAO;AAE1D,QAAM,SAAU,OAAe,SAAS;AACxC,MAAI,OAAQ,QAAO;AAEnB,QAAM,WAAY,OAAe,OAAO,SAAS,CAAC;AAGlD,MAAI,SAAU,QAAO;AAErB,MAAI,OAAO,cAAc,UAAU;AAC/B,UAAM,cAAc,OAAO,SAAS;AACpC,QAAI,OAAO,SAAS,WAAW,GAAG;AAC9B,aAAQ,OAAe,WAAW;AAAA,IACtC;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,oBAAoB,QAA4C;AAzDhF;AA0DI,MAAI,CAAC,OAAQ,QAAO,EAAE,MAAM,eAAe,KAAK,EAAE;AAClD,MAAI,OAAO,SAAS,aAAc,QAAO;AACzC,QAAM,MAAM,KAAK,IAAI,GAAG,QAAO,YAAO,QAAP,YAAc,CAAC,CAAC;AAC/C,SAAO,EAAE,GAAG,QAAQ,IAAI;AAC5B;AAEO,SAAS,iBACZ,QACA,aACA,eACO;AACP,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,CAAC,OAAO,SAAS,aAAa,GAAG;AAClE,WAAO;AAAA,EACX;AAEA,QAAM,KAAK,oBAAoB,MAAM;AACrC,UAAQ,GAAG,MAAM;AAAA,IACb,KAAK;AACD,aAAO,kBAAkB;AAAA,IAC7B,KAAK,eAAe;AAChB,YAAM,QAAQ,eAAe,IAAI,GAAG,MAAM;AAC1C,aAAO,iBAAiB,eAAe,iBAAiB;AAAA,IAC5D;AAAA,IACA,KAAK;AACD,aAAO,iBAAiB,eAAe,IAAI,GAAG,MAAM;AAAA,IACxD,KAAK;AACD,aAAO,iBAAiB,eAAe,IAAI,GAAG,MAAM;AAAA,EAC5D;AACJ;AAMO,SAAS,OACZ,QACA,WACA,SACA,QACO;AACP,QAAM,OAAO,qBAAqB,QAAQ,SAAS;AACnD,QAAM,OAAO,qBAAqB,QAAQ,OAAO;AACjD,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,QAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAE/D,SAAO,iBAAiB,OAAO,YAAY,OAAO,KAAK;AAC3D;;;ACjGO,SAAS,cAAc,GAAwB;AAVtD;AAWI,QAAM,aAAa;AAAA,KACf,OAAE,QAAQ,qBAAV,mBAA4B;AAAA,EAChC;AAEA,aAAW,KAAK,EAAE,QAAQ;AACtB,QAAI,CAAC,aAAa,CAAC,EAAG;AAEtB,UAAM,YACF,CAAC;AAEL,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAM,QAAe,aAAE,iBAAF,YAAkB,EAAE,iBAApB,YAAoC;AACzD,UAAI,SAAS,OAAQ;AAErB,YAAM,MAAe,EAAE;AACvB,UAAI,CAAC,eAAe,GAAG,EAAG;AAE1B,YAAM,MAAM,qBAAqB,EAAE,YAAY,GAAG;AAClD,YAAM,OAAO,2BAAK;AAClB,UAAI,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,GAAG;AACnD,kBAAU,KAAK;AAAA,UACX,UAAU,EAAE;AAAA,UACZ,WAAW,OAAO,GAAG;AAAA,UACrB;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI,UAAU,UAAU,EAAG;AAE3B,UAAM,UAAU,UAAU;AAAA,MAAO,CAAC,MAAM,YACpC,QAAQ,OAAO,KAAK,OAAO,UAAU;AAAA,IACzC;AAEA,UAAM,YAAY,UAAU;AAAA,MACxB,CAAC,cACG,UAAU,aAAa,QAAQ,YAC/B,CAAC,iBAAiB,YAAY,QAAQ,MAAM,UAAU,IAAI;AAAA,IAClE;AAEA,QAAI,UAAU,SAAS,GAAG;AACtB,QAAE,oBAAoB,IAAI,EAAE,EAAE;AAC9B,YAAM,cAAwB;AAAA,QAC1B,EAAE;AAAA,QACF,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,QAAQ;AAAA,MAC9C;AAEA,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,6BAA6B,EAAE,EAAE,0BAA0B,WAAW,IAAI;AAAA,QACnF,QAAQ,EAAE;AAAA,QACV,SAAS;AAAA,UACL;AAAA,YACI,SAAS,EAAE;AAAA,YACX,QAAQ,WAAW;AAAA,YACnB,WAAW,SAAS,aAAa,WAAW,MAAM;AAAA,YAClD,iBAAiB,QAAQ;AAAA,YACzB,aAAa,QAAQ;AAAA,YACrB,OAAO,UAAU,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,YAC1C,WAAW,UAAU,IAAI,CAAC,UAAU,MAAM,QAAQ;AAAA,YAClD,mBAAmB,UAAU,IAAI,CAAC,UAAU,MAAM,QAAQ;AAAA,UAC9D;AAAA,UACA,YAAY,SAAS,IAAI,cAAc;AAAA,QAC3C;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;ACpEA,SAAS,sBAAsB,GAAkB,OAAyB;AACtE,QAAM,OAAiB,CAAC;AACxB,QAAM,WAAwB,oBAAI,IAAY;AAE9C,MAAI,MAA0B;AAC9B,QAAM,WAAwB,oBAAI,IAAY;AAE9C,SAAO,OAAO,CAAC,SAAS,IAAI,GAAG,GAAG;AAC9B,aAAS,IAAI,GAAG;AAEhB,UAAM,IAAI,EAAE,QAAQ,IAAI,GAAG;AAC3B,UAAM,IAAa,uBAAG;AAEtB,QAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,iBAAW,KAAK,OAAO,KAAK,CAAQ,GAAG;AACnC,YAAI,CAAC,SAAS,IAAI,CAAC,GAAG;AAClB,mBAAS,IAAI,CAAC;AACd,eAAK,KAAK,CAAC;AAAA,QACf;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,uBAAG;AAAA,EACb;AAEA,SAAO;AACX;AAEA,SAAS,qBAAqB,GAAkB,OAA8B;AAvC9E;AAwCI,QAAM,MAAqB,CAAC;AAC5B,QAAM,OAAiB,sBAAsB,GAAG,KAAK;AAErD,aAAW,OAAO,MAAM;AACpB,QAAI,MAA0B;AAC9B,UAAM,OAAoB,oBAAI,IAAY;AAE1C,WAAO,OAAO,CAAC,KAAK,IAAI,GAAG,GAAG;AAC1B,WAAK,IAAI,GAAG;AAEZ,YAAM,IAAI,EAAE,QAAQ,IAAI,GAAG;AAC3B,YAAM,OAAgB,4BAAG,gBAAH,mBAAyB;AAE/C,UAAI,QAAQ,QAAQ,QAAQ,OAAO;AAC/B,YAAI,GAAG,IAAI;AACX;AAAA,MACJ;AAEA,YAAM,uBAAG;AAAA,IACb;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,oBAAoB,GAAwB;AAjE5D;AAmEI,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,MAAqB,qBAAqB,GAAG,EAAE,EAAE;AACvD,UAAM,iBAA0B,OAAO,OAAO,GAAG,EAAE;AAAA,MAC/C,CAAC,MAAM,MAAM;AAAA,IACjB;AACA,QAAI,CAAC,eAAgB;AAErB,UAAM,UAAU,EAAE,mBAAmB,EAAE,EAAE;AAEzC,eAAW,KAAK,SAAS;AACrB,iBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAI,CAAC,eAAe,EAAE,UAAU,EAAG;AAEnC,cAAM,MAAe,qBAAqB,EAAE,YAAY,EAAE,UAAU;AACpE,YAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AAErC,mBAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,cAAI,QAAQ,QAAQ,CAAC,qBAAqB,KAAY,CAAC,GAAG;AACtD,cAAE,OAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,mBAAmB,EAAE,EAAE,gBAAgB,EAAE,EAAE,2CAA2C,CAAC;AAAA,cAChG,QAAQ,EAAE;AAAA,cACV,SAAS;AAAA,gBACL;AAAA,kBACI,MAAM;AAAA,kBACN,WAAW,EAAE;AAAA,kBACb,SAAS,EAAE;AAAA,kBACX,UAAU,EAAE;AAAA,gBAChB;AAAA,gBACA,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,cACrB;AAAA,YACJ,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,MAAe,EAAE;AACvB,QAAI,CAAC,eAAe,GAAG,EAAG;AAE1B,UAAM,MAAe,qBAAqB,EAAE,YAAY,GAAG;AAC3D,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AAErC,UAAM,MAAqB,qBAAqB,GAAG,EAAE,EAAE;AAEvD,eAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAI,QAAQ,QAAQ,CAAC,qBAAqB,KAAY,CAAC,GAAG;AACtD,UAAE,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,QAAQ,EAAE,EAAE,sBAAsB;AAAA,YACvC;AAAA,UACJ,CAAC,iDAAiD,CAAC;AAAA,UACnD,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,MAAM,GAAG,WAAW,IAAI;AAAA,QACvC,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAGA,aAAW,KAAK,EAAE,MAAM;AACpB,UAAM,KAAc,EAAE;AACtB,QAAI,CAAC,MAAM,OAAO,OAAO,SAAU;AAEnC,eAAW,KAAK,OAAO,KAAK,EAA6B,GAAG;AACxD,YAAM,MAAY,GAAW,CAAC;AAC9B,UAAI,CAAC,IAAK;AAEV,YAAM,OAAgB,IAAI,SAAS;AACnC,YAAM,KAAc,IAAI,OAAO;AAC/B,YAAM,SAAiB,QAAO,SAAI,WAAJ,YAAc,EAAE;AAE9C,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,SACH,eAAe,CAAC,aAAa,EAAE,EAAE,iCAAiC,MAAM,MAAM,OAAO,IAAI,CAAC,WAAM;AAAA,UAC5F;AAAA,QACJ,CAAC,OACD,eAAe,CAAC,aAAa,EAAE,EAAE,oCAAoC,OAAO,IAAI,CAAC,WAAM,OAAO,EAAE,CAAC;AAAA,QACvG,QAAQ,EAAE;AAAA,QACV,SAAS;AAAA,UACL,EAAE,MAAM,GAAG,MAAM,IAAI,OAAO;AAAA,UAC5B,SAAS,CAAC,EAAE,IAAI,MAAM,IAAI;AAAA,QAC9B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;AC7JO,SAAS,qBAAqB,GAAwB;AACzD,aAAW,KAAK,EAAE,QAAQ;AACtB,QAAI,EAAE,SAAS,SAAU;AAEzB,QAAI,CAAC,EAAE,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,GAAG;AAC7C,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iBAAiB,EAAE,EAAE;AAAA,QAC9B,QAAQ,EAAE;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;ACZO,SAAS,2BAA2B,GAAwB;AAJnE;AAKI,MAAI,CAAC,EAAE,QAAQ,mBAAoB;AAEnC,MAAI,aAAsB;AAC1B,MAAI,UAAmB;AAEvB,aAAW,KAAK,EAAE,QAAQ;AACtB,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,UAAI,CAAC,eAAe,EAAE,UAAU,EAAG;AAEnC,YAAM,QAAe,aAAE,iBAAF,YAAkB,EAAE,iBAApB,YAAoC;AACzD,UAAI,SAAS,OAAQ,WAAU;AAAA,eACtB,SAAS,UAAW,cAAa;AAE1C,UAAI,cAAc,QAAS;AAAA,IAC/B;AAEA,QAAI,cAAc,QAAS;AAAA,EAC/B;AAEA,MAAI,cAAc,CAAC,SAAS;AACxB,MAAE,OAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SACI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,EAAE,OAAO,SAAS;AAAA,IAC/B,CAAC;AAAA,EACL;AACJ;;;AC9BO,SAAS,sBAAsB,GAAwB;AAJ9D;AAKI,QAAM,gBAA6B,oBAAI,IAAY;AAEnD,aAAW,KAAK,EAAE,QAAQ;AACtB,QAAI,EAAE,QAAS,eAAc,IAAI,EAAE,EAAE;AAAA,EACzC;AAEA,QAAM,gBAA6B,oBAAI,IAAY;AACnD,aAAW,KAAK,EAAE,MAAM;AACpB,eAAW,OAAM,OAAE,aAAF,YAAc,CAAC,EAAG,eAAc,IAAI,EAAE;AAAA,EAC3D;AAEA,QAAM,mBAAgC,oBAAI,IAAY;AACtD,aAAW,OAAO,OAAO,QAAO,OAAE,MAAM,yBAAR,YAAgC,CAAC,CAAC,GAAG;AACjE,eAAW,MAAM,oBAAO,CAAC,EAAG,kBAAiB,IAAI,EAAE;AAAA,EACvD;AAEA,aAAW,KAAK,EAAE,QAAQ;AACtB,QACI,CAAC,cAAc,IAAI,EAAE,EAAE,KACvB,CAAC,cAAc,IAAI,EAAE,EAAE,KACvB,CAAC,iBAAiB,IAAI,EAAE,EAAE,GAC5B;AACE,QAAE,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,UAAU,EAAE,EAAE;AAAA,QACvB,QAAQ,EAAE;AAAA,QACV,SAAS;AAAA,UACL;AAAA,YACI,SAAS,EAAE;AAAA,YACX,OAAO;AAAA;AAAA,YAEP,eAAe,cAAc,IAAI,EAAE,EAAE;AAAA,YACrC,kBAAkB,iBAAiB,IAAI,EAAE,EAAE;AAAA,UAC/C;AAAA,UACA,CAAC,EAAE,EAAE;AAAA,QACT;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;ACxCA,SAAS,cACL,QAOsB;AACtB,UAAQ,QAAQ;AAAA,IACZ,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAEA,SAAS,WACL,MAOA,GAOM;AACN,QAAM,IAAI,EAAE,SAAS,SAAS,OAAO,EAAE,MAAM,CAAC,MAAM;AACpD,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO,uBAAuB;AAAA,QAC1B,EAAE;AAAA,MACN,CAAC,oBAAoB,CAAC;AAAA,IAC1B,KAAK;AACD,aAAO,4CAA4C,CAAC;AAAA,IACxD,KAAK;AACD,aAAO,uBAAuB;AAAA,QAC1B,EAAE;AAAA,MACN,CAAC,sCAAsC,CAAC;AAAA,IAC5C,KAAK;AACD,aAAO,uBAAuB;AAAA,QAC1B,EAAE;AAAA,MACN,CAAC,+CAA+C,CAAC;AAAA,IACrD,KAAK;AACD,aAAO,sCAAsC,CAAC;AAAA,IAClD;AACI,aAAO,gCAAgC,CAAC;AAAA,EAChD;AACJ;AAEO,SAAS,kBAAkB,GAAwB;AArE1D;AAsEI,QAAM,QAAe,aAAE,QAAQ,qBAAV,mBAA4B,SAA5B,YAAoC;AACzD,MAAI,CAAC,EAAE,MAAM,UAAW;AAGxB,QAAM,QAAQ,uBAAuB,EAAE,QAAO,OAAE,QAAQ,eAAV,YAAwB,CAAC,GAAG;AAAA,IACtE,GAAG,EAAE,QAAQ;AAAA,IACb,MAAM;AAAA,EACV,CAAC;AAED,MAAI,SAAS,SAAU;AAEvB,aAAW,KAAK,OAAO;AACnB,QAAI,EAAE,UAAU,SAAU;AAE1B,UAAM,OAAO;AAAA,MACT,QAAQ,OAAU,WAAV,YAAoB,mBAAmB;AAAA,IACnD;AAEA,UAAM,SAA8B,EAAU,SACxC,OAAQ,EAAU,MAAM,IACxB;AAKN,UAAM,aAAuB,EAAU;AACvC,UAAM,cAAwB,CAAC;AAC/B,QAAI,OAAQ,aAAY,KAAK,MAAM;AACnC,QACI,OAAO,eAAe,YACtB,cACA,eAAe;AAEf,kBAAY,KAAK,UAAU;AAE/B,MAAE,OAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,SAAS,WAAW,MAAM;AAAA,QACtB;AAAA,QACA,SAAU,EAAU;AAAA,QACpB,WAAY,EAAU;AAAA,QACtB;AAAA,QACA,OAAQ,EAAU;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,MACA,SAAS;AAAA,QACL;AAAA,UACI,SAAU,EAAU;AAAA,UACpB,WAAY,EAAU;AAAA,UACtB;AAAA,UACA,OAAQ,EAAU;AAAA,QACtB;AAAA,QACA,YAAY,SAAS,IAAI,cAAc;AAAA,MAC3C;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;AC1DA,SAAS,QAAW,GAA2D;AAC3E,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAQ;AAC3C;AAEA,SAASC,gBAAe,GAAyB;AAC7C,SACI,OAAO,MAAM,YAAa,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AAE5E;AAEA,SAAS,YACL,YACA,KACuB;AACvB,QAAM,MAAyC,WAAmB,GAAG;AACrE,MAAI,CAAC,IAAK,QAAO,EAAE,IAAI,IAAI;AAE3B,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WAAY,IAAI,OAAe,CAAC;AAEpE,SAAO;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,EACP;AACJ;AAEA,SAAS,SACL,KACA,MAUI;AA7GR;AA+GI,QAAM,MAAc,GAAG,OAAO,KAAK,SAAS,CAAC,IAAI,KAAK,IAAI;AAE1D,QAAM,WAAoC,IAAI,IAAI,GAAG;AACrD,MAAI,CAAC,UAAU;AACX,QAAI,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,aAAa,MAAM,KAAK,IAAI,IAAI,KAAK,WAAW,CAAC;AAAA,IACrD,CAAC;AACD;AAAA,EACJ;AAEA,QAAM,YAAsB,MAAM;AAAA,IAC9B,oBAAI,IAAY,CAAC,GAAG,SAAS,aAAa,GAAG,KAAK,WAAW,CAAC;AAAA,EAClE;AAGA,MAAI,IAAI,KAAK;AAAA,IACT,GAAG;AAAA,IACH,QAAO,cAAS,UAAT,YAAkB,KAAK;AAAA,IAC9B,aAAa;AAAA,EACjB,CAAC;AACL;AAEA,SAAS,YACL,GACA,GACkB;AA/ItB;AAgJI,QAAM,WACD,kCAAG,iBAAH,YAA4B,EAAE,iBAA9B,YAAsD;AAC3D,SAAO,YAAY,YAAY,YAAY;AAC/C;AAEA,SAAS,sBACL,OACA,SACA,QACO;AACP,QAAM,WAA0C,QAAQ,iCAAQ,MAAM;AACtE,QAAM,aAA4C,QAAQ,iCAAQ,QAAQ;AAE1E,MAAI,UAAU;AACV,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,CAAC,SAAS,SAAS,KAAK,EAAG,QAAO;AAAA,EAC1C;AAEA,MAAI,YAAY;AACZ,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,CAAC,WAAW,SAAS,OAAO,EAAG,QAAO;AAAA,EAC9C;AAEA,SAAO;AACX;AAEO,SAAS,oBACZ,MACa;AA5KjB;AA6KI,QAAM,SAA4C,KAAK;AACvD,QAAM,cACD,sCAAQ,SAAR,YAAwB;AAC7B,QAAM,QAA4C,iCAAQ;AAE1D,QAAM,MAAgC,oBAAI,IAAyB;AAEnE,QAAM,gBAAgB,CAClB,QAWO;AACP,QAAI,eAAe,UAAU,IAAI,SAAS,WAAY;AACtD,QAAI,CAAC,sBAAsB,IAAI,OAAO,IAAI,SAAS,MAAM,EAAG;AAE5D,UAAM,MAAyC,KAAK,WAChD,IAAI,SACR;AAGA,QAAI,SAAS,OAAO,CAAC,aAAa,KAAY,KAAK,EAAG;AAEtD,aAAS,KAAK;AAAA,MACV,GAAG;AAAA,MACH,SAAS,YAAY,KAAK,YAAY,IAAI,SAAS;AAAA,IACvD,CAAC;AAAA,EACL;AAKA,MAAI,KAAK,SAAS,UAAU;AACxB,eAAW,MAAK,UAAK,SAAL,YAAa,CAAC,GAAG;AAC7B,YAAM,MAAgB,EAAU;AAChC,UAAI,CAACA,gBAAe,GAAG,EAAG;AAE1B,oBAAc;AAAA,QACV,OAAO,EAAE;AAAA,QACT,WAAW;AAAA,QACX,MAAM;AAAA,QACN,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,WAAW,OAAO,GAAG,CAAC,EAAE;AAAA,MACzD,CAAC;AAAA,IACL;AAAA,EACJ,WAAW,KAAK,SAAS,iBAAiB;AACtC,UAAM,IAAqB,KAAK;AAChC,UAAM,MAAe,IAAK,EAAU,aAAa;AAEjD,QAAI,KAAKA,gBAAe,GAAG,GAAG;AAC1B,oBAAc;AAAA,QACV,OAAO,EAAE;AAAA,QACT,WAAW;AAAA,QACX,MAAM;AAAA,QACN,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,WAAW,OAAO,GAAG,CAAC,EAAE;AAAA,MACzD,CAAC;AAAA,IACL;AAAA,EACJ;AAOA,QAAM,UAA2B,UAAK,WAAL,YAAe,CAAC;AAEjD,aAAW,KAAK,QAAQ;AAEpB,UAAM,OAAiB,EAAU;AACjC,QAAIA,gBAAe,IAAI,GAAG;AACtB,oBAAc;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,WAAW;AAAA,QACX,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,WAAW,OAAO,IAAI,CAAC,EAAE;AAAA,MAC5D,CAAC;AAAA,IACL;AAGA,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAM,OAAiB,EAAU;AACjC,UAAI,CAACA,gBAAe,IAAI,EAAG;AAE3B,YAAM,OAA2B,YAAY,GAAG,CAAC;AAEjD,oBAAc;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA,aAAa;AAAA,UACT,SAAS,EAAE,EAAE;AAAA,UACb,UAAU,EAAE,EAAE;AAAA,UACd,WAAW,OAAO,IAAI,CAAC;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AASA,QAAM,KAA4C,KAAK,MAAM;AAC7D,MAAI,CAAC,GAAI,QAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAEvC,QAAM,kBAAkB,CAAC,QAAgB,SAAwB;AAC7D,UAAM,MAA0B,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AAC9D,eAAW,QAAQ,KAAK;AACpB,UAAI,CAACA,gBAAe,IAAI,EAAG;AAE3B,oBAAc;AAAA,QACV,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,WAAW;AAAA,QACX,MAAM;AAAA,QACN,aAAa,CAAC,iBAAiB,MAAM,IAAI,WAAW,OAAO,IAAI,CAAC,EAAE;AAAA,MACtE,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,oBAAoB,CAAC,YAAoB,SAAwB;AACnE,UAAM,YAAoB;AAE1B,kBAAc;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,QACT,2BAA2B,UAAU;AAAA,QACrC,WAAW,OAAO,SAAS,CAAC;AAAA,MAChC;AAAA,IACJ,CAAC;AAED,UAAM,MAA0B,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AAC9D,eAAW,QAAQ,KAAK;AACpB,UAAI,CAACA,gBAAe,IAAI,EAAG;AAE3B,oBAAc;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,UACT,mBAAmB,UAAU;AAAA,UAC7B,WAAW,OAAO,IAAI,CAAC;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,sBAA+B,KAAK,SAAS;AACnD,QAAM,wBAAiC,KAAK,SAAS;AAGrD,QAAM,QACF,GAAG,SAAS,OAAO,GAAG,UAAU,WACzB,GAAG,QACJ;AAEV,MAAI,OAAO;AACP,QAAI,qBAAqB;AACrB,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,wBAAgB,QAAQ,IAAI;AAAA,MAChC;AAAA,IACJ,WAAW,uBAAuB;AAC9B,YAAM,aAA0B,IAAI;AAAA,QAChC,MAAM,QAAQ,KAAK,cAAc,IAC1B,KAAK,iBACN,CAAC;AAAA,MACX;AAEA,iBAAW,UAAU,YAAY;AAC7B,wBAAgB,QAAS,MAAc,MAAM,CAAC;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,WACF,GAAG,UAAU,OAAO,GAAG,WAAW,WAC3B,GAAG,SACJ;AAEV,MAAI,UAAU;AACV,QAAI,qBAAqB;AACrB,iBAAW,CAAC,YAAY,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACvD,0BAAkB,YAAY,IAAI;AAAA,MACtC;AAAA,IACJ,WAAW,uBAAuB;AAC9B,YAAM,iBAA8B,IAAI;AAAA,UACnC,UAAK,qBAAL,YAAyB,CAAC,GAAG,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,MACtD;AAEA,iBAAW,cAAc,gBAAgB;AACrC,cAAM,OAAiB,SAAiB,UAAU;AAClD,YAAI,SAAS,OAAW;AACxB,0BAAkB,YAAY,IAAI;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAClC;;;ACjYO,SAAS,aACZ,IACA,QACA,MACO;AACP,UAAQ,IAAI;AAAA,IACR,KAAK,aAAa;AACd,YAAM,MAAmB,IAAI;AAAA,QACzB,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACvC;AACA,aAAO,IAAI,QAAQ;AAAA,IACvB;AAAA,IACA,KAAK,UAAU;AACX,YAAM,MAAmB,IAAI;AAAA,QACzB,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACvC;AACA,aAAO,IAAI,QAAQ;AAAA,IACvB;AAAA,IACA,KAAK,UAAU;AACX,YAAM,OAAoB,oBAAI,IAAY;AAC1C,iBAAW,KAAK,QAAQ;AACpB,cAAM,IAAY,KAAK,UAAU,CAAC;AAClC,YAAI,KAAK,IAAI,CAAC,EAAG,QAAO;AACxB,aAAK,IAAI,CAAC;AAAA,MACd;AACA,aAAO;AAAA,IACX;AAAA,IACA,KAAK,YAAY;AACb,aAAO,OAAO,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,IACzC;AAAA,IACA,KAAK,YAAY;AACb,aAAO,OAAO,KAAK,CAAC,MAAM,MAAM,IAAI;AAAA,IACxC;AAAA,IACA,KAAK,aAAa;AACd,YAAM,QACF,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAClD,aAAO,OAAO,UAAU;AAAA,IAC5B;AAAA,IACA,KAAK,aAAa;AACd,YAAM,MAAc,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAClE,aAAO,OAAO,UAAU;AAAA,IAC5B;AAAA,IACA;AACI,aAAO;AAAA,EACf;AACJ;;;ACvCA,SAAS,KAAQ,KAAwB;AACrC,SAAO,MAAM,KAAK,IAAI,IAAO,GAAG,CAAC;AACrC;AAEA,SAAS,eACL,GAC4B;AAC5B,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,QAAS,QAAO;AAC1B,SAAO;AACX;AAEA,SAAS,qBAAqB,MAA2B;AACrD,MAAI,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,KAAK;AACtD,WAAO,KAAK;AAChB,MAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK;AAClD,WAAO,KAAK,MAAM,KAAK;AAC3B,SAAO,WAAW,KAAK,EAAE;AAC7B;AAEA,SAAS,kBAAkB,OAAyC;AA7BpE;AA8BI,QAAM,MAAgB,CAAC;AACvB,aAAW,MAAM,OAAO;AACpB,eAAW,MAAK,QAAG,gBAAH,YAAkB,CAAC,EAAG,KAAI,KAAK,CAAC;AAChD,QAAI,KAAK,WAAW,OAAO,GAAG,SAAS,CAAC,EAAE;AAAA,EAC9C;AACA,SAAO,KAAK,GAAG;AACnB;AAEA,SAAS,oBAAoB,KAAU,QAAoC;AAtC3E;AAuCI,QAAM,MAAgB,CAAC,IAAI,EAAE;AAE7B,aAAW,KAAK,QAAQ;AACpB,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,UAAI,KAAK,EAAE,EAAE;AAAA,IACjB;AAAA,EACJ;AAEA,SAAO,KAAK,GAAG;AACnB;AAEA,SAAS,sBAAsB,KAAU,QAAoC;AAlD7E;AAmDI,QAAM,OAAiB,CAAC;AAExB,QAAM,SAAmB,IAAY;AACrC,MACI,OAAO,WAAW,YACjB,OAAO,WAAW,YAAY,OAAO,SAAS,MAAM,GACvD;AACE,SAAK,KAAK,MAAM;AAAA,EACpB;AAEA,aAAW,KAAK,QAAQ;AACpB,UAAM,OAAiB,EAAU;AACjC,QACI,OAAO,SAAS,YACf,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,GACnD;AACE,WAAK,KAAK,IAAI;AAAA,IAClB;AAEA,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAM,OAAiB,EAAU;AACjC,UACI,OAAO,SAAS,YACf,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,GACnD;AACE,aAAK,KAAK,IAAI;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,KAAK,IAAI;AACpB;AAEO,SAAS,cACZ,QACA,OACA,YACA,UACA,oBACA,MACI;AA3FR;AA4FI,MAAI,EAAC,qCAAU,QAAQ;AAEvB,QAAM,UAA4B,oBAAI,IAAiB;AACvD,aAAW,KAAK,KAAM,SAAQ,IAAI,EAAE,IAAI,CAAC;AAEzC,aAAW,QAAQ,UAAU;AACzB,UAAM,YAAmB,UAAK,eAAL,YAAmB;AAC5C,UAAM,WAAyC;AAAA,MAC3C,KAAK;AAAA,IACT;AACA,UAAM,UAAkB,qBAAqB,IAAI;AAQjD,QAAI,KAAK,UAAU,UAAU;AACzB,YAAM,WAA0C,MAAM;AAAA,SAClD,UAAK,WAAL,mBAAa;AAAA,MACjB,KACO,UAAK,WAAL,mBAAa,WACd,UAAK,WAAL,mBAAa,UACX,CAAC,KAAK,OAAO,MAAgB,IAC7B;AAER,UAAI,QAAuB,CAAC;AAE5B,UAAI,YAAY,SAAS,QAAQ;AAE7B,cAAM,SAAmC,oBAAI,IAG3C;AAEF,mBAAW,MAAM,UAAU;AACvB,gBAAM,IAAqB,QAAQ,IAAI,EAAE;AACzC,cAAI,CAAC,EAAG;AAER,gBAAM,gBAAyB,mBAAmB,EAAE,EAAE;AACtD,gBAAM,UAAoB;AAAA,YACtB;AAAA,YACA;AAAA,UACJ;AACA,gBAAM,YAAsB;AAAA,YACxB;AAAA,YACA;AAAA,UACJ;AAEA,gBAAM,MAAqB,oBAAoB;AAAA,YAC3C,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,OAAO,EAAE;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ,KAAK;AAAA,YACb,gBAAgB;AAAA,YAChB,kBAAkB;AAAA,UACtB,CAAC;AAED,qBAAW,MAAM,KAAK;AAClB,kBAAM,IAAY,GAAG,OAAO,GAAG,SAAS,CAAC,IAAI,GAAG,IAAI;AACpD,kBAAM,WAAoC,OAAO,IAAI,CAAC;AACtD,gBAAI,CAAC,UAAU;AACX,qBAAO,IAAI,GAAG,EAAE;AAAA,YACpB,OAAO;AACH,qBAAO,IAAI,GAAG;AAAA,gBACV,GAAG;AAAA,gBACH,aAAa,KAAK;AAAA,kBACd,GAAG,SAAS;AAAA,kBACZ,GAAG,GAAG;AAAA,gBACV,CAAC;AAAA,cACL,CAAC;AAAA,YACL;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAQ,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,MACtC,OAAO;AAEH,cAAM,aAAqB,WAAM,WAAN,YAAgB,CAAC;AAE5C,gBAAQ,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ,KAAK;AAAA,QACjB,CAAC;AAAA,MACL;AAEA,YAAM,SAAoB,MAAM;AAAA,QAAI,CAAC,OACjC,UAAU,IAAW,QAAQ;AAAA,MACjC;AAEA,UAAI,CAAC,aAAa,KAAK,IAAI,QAAQ,IAAI,GAAG;AACtC,eAAO,KAAK;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,YACL,QAAQ,KAAK;AAAA,YACb,OAAO;AAAA,YACP,IAAI,KAAK;AAAA,YACT,YAAY;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,aAAa,kBAAkB,KAAK;AAAA,UACxC;AAAA,QACJ,CAAC;AAAA,MACL;AAEA;AAAA,IACJ;AAOA,eAAW,KAAK,MAAM;AAClB,YAAM,gBAAyB,mBAAmB,EAAE,EAAE;AAEtD,YAAM,UAAoB,oBAAoB,GAAG,aAAa;AAC9D,YAAM,YAAsB,sBAAsB,GAAG,aAAa;AAElE,YAAM,QAAuB,oBAAoB;AAAA,QAC7C,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,OAAO,EAAE;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ,KAAK;AAAA,QACb,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACtB,CAAC;AAED,UAAI,CAAC,MAAM,OAAQ;AAEnB,YAAM,SAAoB,MAAM;AAAA,QAAI,CAAC,OACjC,UAAU,IAAW,QAAQ;AAAA,MACjC;AAEA,UAAI,CAAC,aAAa,KAAK,IAAI,QAAQ,IAAI,GAAG;AACtC,eAAO,KAAK;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,EAAE;AAAA,UACV,SAAS;AAAA,YACL,QAAQ,KAAK;AAAA,YACb,OAAO;AAAA,YACP,IAAI,KAAK;AAAA,YACT,YAAY;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,aAAa,kBAAkB,KAAK;AAAA,UACxC;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC9OA,SAAQ,aAAAC,kBAAgB;AAuDjB,SAAS,cAAc,OAAuB,CAAC,GAAY;AAC9D,SAAO,IAAI,YAAY,IAAI;AAC/B;AAIA,IAAM,cAAN,MAAqC;AAAA,EAajC,YAAY,OAAuB,CAAC,GAAG;AAZvC,SAAQ,QAAsB;AAAA,MAC1B,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,gBAAgB;AAAA,IACpB;AACA,SAAQ,UAAU,oBAAI,IAAiB;AACvC,SAAQ,YAAY,oBAAI,IAAmB;AAC3C,SAAQ,kBAAkB,oBAAI,IAAiC;AAG/D,SAAQ,WAA2B;AAG/B,SAAK,UAAU,EAAE,GAAG,KAAK;AAAA,EAC7B;AAAA;AAAA,EAGA,QAAQ,IAAY;AAChB,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC9B;AAAA,EACA,UAAU,IAAY;AAClB,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAChC;AAAA,EACA,WAAW,IAAY;AACnB,WAAO,KAAK,gBAAgB,IAAI,EAAE;AAAA,EACtC;AAAA,EAEA,KAAK,KAAyB;AAC1B,UAAM,OAAO,UAAU,KAAK;AAAA,MACxB,oBAAoB;AAAA,MACpB,aAAa,KAAK,eAAe,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,IAC/D,CAAC;AACD,SAAK,QAAQ;AACb,SAAK,eAAe;AAAA,EACxB;AAAA,EAEA,WAAyB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,WAAW,OAAsC;AAC7C,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,MAAM;AAAA,EAC/C;AAAA,EAEA,gBAA+B;AA7HnC;AA8HQ,YAAO,UAAK,QAAQ,eAAb,YAA2B,CAAC;AAAA,EACvC;AAAA,EAEA,iBAAiB;AAjIrB;AAkIQ,UAAM,aAAa,KAAK,cAAc;AAEtC,UAAM,MAAM,oBAAI,IAKb;AACH,UAAM,QAAQ,oBAAI,IAAY;AAE9B,eAAW,OAAO,OAAO,OAAO,UAAU,GAAG;AACzC,YAAM,SAAQ,SAAI,UAAJ,YAAa,CAAC;AAC5B,iBAAW,UAAU,OAAO,KAAK,KAAK,GAAG;AACrC,YAAI,MAAM,IAAI,MAAM,EAAG;AACvB,cAAM,IAAI,MAAM;AAChB,YAAI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,UACP,aAAa,MAAM,MAAM,EAAE;AAAA,QAC/B,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,WAAO,MAAM,KAAK,GAAG;AAAA,EACzB;AAAA;AAAA,EAIA,OAAsB;AAhK1B;AAiKQ,UAAM,QAAqB,CAAC;AAC5B,UAAM,QAAqB,CAAC;AAE5B,UAAM,UAAU,YAAY,KAAK,QAAQ,eAAe;AAGxD,eAAW,KAAK,KAAK,MAAM,SAAS;AAChC,YAAM,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,OAAmB,OAAO,EAAE,MAAM,CAAC;AAAA,IACpE;AAGA,eAAW,KAAK,KAAK,MAAM,SAAS;AAChC,UAAI,EAAE,SAAS;AACX,cAAM,KAAK;AAAA,UACP,MAAM,EAAE;AAAA,UACR,IAAI,EAAE;AAAA,UACN,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,eAAW,KAAK,KAAK,MAAM,QAAQ;AAC/B,YAAM,KAAK;AAAA,QACP,IAAI,EAAE;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE;AAAA,QACT,WACI,EAAE,iBAAiB,YACb,YACA,EAAE,UACA,UACA;AAAA,MAChB,CAAC;AAAA,IACL;AAGA,eAAW,KAAK,KAAK,MAAM,QAAQ;AAC/B,YAAM,IAAI,EAAE;AACZ,UAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,mBAAW,SAAS;AAChB,gBAAM,KAAK;AAAA,YACP,MAAM;AAAA,YACN,IAAI,EAAE;AAAA,YACN,MAAM;AAAA,UACV,CAAC;AAAA,MACT,WAAW,OAAO,MAAM,UAAU;AAC9B,cAAM,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,MAAM,OAAmB,CAAC;AAAA,MAC9D;AAAA,IACJ;AAGA,eAAW,KAAK,KAAK,MAAM,QAAQ;AAC/B,YAAM,cAAc,QAAQ,IAAI,EAAE,EAAE;AACpC,UAAI,CAAC,YAAa;AAClB,UAAI,CAAC,MAAM,QAAQ,EAAE,OAAO,EAAG;AAE/B,iBAAW,KAAK,EAAE,SAAS;AACvB,cAAM,KAAK;AAAA,UACP,IAAI,EAAE;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE;AAAA,QACb,CAAC;AAED,cAAM,IAAS;AAAA,UACX,MAAM,EAAE;AAAA,UACR,IAAI,EAAE;AAAA,UACN,MAAM;AAAA,UACN,MAAM,EAAE,YAAY,EAAE,GAAG;AAAA,QAC7B;AACA,cAAM,KAAK,CAAc;AAAA,MAC7B;AAAA,IACJ;AAGA,eAAW,KAAK,KAAK,MAAM,SAAS;AAChC,iBAAW,OAAM,OAAE,aAAF,YAAc,CAAC,GAAG;AAC/B,cAAM,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,MAAM,UAAsB,CAAC;AAAA,MAClE;AACA,iBAAW,OAAM,OAAE,aAAF,YAAc,CAAC,GAAG;AAC/B,cAAM,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,MAAM,UAAsB,CAAC;AAAA,MAClE;AAAA,IACJ;AAGA,UAAM,UAAS,UAAK,MAAM,yBAAX,YAAmC,CAAC;AACnD,UAAM,UAAS,UAAK,MAAM,yBAAX,YAAmC,CAAC;AAEnD,UAAM,iBAAiB,CACnB,OACA,eACA,SACC;AA7Pb,UAAAC;AA8PY,YAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,YAAM,gBACFA,MAAA,+BAAO,YAAP,OAAAA,MACC,KAAK,UAAU,IAAI,KAAK,IAAI,QAAQ;AACzC,UAAI,CAAC,aAAc;AAGnB,YAAM,WACF,SAAS,QAAQ,IAAI,MAAM,OAAO,IAC5B,QACA;AAEV,YAAM,OAAY,QACZ,QAAQ,IAAI,MAAM,OAAO,IACrB;AAAA,QACI,KAAK;AAAA,QACL,YAAY,MAAM;AAAA,QAClB,cAAc;AAAA,MAClB,IACA;AAAA,QACI,KAAK;AAAA,QACL,YAAY,MAAM;AAAA,QAClB,cAAc;AAAA,MAClB,IACJ,EAAE,KAAK,eAAe;AAE5B,YAAM,IAAS,EAAE,MAAM,UAAU,IAAI,eAAe,MAAM,KAAK;AAC/D,YAAM,KAAK,CAAc;AAAA,IAC7B;AAEA,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,iBAAW,OAAO,oBAAO,CAAC;AACtB,uBAAe,OAAO,KAAK,SAAqB;AAAA,IACxD;AACA,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,iBAAW,OAAO,oBAAO,CAAC;AACtB,uBAAe,OAAO,KAAK,SAAqB;AAAA,IACxD;AAEA,WAAO,EAAE,OAAO,MAAM;AAAA,EAC1B;AAAA,EAEA,eAA6B;AAxSjC;AA0SQ,UAAM,WAAW,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3D,UAAM,YAAY,oBAAI,IAAY;AAClC,SAAK,gBAAgB,QAAQ,CAAC,IAAI,QAAQ,UAAU,IAAI,GAAG,CAAC;AAI5D,UAAM,gBAAgB,oBAAI,IAAY;AACtC,UAAM,mBAAmB,oBAAI,IAAY;AACzC,eAAW,KAAK,KAAK,MAAM,SAAS;AAChC,iBAAW,OAAM,OAAE,aAAF,YAAc,CAAC,EAAG,eAAc,IAAI,EAAE;AACvD,iBAAW,OAAM,OAAE,aAAF,YAAc,CAAC,EAAG,kBAAiB,IAAI,EAAE;AAAA,IAC9D;AAEA,UAAM,UAAS,UAAK,MAAM,yBAAX,YAAmC,CAAC;AACnD,UAAM,UAAS,UAAK,MAAM,yBAAX,YAAmC,CAAC;AACnD,UAAM,oBAAoB,oBAAI,IAAY;AAC1C,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,wBAAwB,oBAAI,IAAY;AAE9C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7C,qBAAe,IAAI,GAAG;AACtB,YAAM,QAAQ,KAAK,gBAAgB,IAAI,GAAG;AAC1C,UAAI,MAAO,uBAAsB,IAAI,MAAM,OAAO;AAClD,iBAAW,OAAO,oBAAO,CAAC,GAAG;AACzB,0BAAkB,IAAI,GAAG;AAAA,MAC7B;AAAA,IACJ;AACA,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7C,qBAAe,IAAI,GAAG;AACtB,YAAM,QAAQ,KAAK,gBAAgB,IAAI,GAAG;AAC1C,UAAI,MAAO,uBAAsB,IAAI,MAAM,OAAO;AAClD,iBAAW,OAAO,oBAAO,CAAC,GAAG;AAIzB,aAAK;AAAA,MACT;AAAA,IACJ;AAEA,UAAM,WAAW,oBAAI,IAAY;AACjC,eAAW,KAAK,KAAK,MAAM,QAAQ;AAC/B,YAAM,IAAI,EAAE;AACZ,UAAI,MAAM,QAAQ,CAAC,EAAG,GAAE,QAAQ,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC;AAAA,eAC/C,OAAO,MAAM,SAAU,UAAS,IAAI,CAAC;AAAA,IAClD;AAEA,UAAM,SAAS,KAAK,MAAM,OAAO,OAAO,CAAC,MAAM;AAxVvD,UAAAA;AAyVY,YAAM,cAAaA,MAAA,EAAE,iBAAF,OAAAA,MAAkB,YAAY;AACjD,UAAI,CAAC,UAAW,QAAO;AAEvB,YAAM,QAAQ,CAAC,CAAC,EAAE;AAClB,YAAM,WACF,cAAc,IAAI,EAAE,EAAE,KAAK,kBAAkB,IAAI,EAAE,EAAE;AACzD,YAAM,aACF,sBAAsB,IAAI,EAAE,EAAE,KAAK,eAAe,IAAI,EAAE,EAAE;AAC9D,YAAM,WAAW,iBAAiB,IAAI,EAAE,EAAE;AAG1C,aAAO,SAAS,YAAY,cAAc,CAAC;AAAA,IAC/C,CAAC;AAGD,UAAM,iBAAiB,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEtD,UAAM,eAAe,CAAC,QAAmC;AACrD,UAAI,CAAC,IAAK,QAAO;AACjB,YAAMC,OAAgC,CAAC;AACvC,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAE1C,cAAM,aAAa,UAAU,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG;AACzD,YAAI,CAAC,WAAY;AAEjB,cAAM,WAAW,oBAAO,CAAC,GAAG;AAAA,UAAO,CAAC,QAChC,eAAe,IAAI,GAAG;AAAA,QAC1B;AACA,YAAI,QAAQ,OAAQ,CAAAA,KAAI,GAAG,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAAA,MAC9D;AACA,aAAO,OAAO,KAAKA,IAAG,EAAE,SAASA,OAAM;AAAA,IAC3C;AAEA,UAAM,uBAAuB;AAAA,MACzB,KAAK,MAAM;AAAA,IACf;AACA,UAAM,uBAAuB;AAAA,MACzB,KAAK,MAAM;AAAA,IACf;AAGA,UAAM,MAAoB;AAAA,MACtB,SAAS,KAAK,MAAM,QAAQ,MAAM;AAAA,MAClC;AAAA,MACA,GAAI,wBAAwB,EAAE,qBAAqB;AAAA,MACnD,GAAI,wBAAwB,EAAE,qBAAqB;AAAA,MACnD,iBAAgB,UAAK,MAAM,mBAAX,YAA6B;AAAA;AAAA,MAE7C,GAAI,KAAK,MAAM,YACT,EAAE,WAAW,KAAK,MAAM,UAAU,IAClC,CAAC;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,SAA4B;AACxB,WAAO,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,aAAa;AACT,WAAOF,WAAU,KAAK,OAAO;AAAA,EACjC;AAAA,EAEA,cAAc,OAAe,cAAmC;AAxZpE;AAyZQ,WAAO,qBAAqB,KAAK,OAAO,OAAO;AAAA,MAC3C,cAAc,IAAI;AAAA,SACd,2CAAgB,KAAK,QAAQ,uBAA7B,YAAmD,CAAC;AAAA,MACxD;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,aAAsB;AAClB,QAAI,CAAC,KAAK,SAAU,MAAK,WAAW,aAAa,KAAK,SAAS,CAAC;AAEhE,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAIQ,iBAAuB;AAC3B,SAAK,QAAQ,MAAM;AACnB,SAAK,UAAU,MAAM;AACrB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,WAAW;AAEhB,eAAW,KAAK,KAAK,MAAM,QAAS,MAAK,QAAQ,IAAI,EAAE,IAAI,CAAC;AAC5D,eAAW,KAAK,KAAK,MAAM,QAAQ;AAC/B,WAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAC1B,UAAI,MAAM,QAAQ,EAAE,OAAO,GAAG;AAC1B,mBAAW,KAAK,EAAE;AACd,eAAK,gBAAgB,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AACJ;AAGA,SAAS,YAAY,GAAoD;AACrE,MAAI,CAAC,EAAG,QAAO,oBAAI,IAAI;AACvB,MAAI,aAAa,IAAK,QAAO,IAAI,IAAI,MAAM,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC;AAC9D,SAAO,IAAI,IAAK,EAAe,IAAI,MAAM,CAAC;AAC9C;;;ACxWO,SAAS,0BAA0B,QAMZ;AA5F9B;AA6FI,QAAM,EAAE,SAAS,UAAU,MAAM,IAAI;AACrC,QAAM,aAAa,oBAAoB,OAAO,UAAU;AACxD,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,kBAAkB,IAAI,KAAI,YAAO,oBAAP,YAA0B,CAAC,CAAC;AAE5D,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,QAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,QAAM,UAAU,IAAI,MAAK,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACnE,QAAM,MAAM,QAAQ,IAAI,KAAK;AAE7B,QAAM,mBAAmB,QAAQ,cAAc,OAAO,CAAC,CAAC;AACxD,QAAM,iBAAiB,iBAClB,IAAI,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC,EAC/B,OAAO,OAAO;AAEnB,QAAM,UAAU,eAAe,cAAc;AAC7C,QAAM,cAAyC,CAAC;AAChD,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,UAAU,SAAS;AAC1B,UAAM,eACF,OAAO,SAAS,WACV,CAAC,GAAG,OAAO,OAAO,KAAK,OAAO,EAAE,EAAE,IAClC,CAAC,OAAO,OAAO;AAEzB,UAAM,gBAAgB,QACjB,cAAc,OAAO,YAAY,EACjC,IAAI,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC,EAC/B,OAAO,OAAO;AAEnB,UAAM,yBAAyB,cAC1B,IAAI,CAAC,UAAU,MAAM,EAAE,EACvB,OAAO,CAAC,YAAY,gBAAgB,IAAI,OAAO,CAAC;AAErD,eAAW,WAAW,wBAAwB;AAC1C,YAAM,MAAM,YAAY,KAAK,IAAI,OAAO;AACxC,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AACZ,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,UAAU,OAAO,8CAA8C,WAAW,IAAI;AAAA,QACvF,kBAAkB;AAAA,UACd,MAAM,OAAO;AAAA,UACb,IAAI,OAAO;AAAA,UACX,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,QAClB;AAAA,QACA,iBAAiB,CAAC,OAAO;AAAA,MAC7B,CAAC;AAAA,IACL;AAEA,UAAM,aAAa,cAAc;AAAA,MAAQ,CAAC,UACtC,uBAAuB,OAAO,QAAQ;AAAA,IAC1C;AACA,QAAI,WAAW,UAAU,EAAG;AAE5B,UAAM,UAAU,WAAW,OAAO,CAAC,MAAM,YAAY;AACjD,UAAI,QAAQ,SAAS,KAAK,MAAM;AAC5B,eAAO,QAAQ,OAAO,KAAK,OAAO,UAAU;AAAA,MAChD;AACA,YAAM,UAAU,GAAG,KAAK,OAAO,IAAI,KAAK,MAAM;AAC9C,YAAM,aAAa,GAAG,QAAQ,OAAO,IAAI,QAAQ,MAAM;AACvD,aAAO,aAAa,UAAU,UAAU;AAAA,IAC5C,CAAC;AAED,eAAW,aAAa,YAAY;AAChC,UAAI,UAAU,WAAW,QAAQ,OAAQ;AACzC,UAAI,UAAU,YAAY,QAAQ,QAAS;AAC3C,UAAI,iBAAiB,YAAY,QAAQ,MAAM,UAAU,IAAI,GAAG;AAC5D;AAAA,MACJ;AAEA,YAAM,MAAM,cAAc,OAAO,SAAS,WAAW,UAAU;AAC/D,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AAEZ,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,SAAS,gBAAgB,OAAO;AAAA,QAChC,UAAU,gBAAgB,SAAS;AAAA,QACnC,QAAQ,WAAW;AAAA,QACnB,WAAW,SAAS,aAAa,WAAW,MAAM;AAAA,QAClD,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,GAAG;AAAA,QACrB;AAAA,QACA,kBAAkB;AAAA,UACd,MAAM,OAAO;AAAA,UACb,IAAI,OAAO;AAAA,UACX,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,QAClB;AAAA,QACA,iBAAiB;AAAA,MACrB,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,eAAe,QAA2B;AA1MnD;AA2MI,QAAM,UAAoB,CAAC;AAE3B,aAAW,SAAS,QAAQ;AACxB,QAAI,CAAC,SAAS,KAAK,EAAG;AAEtB,QAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC1D,iBAAW,UAAU,MAAM,SAAS;AAChC,gBAAQ,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,SAAS,MAAM;AAAA,UACf,QAAO,YAAO,UAAP,YAAgB,OAAO;AAAA,QAClC,CAAC;AAAA,MACL;AACA;AAAA,IACJ;AAEA,YAAQ,KAAK;AAAA,MACT,MAAM;AAAA,MACN,IAAI,MAAM;AAAA,MACV,SAAS,MAAM;AAAA,MACf,QAAO,WAAM,UAAN,YAAe,MAAM;AAAA,IAChC,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAEA,SAAS,uBACL,OACA,UACgB;AA1OpB;AA2OI,QAAM,UAAU,mBAAmB,OAAO,QAAQ;AAClD,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,MAAI,aAAa,KAAK,GAAG;AACrB,UAAM,cACF,QAAQ,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,MAAM,CAAC,IACpD,QAAQ;AACZ,WAAO;AAAA,MACH;AAAA,QACI,SAAS;AAAA,QACT,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,QAAO,WAAM,UAAN,YAAe,MAAM;AAAA,QAC5B,MAAM;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,IAC5B,SAAS;AAAA,IACT,QAAQ,OAAO;AAAA,IACf,SAAS,MAAM;AAAA,IACf,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,YAAY,OAAO;AAAA,IACnB,SAAS,CAAC,MAAM;AAAA,EACpB,EAAE;AACN;AAEA,SAAS,mBACL,OACA,UACY;AA5QhB;AA6QI,QAAM,UAAwB,CAAC;AAE/B,MAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC1D,eAAW,UAAU,MAAM,SAAS;AAChC,YAAMG,QAAO,eAAc,YAAO,iBAAP,YAAuB,MAAM,cAAc,MAAM;AAC5E,UAAIA,UAAS,OAAQ;AACrB,UAAI,OAAO,eAAe,UAAa,OAAO,eAAe,MAAM;AAC/D;AAAA,MACJ;AACA,YAAMC,OAAM,qBAAqB,UAAU,OAAO,UAAU;AAC5D,UAAI,CAACA,QAAO,OAAOA,KAAI,SAAS,YAAY,CAAC,OAAO,SAASA,KAAI,IAAI,GAAG;AACpE;AAAA,MACJ;AACA,cAAQ,KAAK;AAAA,QACT,MAAM;AAAA,QACN,IAAI,OAAO;AAAA,QACX,SAAS,MAAM;AAAA,QACf,QAAO,YAAO,UAAP,YAAgB,OAAO;AAAA,QAC9B,YAAY,OAAO;AAAA,QACnB,MAAMA,KAAI;AAAA,MACd,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AAEA,QAAM,OAAO,cAAc,MAAM,cAAc,MAAM;AACrD,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,MAAM,eAAe,UAAa,MAAM,eAAe,KAAM,QAAO;AAExE,QAAM,MAAM,qBAAqB,UAAU,MAAM,UAAU;AAC3D,MAAI,CAAC,OAAO,OAAO,IAAI,SAAS,YAAY,CAAC,OAAO,SAAS,IAAI,IAAI,GAAG;AACpE,WAAO;AAAA,EACX;AAEA,UAAQ,KAAK;AAAA,IACT,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,QAAO,WAAM,UAAN,YAAe,MAAM;AAAA,IAC5B,YAAY,MAAM;AAAA,IAClB,MAAM,IAAI;AAAA,EACd,CAAC;AACD,SAAO;AACX;AAEA,SAAS,SAAS,OAAuB;AACrC,MAAK,MAAc,WAAW,KAAM,QAAO;AAC3C,SAAO,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS;AAClE;AAEA,SAAS,cACL,MACA,UACW;AACX,SAAO,SAAS,UAAU,SAAS,YAAY,OAAO;AAC1D;AAEA,SAAS,gBAAgB,WAA2B;AAChD,SAAO;AAAA,IACH,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB,OAAO,UAAU;AAAA,IACjB,SAAS,UAAU;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,MAAM,UAAU;AAAA,EACpB;AACJ;AAEA,SAAS,cACL,OACA,SACA,WACA,YACM;AACN,QAAM,SAAS,SAAS,aAAa,IAAI,WAAW,GAAG,KAAK;AAC5D,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,GAAG,WAAW,IAAI,GAAG,MAAM;AAAA,EAC/B,EAAE,KAAK,GAAG;AACd;AAEA,SAAS,cAAc,KAAmB;AAnW1C;AAoWI,UAAO,sCAAK,UAAL,YAAc,2BAAK,OAAnB,YAAyB;AACpC;AAEA,SAAS,oBACL,QACA,SACA,WACA,OACM;AA5WV;AA6WI,QAAM,eAAe,IAAG,aAAQ,UAAR,YAAiB,QAAQ,MAAM,KAAK,QAAQ,IAAI;AACxE,QAAM,iBAAiB,IAAG,eAAU,UAAV,YAAmB,UAAU,MAAM,KAAK,UAAU,IAAI;AAEhF,UAAQ,OAAO,MAAM;AAAA,IACjB,KAAK;AACD,aAAO,0BAA0B,KAAK,MAAM,cAAc,uBAAuB,YAAY;AAAA,IACjG,KAAK;AACD,aAAO,0BAA0B,KAAK,MAAM,cAAc,qBAAqB,OAAO,GAAG,2BAA2B,YAAY;AAAA,IACpI,KAAK;AACD,aAAO,0BAA0B,KAAK,MAAM,cAAc,mBAAmB,OAAO,GAAG,QAAQ,YAAY;AAAA,IAC/G,KAAK;AACD,aAAO,0BAA0B,KAAK,MAAM,cAAc,qBAAqB,OAAO,GAAG,gBAAgB,YAAY;AAAA,EAC7H;AACJ;;;ACnVA,SAAS,sBAAsB,KAA0C;AACrE,QAAM,IAAI;AAEV,QAAM,WACF,EAAE,uBAAuB,QACzB,EAAE,uBAAuB,QACzB,EAAE,aAAa;AAEnB,QAAM,YACF,OAAO,EAAE,wBAAwB,WAC3B,EAAE,sBACF,OAAO,EAAE,wBAAwB,WAC/B,EAAE,sBACF,OAAO,EAAE,cAAc,WACrB,EAAE,YACF;AAEd,QAAM,WACF,OAAO,EAAE,uBAAuB,WAC1B,EAAE,qBACF,OAAO,EAAE,uBAAuB,WAC9B,EAAE,qBACF,OAAO,EAAE,aAAa,WACpB,EAAE,WACF;AAEd,QAAM,mBACF,EAAE,qBAAqB,QAAQ,EAAE,+BAA+B;AAEpE,QAAM,wBACF,EAAE,0BAA0B,QACtB,QACA,EAAE,oCAAoC;AAEhD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAKO,SAAS,SACZ,OACA,MAAwB,CAAC,GACR;AAxFrB;AAyFI,QAAM,SAA4B,CAAC;AACnC,QAAM,cAA4B,SAAI,eAAJ,YAAkB,CAAC;AACrD,QAAM,eAA4B,IAAI;AAAA,KAClC,SAAI,uBAAJ,YAA0B,CAAC;AAAA,EAC/B;AAEA,QAAM,OAAc,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AACpE,QAAM,SAAkB,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AAEtE,QAAM,UAA4B,oBAAI,IAAiB;AACvD,QAAM,YAAgC,oBAAI,IAAmB;AAE7D,aAAW,KAAK,KAAM,SAAQ,IAAI,EAAE,IAAI,CAAC;AACzC,aAAW,KAAK,OAAQ,WAAU,IAAI,EAAE,IAAI,CAAC;AAE7C,QAAM,IAAmB;AAAA,IACrB;AAAA,IACA,UAAS,SAAI,YAAJ,YAAe,aAAa,KAAK;AAAA,IAC1C,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB,oBAAI,IAAY;AAAA,IACrC;AAAA,IACA;AAAA,IACA,oBAAoB,CAAC,WAA4B,CAAC;AAAA,EACtD;AAGA,oBAAkB,CAAC;AAGnB,mBAAiB,CAAC;AAGlB,qBAAmB,CAAC;AAGpB,IAAE,qBAAqB,yBAAyB,CAAC;AAEjD,QAAM,SAAS,sBAAsB,GAAG;AACxC,qBAAmB,GAAG,MAAM;AAG5B;AAAA,IACI,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE,QAAQ;AAAA,IACV,EAAE;AAAA,IACF,EAAE;AAAA,EACN;AAGA,6BAA2B,CAAC;AAG5B,yBAAuB,CAAC;AAGxB,gBAAc,CAAC;AAEf,MAAI,OAAO,KAAK,UAAU,EAAE,SAAS,KAAK,KAAK,SAAS,GAAG;AACvD,UAAM,UAAU,cAAc,EAAE,WAAW,CAAC;AAC5C,YAAQ,KAAK,KAAK;AAElB,eAAW,OAAO,MAAM;AACpB,YAAM,QAAQ,0BAA0B;AAAA,QACpC;AAAA,QACA,UAAU;AAAA,QACV,OAAO,IAAI;AAAA,QACX,aAAY,SAAI,qBAAJ,mBAAsB;AAAA,QAClC,iBAAiB,EAAE;AAAA,MACvB,CAAC;AAED,iBAAW,QAAQ,OAAO;AACtB,YAAI,KAAK,SAAS,aAAc;AAChC,eAAO,KAAK;AAAA,UACR,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,kBAAkB,KAAK;AAAA,YACvB,SAAS,KAAK;AAAA,YACd,UAAU,KAAK;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB,iBAAiB,KAAK;AAAA,UAC1B;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAGA,sBAAoB,CAAC;AAGrB,uBAAqB,CAAC;AAGtB,6BAA2B,CAAC;AAG5B,wBAAsB,CAAC;AAGvB,oBAAkB,CAAC;AAEnB,SAAO,EAAE;AACb;;;AC5KA,IAAM,mBAA+C;AAAA,EACjD,sBAAsB;AAAA,EACtB,YAAY,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,EAC1C,mBAAmB;AAAA,EACnB,MAAM;AACV;AAyCO,SAAS,uBACZ,OACA,UACA,UACuB;AAjF3B;AAkFI,QAAM,IAAI,EAAE,GAAG,kBAAkB,GAAI,8BAAY,CAAC,EAAG;AACrD,QAAM,MAA+B,CAAC;AACtC,QAAM,MAAK,WAAM,cAAN,YAAmB,CAAC;AAC/B,QAAM,cAAc,CAAC,MAAoB,OAAO,UAAU,CAAC;AAG3D,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,SAAQ,QAAG,UAAH,YAAY,CAAC,CAAC,GAAG;AACzD,UAAM,EAAE,SAAS,YAAY,IAAI,eAAe,OAAO,MAAM;AAC7D,QAAI,CAAC,SAAS;AACV,UAAI,KAAK;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,MACZ,CAAC;AACD;AAAA,IACJ;AACA,eAAW,QAAQ,MAAM;AACrB,YAAM,MAAM,OAAO,UAAU,IAAI;AACjC,UAAI,CAAC,KAAK;AACN,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AACA,UAAI,OAAO,IAAI,MAAM,OAAO,OAAO,GAAG;AAClC,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AACA,UAAI,CAAC,WAAW,EAAE,YAAY,YAAY,OAAO,GAAG,IAAI,IAAI,GAAG;AAC3D,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AAEA,UAAI,YAAY,WAAW,GAAG;AAC1B,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AACA,UAAI,UAAU;AACd,UAAI,UAAU;AACd,iBAAW,SAAS,aAAa;AAC7B,cAAM,KAAK,EAAE,uBACP,wBAAwB,OAAO,EAAE,UAAU,MAAM,GAAG,GAAG,IACvD;AACN,YAAI,GAAI,WAAU;AAAA,aACb;AACD,oBAAU;AACV,cAAI,KAAK;AAAA,YACL,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ;AAAA,UACZ,CAAC;AAAA,QACL;AAAA,MACJ;AAEA,WAAK;AACL,WAAK;AAAA,IACT;AAAA,EACJ;AAGA,aAAW,CAAC,SAAS,IAAI,KAAK,OAAO,SAAQ,QAAG,WAAH,YAAa,CAAC,CAAC,GAAG;AAC3D,eAAW,QAAQ,MAAM;AACrB,YAAM,MAAM,OAAO,UAAU,IAAI;AACjC,UAAI,CAAC,KAAK;AACN,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AACA,UAAI,OAAO,IAAI,MAAM,OAAO,OAAO,GAAG;AAClC,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AACD;AAAA,MACJ;AACA,UAAI,CAAC,WAAW,EAAE,YAAY,YAAY,OAAO,GAAG,IAAI,IAAI,GAAG;AAC3D,YAAI,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,UACA,WAAW;AAAA,UACX,QAAQ;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAIA,SAAS,OACL,KACA,IACkB;AAhNtB;AAiNI,MAAI,OAAO,UAAa,OAAO,KAAM,QAAO;AAC5C,QAAM,IAAI,OAAO,KAAK,EAAE;AACxB,UAAO,4BAAG,SAAH,YAAW;AACtB;AAEA,SAAS,WACL,QACA,aACA,UACO;AACP,MAAI,OAAO,aAAa,YAAY,CAAC,OAAO,SAAS,QAAQ;AACzD,WAAO;AACX,MAAI,OAAO,gBAAgB,YAAY,CAAC,OAAO,SAAS,WAAW;AAC/D,WAAO;AACX,SAAO,iBAAiB,oBAAoB,MAAM,GAAG,aAAa,QAAQ;AAC9E;AAEA,SAAS,OACL,KACA,IACgC;AAChC,SAAO,qBAAqB,KAAK,EAAE;AACvC;AAEA,SAAS,iBAAiB,KAA2B,QAAyB;AAzO9E;AA2OI,QAAM,aAAiC,eAAI,UAAJ,mBAAY,YAAZ,mBAAqB;AAC5D,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,cAAc,MAAO,QAAO;AAGhC,QAAM,SAAmB,IAAY,MAAM;AAC3C,SAAO,WAAW;AACtB;AAEA,SAAS,wBACL,OACA,KACA,KACO;AACP,QAAM,MAAM,IAAI,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACxD,QAAM,MAA2C,2BAAK;AACtD,MAAI,CAAC,IAAK,QAAO;AAGjB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,UAAU,QAAQ,CAAC,iBAAiB,KAAK,GAAG,GAAG;AAC/C,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,eACL,OACA,QAKF;AAEE,QAAM,MAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACrD,MAAI,KAAK;AACL,WAAO,EAAE,SAAS,IAAI,YAAmB,aAAa,CAAC,IAAI,EAAE,EAAE;AAAA,EACnE;AAEA,QAAM,QAAQ,MAAM,OAAO;AAAA,IACvB,CAAC,MACG,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,EACzE;AACA,MAAI,CAAC,MAAO,QAAO,EAAE,aAAa,CAAC,GAAG,iBAAiB,kBAAkB;AACzE,QAAM,MAAM,MAAM,QAAS,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACtD,QAAM,WAAW,eAAe,MAAM,OAAO;AAC7C,SAAO,EAAE,SAAS,IAAI,YAAmB,aAAa,SAAS;AACnE;AAEA,SAAS,eAAe,MAA+C;AACnE,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI;AACrD;AAYO,SAAS,qBAAqB,QAWlB;AAzTnB;AA0TI,QAAM,IAAI,EAAE,GAAG,kBAAkB,IAAI,YAAO,aAAP,YAAmB,CAAC,EAAG;AAC5D,QAAM,EAAE,SAAS,QAAQ,OAAO,SAAS,IAAI;AAC7C,QAAM,MAAK,YAAO,cAAP,YAAoB,CAAC;AAChC,QAAM,WAAW,IAAI,MAAa,YAAO,YAAP,YAAkB,CAAC,GAAG,IAAI,MAAM,CAAC;AACnE,WAAS,IAAI,OAAO,OAAO,CAAC;AAC5B,QAAM,UAAS,YAAO,WAAP,YAAiB;AAGhC,QAAM,QAA0B,CAAC;AACjC,MAAI,YAAU,QAAG,UAAH,mBAAW,SAAS,OAAM,KAAK,GAAG,MAAM,MAAM,CAAC;AAC7D,OAAI,QAAG,WAAH,mBAAY,SAAU,OAAM,KAAK,GAAG,OAAO,OAAO,CAAC;AAEvD,MAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAE3B,QAAM,cAAc,OAAO,UAAU,OAAO;AAC5C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAA2B,CAAC;AAElC,aAAW,QAAQ,OAAO;AACtB,eAAW,QAAQ,MAAM;AACrB,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,SAAS,IAAI,GAAG,EAAG;AACvB,UAAI,UAAU,KAAK,IAAI,GAAG,EAAG;AAC7B,WAAK,IAAI,GAAG;AAEZ,YAAM,MAAM,OAAO,UAAU,IAAI;AACjC,UAAI,CAAC,IAAK;AAGV,UAAI,CAAC,WAAW,EAAE,YAAY,aAAa,IAAI,IAAI,EAAG;AAGtD,UAAI,EAAE,wBAAwB,OAAO;AACjC,cAAM,KAAK;AAAA,UACP;AAAA,UACA,EAAE,OAAO,OAAO,OAAO,SAAS;AAAA,UAChC;AAAA,QACJ;AACA,YAAI,CAAC,GAAI;AAAA,MACb;AAEA,eAAS,KAAK,IAAI;AAAA,IACtB;AAAA,EACJ;AAGA,MAAI,EAAE,sBAAsB,YAAY;AACpC,aAAS,KAAK,CAAC,GAAG,MAAM;AAzWhC,UAAAC,KAAAC;AA0WY,YAAM,MAAKD,MAAA,OAAO,UAAU,CAAC,MAAlB,OAAAA,MAAuB;AAClC,YAAM,MAAKC,MAAA,OAAO,UAAU,CAAC,MAAlB,OAAAA,MAAuB;AAClC,aAAO,KAAK;AAAA,IAChB,CAAC;AAAA,EACL;AAIA,MAAI,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,GAAG;AACvD,WAAO,SAAS,MAAM,GAAG,OAAO,KAAK;AAAA,EACzC;AACA,SAAO;AACX;AAEO,SAAS,4BACZ,OACA,QAIF;AACE,QAAM,EAAE,SAAS,YAAY,IAAI,eAAe,OAAO,MAAM;AAC7D,SAAO,EAAE,SAAS,YAAY;AAClC;;;AClSA,IAAM,OAAO,CAAC,MAAgC,OAAO,MAAM,WAAW,IAAI,EAAE;AAE5E,IAAM,aAAa,CAAC,MAAkC;AAClD,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,SAAO,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9C;AAEO,SAAS,gBAAgB,SAA6B;AAtG7D;AAuGI,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,UAAU,QAAQ,WAAW;AAEnC,QAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAEhC,QAAM,UAAU,IAAI,IAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAM,YAAY,IAAI,IAAmB,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAErE,QAAM,aAAa,oBAAI,IAAyB;AAChD,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,aAAW,KAAK,QAAQ;AACpB,eAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,iBAAW,IAAI,EAAE,IAAI,CAAC;AACtB,yBAAmB,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,IACrC;AAAA,EACJ;AAEA,QAAM,aAAa,oBAAI,IAAgC;AACvD,QAAM,eAAe,oBAAI,IAAsB;AAC/C,aAAW,KAAK,MAAM;AAClB,eAAW,IAAI,EAAE,IAAI,EAAE,OAAO;AAC9B,QAAI,EAAE,SAAS;AACX,YAAM,OAAM,kBAAa,IAAI,EAAE,OAAO,MAA1B,YAA+B,CAAC;AAC5C,UAAI,KAAK,EAAE,EAAE;AACb,mBAAa,IAAI,EAAE,SAAS,GAAG;AAAA,IACnC;AAAA,EACJ;AAGA,QAAM,YAAY,oBAAI,IAAqB;AAC3C,QAAM,eAAe,oBAAI,IAAqB;AAC9C,QAAM,iBAAiB,oBAAI,IAAuB;AAClD,QAAM,kBAAkB,oBAAI,IAAwB;AAEpD,QAAM,oBAAoB,oBAAI,IAQ5B;AACF,QAAM,mBAAmB,oBAAI,IAAgC;AAC7D,QAAM,kBAAkB,oBAAI,IAAiC;AAE7D,QAAM,oBAAoB,oBAAI,IAA+B;AAC7D,QAAM,sBAAsB,oBAAI,IAAgC;AAEhE,QAAM,WAAW,OAAO,OAAO,oBAAI,IAAY,CAAC;AAEhD,QAAM,0BAA0B,CAC5B,SACA,UACU;AACV,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,OAAO,SAAS,SAAU,QAAO,SAAS;AAC9C,WAAO,KAAK,SAAS,KAAK;AAAA,EAC9B;AAEA,QAAM,qBAAqB,CACvB,IACA,UACA,OACA,gBACuB;AACvB,QAAI,CAAC,SAAS,aAAa;AACvB,YAAMC,WAAuB,CAAC;AAC9B,iBAAW,SAAS,UAAU;AAC1B,cAAM,OAAO,SAAS,KAAK;AAC3B,YAAI,KAAM,CAAAA,SAAQ,KAAK,IAAI;AAAA,MAC/B;AACA,aAAO,OAAO,OAAOA,QAAO;AAAA,IAChC;AAEA,UAAM,UAAuB,CAAC;AAC9B,UAAM,UAAU,QAAQ,cAAc,OAAO,CAAC,EAAE,CAAC;AAEjD,eAAW,WAAW,SAAS;AAC3B,YAAM,OAAO,SAAS,OAAO;AAC7B,UAAI,CAAC,KAAM;AACX,YAAM,WACF,SAAS,IAAI,OAAO,KACpB,wBAAwB,SAAS,KAAK;AAC1C,cAAQ,KAAK,WAAW,OAAO,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC;AAAA,IACjE;AAEA,WAAO,OAAO,OAAO,OAAO;AAAA,EAChC;AAGA,QAAM,aAAa,CAAC,UAAuC;AACvD,UAAM,SAAS,gBAAgB,IAAI,KAAK;AACxC,QAAI,OAAQ,QAAO;AAEnB,UAAM,MAAM,oBAAI,IAAY;AAC5B,UAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAI,MAA0B;AAE9B,WAAO,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B,UAAI,IAAI,GAAG;AACX,YAAM,IAAI,GAAG;AACb,YAAM,WAAW,IAAI,GAAG;AAAA,IAC5B;AAEA,oBAAgB,IAAI,OAAO,GAAG;AAC9B,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,CAAC,QAAgBC,UAAkC;AACnE,QAAI,WAAWA,MAAM,QAAO,CAAC,MAAM;AAEnC,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAkB,CAAC;AACzB,QAAI,MAA0BA;AAE9B,WAAO,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B,YAAM,KAAK,GAAG;AACd,UAAI,QAAQ,OAAQ,QAAO,MAAM,QAAQ;AACzC,YAAM,IAAI,GAAG;AACb,YAAM,WAAW,IAAI,GAAG;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CACpB,QACA,YACoE;AACpE,QAAI,WAAW;AACX,aAAO,EAAE,MAAM,QAAQ,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,MAAM;AAGnE,UAAM,OAAO,YAAY,QAAQ,OAAO;AACxC,QAAI;AACA,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ,KAAK,WAAW;AAAA,MAC5B;AAGJ,UAAM,KAAK,YAAY,SAAS,MAAM;AACtC,QAAI,IAAI;AAEJ,YAAM,IAAI,GAAG,MAAM,EAAE,QAAQ;AAC7B,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,SAAS;AAAA,QAClB,QAAQ,EAAE,WAAW;AAAA,MACzB;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,aAAa,MAAM,CAAC,GAAG,OAAO,IAAI,QAAQ,MAAM;AAAA,EACnE;AAGA,QAAM,eAAe,CAAC,oBAAuC;AACzD,WAAO,CAAC,YAAsD;AAC1D,YAAM,SAAS,KAAK,OAAO;AAC3B,YAAM,OAAsB,CAAC;AAE7B,iBAAW,WAAW,iBAAiB;AACnC,cAAM,QAAQ,OAAO,OAAO;AAC5B,YAAI,CAAC,MAAO;AAEZ,cAAM,MAAM,gBAAgB,QAAQ,OAAO;AAC3C,aAAK,KAAK;AAAA,UACN,MAAM,IAAI;AAAA,UACV,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,QAAQ,IAAI;AAAA,UACZ,MAAM,IAAI;AAAA,QACd,CAAC;AAAA,MACL;AAEA,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,kBAAkB,CACpB,gBACE;AAAA,IACF,UAAU;AAAA,IAEV,aAAa,SAAoC;AAC7C,aAAO,WAAW,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,IAChE;AAAA,IAEA,eAAe,SAAoC;AAC/C,aAAO,WAAW,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,IAClE;AAAA,IAEA,SAAS,SAAoC;AACzC,aAAO,WAAW,OAAO,EAAE;AAAA,QACvB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,SAAS,CAAC,OAAoC;AAtTxD,QAAAC,KAAAC;AAuTQ,UAAM,SAAS,aAAa,IAAI,EAAE;AAClC,QAAI,OAAQ,QAAO;AAEnB,UAAM,MAAM,QAAQ,IAAI,EAAE;AAC1B,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,WAAW,OAAO,OAAO,IAAI,KAAID,MAAA,IAAI,aAAJ,OAAAA,MAAgB,CAAC,CAAC,CAAC;AAC1D,UAAM,WAAW,OAAO,OAAO,IAAI,KAAIC,MAAA,IAAI,aAAJ,OAAAA,MAAgB,CAAC,CAAC,CAAC;AAE1D,UAAM,aAAa,aAAa,CAAC,EAAE,CAAC;AAEpC,UAAM,OAAgB;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA,GAAG,gBAAgB,UAAU;AAAA,MAE7B,SAAS;AACL,cAAM,MAAM,WAAW,IAAI,EAAE;AAC7B,eAAO,MAAM,OAAO,GAAG,IAAI;AAAA,MAC/B;AAAA,MAEA,WAAW;AAjVvB,YAAAD;AAkVgB,cAAM,iBAAiB,iBAAiB,IAAI,EAAE;AAC9C,YAAI,eAAgB,QAAO;AAE3B,cAAM,YAAWA,MAAA,aAAa,IAAI,EAAE,MAAnB,OAAAA,MAAwB,CAAC;AAC1C,cAAM,MAAM,SACP,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,EACxB,OAAO,OAAO;AACnB,cAAM,SAAS,OAAO,OAAO,GAAG;AAChC,yBAAiB,IAAI,IAAI,MAAM;AAC/B,eAAO;AAAA,MACX;AAAA,MAEA,YAAY;AA9VxB,YAAAA;AA+VgB,cAAM,YAAY,kBAAkB,IAAI,EAAE;AAC1C,YAAI,UAAW,QAAO;AAEtB,cAAM,OAKD,CAAC;AACN,cAAM,QAAQ,oBAAI,IAAY;AAC9B,YAAI,MAAM,WAAW,IAAI,EAAE;AAC3B,YAAI,QAAQ;AAEZ,eAAO,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B,gBAAM,IAAI,OAAO,GAAG;AACpB,cAAI,CAAC,EAAG;AACR,gBAAM,KAAIA,MAAA,YAAY,IAAI,GAAG,MAAnB,OAAAA,MAAwB,CAAC,IAAI,GAAG;AAE1C,eAAK,KAAK,EAAE,MAAM,GAAG,QAAQ,UAAU,GAAG,OAAO,MAAM,EAAE,CAAC;AAE1D,gBAAM,IAAI,GAAG;AACb,gBAAM,WAAW,IAAI,GAAG;AACxB;AAAA,QACJ;AAEA,cAAM,SAAS,OAAO,OAAO,IAAI;AACjC,0BAAkB,IAAI,IAAI,MAAM;AAChC,eAAO;AAAA,MACX;AAAA,MAEA,OAAO,YAAY;AACf,cAAM,KAAK,KAAK,UAAU;AAC1B,eAAO,YAAY,IAAI,EAAE;AAAA,MAC7B;AAAA,MAEA,UAAU,OAAO;AACb,cAAM,MAAM,KAAK,KAAK;AACtB,YAAI,QAAQ,GAAI,QAAO;AAEvB,eAAO,WAAW,IAAI,EAAE,MAAM;AAAA,MAClC;AAAA,MAEA,cAAc,cAAc;AACxB,eAAO,KAAK,eAAe,EAAE;AAAA,UACzB,CAAC,SAAS,KAAK,MAAM;AAAA,QACzB;AAAA,MACJ;AAAA,MAEA,iBAAiB;AACb,cAAM,UAAuB,CAAC;AAC9B,cAAM,UAAU,QAAQ,cAAc,EAAE;AAExC,mBAAW,WAAW,SAAS;AAC3B,gBAAME,QAAO,SAAS,OAAO;AAC7B,cAAI,CAACA,MAAM;AACX,gBAAM,WACF,SAAS,IAAI,OAAO,KACpB,wBAAwB,SAAS,EAAE;AACvC,kBAAQ;AAAA,YACJ,WAAWA,QAAO,EAAE,GAAGA,OAAM,aAAa,KAAK;AAAA,UACnD;AAAA,QACJ;AAEA,eAAO,OAAO,OAAO,OAAO;AAAA,MAChC;AAAA,IACJ;AAEA,iBAAa,IAAI,IAAI,IAAI;AACzB,cAAU,IAAI,IAAI,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,CAAC,OAAsC;AAva5D,QAAAF,KAAAC,KAAAE,KAAAC;AAwaQ,UAAM,SAAS,eAAe,IAAI,EAAE;AACpC,QAAI,OAAQ,QAAO;AAEnB,UAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAMC,YAAY,IAAY,WAAW;AACzC,UAAM,WAAWA,YACX,OAAO,OAAO,IAAI,KAAIJ,OAAAD,MAAA,MAAM,yBAAN,gBAAAA,IAA6B,QAA7B,OAAAC,MAAoC,CAAC,CAAC,CAAC,IAC7D;AACN,UAAM,WAAWI,YACX,OAAO,OAAO,IAAI,KAAID,OAAAD,MAAA,MAAM,yBAAN,gBAAAA,IAA6B,QAA7B,OAAAC,MAAoC,CAAC,CAAC,CAAC,IAC7D;AAEN,UAAM,UAAU,MAAyB;AACrC,YAAM,aAAa,kBAAkB,IAAI,EAAE;AAC3C,UAAI,WAAY,QAAO;AACvB,YAAM,MAAM,OAAO,OAAO,WAAW,IAAI,OAAO,CAAC;AACjD,wBAAkB,IAAI,IAAI,GAAG;AAC7B,aAAO;AAAA,IACX;AAEA,UAAM,aAAa,aAAa,QAAQ,CAAC;AAEzC,UAAM,OAAkB;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA,GAAG,gBAAgB,UAAU;AAAA,MAE7B;AAAA,MAEA,YAAY;AACR,cAAM,eAAe,oBAAoB,IAAI,EAAE;AAC/C,YAAI,aAAc,QAAO;AAEzB,cAAM,SAAS,QAAQ,EAClB,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,EACxB,OAAO,OAAO;AAEnB,cAAM,SAAS,OAAO,OAAO,MAAM;AACnC,4BAAoB,IAAI,IAAI,MAAM;AAClC,eAAO;AAAA,MACX;AAAA,MAEA,UAAU,OAAO;AACb,cAAM,MAAM,KAAK,KAAK;AACtB,cAAM,MAAM,WAAW,GAAG;AAC1B,mBAAW,KAAK,QAAQ,EAAG,KAAI,IAAI,IAAI,CAAC,EAAG,QAAO;AAClD,eAAO;AAAA,MACX;AAAA,MAEA,cAAc,cAAc,SAAS;AACjC,eAAO,KAAK,eAAe,OAAO,EAAE;AAAA,UAChC,CAAC,SAAS,KAAK,MAAM;AAAA,QACzB;AAAA,MACJ;AAAA,MAEA,eAAe,OAAgB;AAC3B,eAAO,mBAAmB,IAAI,UAAU,OAAO,CAACC,SAAQ;AAAA,MAC5D;AAAA,IACJ;AAEA,mBAAe,IAAI,IAAI,IAAI;AAC3B,cAAU,IAAI,IAAI,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,CAAC,OAAuC;AAhf9D,QAAAL,KAAAC,KAAAE,KAAAC;AAifQ,UAAM,SAAS,gBAAgB,IAAI,EAAE;AACrC,QAAI,OAAQ,QAAO;AAEnB,UAAM,MAAM,WAAW,IAAI,EAAE;AAC7B,UAAM,eAAe,mBAAmB,IAAI,EAAE;AAC9C,QAAI,CAAC,OAAO,CAAC,aAAc,QAAO;AAElC,UAAM,QAAQ,SAAS,YAAY;AACnC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW,OAAO;AAAA,MACpB,IAAI,KAAIH,OAAAD,MAAA,MAAM,yBAAN,gBAAAA,IAA6B,QAA7B,OAAAC,MAAoC,CAAC,CAAC;AAAA,IAClD;AACA,UAAM,WAAW,OAAO;AAAA,MACpB,IAAI,KAAIG,OAAAD,MAAA,MAAM,yBAAN,gBAAAA,IAA6B,QAA7B,OAAAC,MAAoC,CAAC,CAAC;AAAA,IAClD;AAGA,UAAM,OAAmB;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA,GAAG,gBAAgB,CAAC,YAAY,MAAM,SAAS,OAAO,CAAC;AAAA,MAEvD,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,MAEA,YAAY;AACR,eAAO,MAAM,UAAU;AAAA,MAC3B;AAAA,MAEA,UAAU,OAAO;AACb,eAAO,MAAM,UAAU,KAAK;AAAA,MAChC;AAAA,MAEA,cAAc,cAAc,SAAS;AACjC,eAAO,KAAK,eAAe,OAAO,EAAE;AAAA,UAChC,CAAC,SAAS,KAAK,MAAM;AAAA,QACzB;AAAA,MACJ;AAAA,MAEA,eAAe,OAAgB;AAC3B,eAAO,mBAAmB,IAAI,UAAU,KAAK;AAAA,MACjD;AAAA,IACJ;AAEA,oBAAgB,IAAI,IAAI,IAAI;AAC5B,cAAU,IAAI,IAAI,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,QAAME,WAAU,CAAC,UAAuD;AAziB5E,QAAAN,KAAAC,KAAAE;AA0iBQ,UAAM,KAAK,OAAO,UAAU,WAAW,MAAM,KAAK;AAElD,UAAM,SAAS,UAAU,IAAI,EAAE;AAC/B,QAAI,OAAQ,QAAO;AAEnB,UAAM,OAAO,QAAQ,IAAI,EAAE;AAE3B,QAAI,CAAC,KAAM,QAAO,UAAU,EAAE;AAE9B,QAAI,KAAK,SAAS,MAAO,SAAOH,MAAA,OAAO,EAAE,MAAT,OAAAA,MAAc,UAAU,EAAE;AAC1D,QAAI,KAAK,QAAQ,QAAS,SAAOC,MAAA,SAAS,EAAE,MAAX,OAAAA,MAAgB,UAAU,EAAE;AAC7D,QAAI,KAAK,QAAQ,SAAU,SAAOE,MAAA,UAAU,EAAE,MAAZ,OAAAA,MAAiB,UAAU,EAAE;AAE/D,WAAO,UAAU,EAAE;AAAA,EACvB;AAEA,QAAM,YAAY,CAAC,OAA4B;AAC3C,UAAM,IAAiB;AAAA,MACnB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,GAAG,gBAAgB,MAAM,CAAC,CAAC;AAAA,IAC/B;AACA,cAAU,IAAI,IAAI,CAAC;AACnB,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,SAAAG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;ACjkBA,IAAM,iBAAiB,oBAAI,IAA0B;AAAA,EACjD;AAAA,EACA;AACJ,CAAC;AACD,IAAM,mBAAmB,oBAAI,IAA4B,CAAC,UAAU,CAAC;AACrE,IAAM,cAAc,oBAAI,IAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAgD;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,qBAAqB,oBAAI,IAA0C;AAAA,EACrE;AAAA,EACA;AACJ,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAE5B,CAAC,MAAM,OAAO,MAAM,OAAO,UAAU,UAAU,OAAO,CAAC;AAMzD,SAAS,eACL,KACA,GACA,GACA,IACyB;AACzB,MAAI,QAAQ,OAAW,QAAO;AAC9B,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,MAAE,KAAK;AAAA,MACH,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACX;AAEA,QAAM,MAAqB,CAAC;AAE5B,MAAI,QAAQ,CAAC,KAAK,MAAM;AACpB,UAAM,MAAW,OAAO,OAAO,QAAQ,WAAW,MAAM;AACxD,UAAM,OACF,QAAO,2BAAK,UAAS,YAAY,IAAI,KAAK,KAAK,IACzC,IAAI,KAAK,KAAK,IACd;AAEV,QAAI,CAAC,MAAM;AACP,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,gBAAgB,CAAC;AAAA,QAC1B,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,CAAC,KAAK,WAAW,UAAU,GAAG;AAC9B,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,gBAAgB,CAAC;AAAA,QAC1B,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,UAAM,QAAiB,2BAAK;AAC5B,UAAM,KACF,UAAU,SACJ,OACA,OAAO,UAAU,YACf,kBAAkB,IAAI,KAAY,IACjC,QACD;AAEZ,QACI,UAAU,UACV,EAAE,OAAO,UAAU,YAAY,kBAAkB,IAAI,KAAY,IACnE;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,wBAAwB,CAAC;AAAA,QAClC,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,UAAM,QAAiB,2BAAK;AAG5B,QAAI,OAAO,YAAY,OAAO,YAAY,OAAO,SAAS;AACtD,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,gBAAgB,CAAC,SAAS,EAAE;AAAA,UACrC,MAAM,gBAAgB,CAAC;AAAA,QAC3B,CAAC;AAAA,MACL;AAAA,IACJ,WAAW,OAAO,QAAQ,OAAO,OAAO;AACpC,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,gBAAgB,CAAC,SAAS,EAAE;AAAA,UACrC,MAAM,gBAAgB,CAAC;AAAA,QAC3B,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI,KAAK,EAAE,MAAM,IAAI,MAAM,CAAC;AAAA,EAChC,CAAC;AAED,SAAO,IAAI,SAAS,MAAM;AAC9B;AAYO,SAAS,gBAAgB,KAG9B;AACE,QAAM,cAAkC,CAAC;AACzC,QAAM,WAA0B,CAAC;AAEjC,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,gBAAY,KAAK;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,IACb,CAAC;AACD,WAAO,EAAE,UAAU,YAAY;AAAA,EACnC;AAEA,MAAI,QAAQ,CAAC,OAAO,MAAM;AACtB,UAAM,IAAwB,CAAC;AAC/B,UAAM,MAAM,SAAS,OAAO,UAAU,WAAY,QAAgB,CAAC;AAEnE,QAAI,KACA,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,KAAK,IACpC,IAAI,GAAG,KAAK,IACZ;AAGV,QAAI,CAAC,IAAI;AACL,WAAK,UAAU,IAAI,CAAC;AACpB,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,QACF,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,IAC1C,IAAI,MAAM,KAAK,IACf;AAEV,QAAI,EAAE,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,IAAI;AACtD,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,QAA8B,eAAe,IAAI,IAAI,KAAK,IACxD,IAAI,QACJ,IAAI,UAAU,SACZ,kBACA;AACR,QAAI,IAAI,UAAU,UAAa,CAAC,eAAe,IAAI,IAAI,KAAK,GAAG;AAC3D,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,UAAkC,iBAAiB,IAAI,IAAI,OAAO,IAChE,IAAI,UACJ;AACN,QAAI,IAAI,YAAY,UAAa,CAAC,iBAAiB,IAAI,IAAI,OAAO,GAAG;AACjE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,KAAwB,IAAI;AAClC,QAAI,CAAC,YAAY,IAAI,EAAE,GAAG;AACtB,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,iBAAiB,OAAO,EAAE,CAAC;AAAA,QACpC,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,aACA,OAAO,IAAI,eAAe,YAAY,IAAI,WAAW,KAAK,IACpD,IAAI,WAAW,KAAK,IACpB;AAGV,QACI,YAAY,cACZ,cACA,CAAC,WAAW,WAAW,UAAU,GACnC;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SACI;AAAA,QACJ,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,UAAM,YACF,IAAI,UAAU,OAAO,IAAI,WAAW,WAC7B,IAAI,SACL;AAEV,UAAM,QACF,uCAAW,SAAQ,cAAc,IAAI,UAAU,IAAI,IAC7C,UAAU,OACV;AAEV,SAAI,uCAAW,SAAQ,CAAC,cAAc,IAAI,UAAU,IAAI,GAAG;AACvD,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,UAAM,SAA4C;AAAA,MAC9C;AAAA,MACA,SACI,uCAAW,YAAW,SAChB,MAAM,QAAQ,UAAU,MAAM,IAC1B,UAAU,SACV,CAAC,UAAU,MAAM,IACrB;AAAA,MACV,WACI,uCAAW,cAAa,SAClB,MAAM,QAAQ,UAAU,QAAQ,IAC5B,UAAU,WACV,CAAC,UAAU,QAAQ,IACvB;AAAA,MACV,OAAO,eAAgB,uCAAmB,OAAO,GAAG,GAAG,EAAE;AAAA,IAC7D;AAGA,UAAM,WACF,mBAAmB,IAAI,IAAI,QAAQ,IAAI,IAAI,WAAW;AAC1D,QACI,IAAI,aAAa,UACjB,CAAC,mBAAmB,IAAI,IAAI,QAAQ,GACtC;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,QAAQ,IAAI;AAClB,QAAI,OAAO,eAAe,OAAO,aAAa;AAC1C,UAAI,EAAE,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI;AACxD,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,WAAW,OAAO,cAAc,OAAO,YAAY;AAC/C,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,OAAO;AACH,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,UAAM,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AACrD,QAAI,CAAC,UAAU;AACX,YAAM,OAAoB;AAAA,QACtB;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SACI,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,MACxD;AACA,eAAS,KAAK,IAAI;AAAA,IACtB;AAEA,gBAAY,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC;AAED,SAAO,EAAE,UAAU,YAAY;AACnC;;;ACtUO,SAAS,8BACZ,OACA,MAGmC;AA5DvC;AA6DI,QAAM,UAAwB,sBAAK,SAAQ,kBAAb,4CAAkC,CAAC;AACjE,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,UAAU,IAAI,IAAI,QAAQ,eAAe,IAAI,MAAM,CAAC;AAC1D,QAAM,UAAU,QAAQ,eAAe,CAAC;AAExC,QAAM,KAAuB;AAAA,IACzB,sBAAsB;AAAA,IACtB,YAAY,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,IAC1C,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,IAAI,aAAQ,aAAR,YAAoB,CAAC;AAAA,EAC7B;AAEA,QAAM,oBACF,QAAQ,oBAAoB,SACtB,SACA;AAAA,IACI,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAEV,QAAM,SAAyB,CAAC;AAChC,MAAI,kBAAkD;AAEtD,aAAW,MAAM,MAAM,YAAY;AAC/B,QAAI,QAAQ,IAAI,OAAO,EAAE,CAAC,EAAG;AAE7B,UAAM,MAAM,qBAAqB,QAAQ,EAAE;AAC3C,QAAI,CAAC,KAAK;AACN,aAAO,KAAK;AAAA,QACR;AAAA,QACA,IAAI;AAAA,QACJ,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS,CAAC,oBAAoB;AAAA,MAClC,CAAC;AACD;AAAA,IACJ;AAEA,UAAM,kBAAkB;AAAA,MACpB;AAAA,MACA,IAAI;AAAA,OACJ,aAAQ,yBAAR,YAAgC,CAAC;AAAA,IACrC;AAEA,UAAMC,cACF,WAAW,OAAO,OAAO,OAAO,QAAQ,IAAI,SAAS,EAAE;AAE3D,UAAM,SAAS;AAAA,OACX,aAAQ,aAAR,YAAoB,CAAC;AAAA,MACrB,CAAC,GAAG,QAAQ,gBAAgB,EAAE;AAAA,MAC9B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,iBAAiB,OAAO;AAC9B,sBAAkB,OAAO;AAEzB,UAAM,UAAmC,CAAC;AAC1C,QAAI,CAAC,gBAAiB,SAAQ,KAAK,qBAAqB;AACxD,QAAI,CAACA,YAAY,SAAQ,KAAK,aAAa;AAC3C,QAAI,CAAC,eAAgB,SAAQ,KAAK,cAAc;AAEhD,WAAO,KAAK;AAAA,MACR;AAAA,MACA,IAAI,mBAAmBA,eAAc;AAAA,MACrC;AAAA,MACA,YAAAA;AAAA,MACA;AAAA,MACA,cAAc,OAAO,OAAO,SAAS,OAAO,SAAS;AAAA,MACrD,gBAAgB,OAAO,SAAS,SAAS,OAAO,WAAW;AAAA,MAC3D;AAAA,MACA;AAAA,MACA,MAAM,eAAe,IAAI,IAAI;AAAA,IACjC,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACH;AAAA,IACA,aACI,mBAAmB,gBAAgB,SAC7B,kBACA;AAAA,EACd;AACJ;AAEA,SAAS,oBACL,KACA,YACA,QACA,OACA,mBACF;AACE,QAAM,WAAW,gBAAgB,GAAG;AACpC,QAAM,YAAY;AAAA,IACd,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,aAAa,SAAS;AAAA,EAC1B;AACJ;AAEA,SAAS,wBACL,OACA,QACA,QACA,OACA,mBACqD;AAjLzD;AAkLI,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,MAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,QAAO,EAAE,IAAI,MAAM,QAAQ,SAAS;AAEjE,QAAM,WAAW,MAAM;AAAA,IACnB,CAAC,MACG,EAAE,YAAY,eACb,EAAE,UAAU,mBAAmB,EAAE,UAAU;AAAA,EACpD;AAEA,aAAW,KAAK,UAAU;AACtB,UAAM,SAAS,uBAAuB,QAAQ,GAAG,iBAAiB;AAClE,UAAM,MAAM,OAAO;AAAA,MAAO,CAAC,OACvB,kBAAkB,qBAAqB,QAAQ,EAAE,GAAG,GAAG,KAAK;AAAA,IAChE;AACA,UAAM,aAAa,EAAE,cAAc;AACnC,UAAM,SAAS,IAAI;AAAA,MAAI,CAAC,OACpB,mBAAmB,qBAAqB,QAAQ,EAAE,GAAG,UAAU;AAAA,IACnE;AAEA,QAAI,KAAK;AACT,YAAQ,EAAE,IAAI;AAAA,MACV,KAAK;AACD,aAAK,OAAO,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC;AAC9D;AAAA,MACJ,KAAK,UAAU;AACX,cAAMC,QAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AACjD,aAAKA,MAAK,SAAS,OAAO;AAC1B;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AACX,cAAMA,QAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AACjD,aAAKA,MAAK,QAAQ;AAClB;AAAA,MACJ;AAAA,MACA,KAAK;AACD,aAAK,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5B;AAAA,MACJ,KAAK;AACD,aAAK,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B;AAAA,MACJ,KAAK,aAAa;AACd,cAAM,IAAI,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAClD,aAAK,OAAO,SAAS,CAAC,IAAI,OAAO,UAAU,IAAI;AAC/C;AAAA,MACJ;AAAA,MACA,KAAK,aAAa;AACd,cAAM,IAAI,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAClD,aAAK,OAAO,SAAS,CAAC,IAAI,OAAO,UAAU,IAAI;AAC/C;AAAA,MACJ;AAAA,MACA;AACI,aAAK;AAAA,IACb;AAEA,QAAI,CAAC,IAAI;AACL,YAAK,OAAE,aAAF,YAAc,aAAa,SAAS;AACrC,eAAO,MAAK,OAAE,OAAF,YAAQ,cAAc;AAAA,MACtC,OAAO;AACH,iBAAS,MAAK,OAAE,OAAF,YAAQ,gBAAgB;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,EAAE,IAAI,OAAO,WAAW,GAAG,QAAQ,SAAS;AACvD;AAEA,SAAS,uBACL,YACA,MACA,mBACc;AACd,MAAI,KAAK,UAAU,mBAAmB,CAAC,kBAAmB,QAAO;AACjE,SAAO,WAAW,OAAO,CAAC,OAAO,kBAAkB,IAAI,OAAO,EAAE,CAAC,CAAC;AACtE;AAEA,SAAS,yBACL,SACA,OACA,iBACW;AAlQf;AAmQI,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAEhC,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAC3C,OAAI,2BAAK,eAAc,KAAM,KAAI,IAAI,OAAO,IAAI,UAAU,CAAC;AAE3D,QAAM,kBAAkB,IAAI,IAAI,QAAQ,cAAc,OAAO,eAAe,CAAC;AAC7E,aAAW,SAAS,QAAQ;AACxB,QAAI,CAAC,gBAAgB,IAAI,MAAM,EAAE,EAAG;AAEpC,QAAK,MAAc,cAAc,MAAM;AACnC,UAAI,IAAI,OAAQ,MAAc,UAAU,CAAC;AAAA,IAC7C;AACA,eAAW,WAAU,WAAM,YAAN,YAAiB,CAAC,GAAG;AACtC,UAAK,OAAe,cAAc,MAAM;AACpC,YAAI,IAAI,OAAQ,OAAe,UAAU,CAAC;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,mBACL,KACA,YACF;AACE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAAM,WAAW,WAAW,UAAU,IAAI,WAAW,MAAM,CAAC,IAAI;AACtE,SAAQ,IAAY,GAAG;AAC3B;AAEA,SAAS,kBACL,KACA,MACA,OACO;AACP,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,KAAK;AACf,MAAI,CAAC,EAAG,QAAO;AAEf,MAAI,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,OAAO,KAAK,CAAC,EAAG,QAAO;AAC/D,SAAO;AACX;AAEA,SAAS,SAAS,GAAuD;AACrE,QAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AACrC,QAAM,IAAI,oBAAI,IAAY;AAC1B,aAAW,KAAK,IAAK,GAAE,IAAI,OAAO,CAAC,CAAC;AACpC,SAAO;AACX;;;AC/RO,SAAS,0BACZ,OACA,UACA,UACW;AA5Bf;AA6BI,QAAM,KAAK,MAAM;AACjB,MAAI,EAAC,yBAAI,UAAS,OAAO,KAAK,GAAG,KAAK,EAAE,WAAW,GAAG;AAClD,WAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAAA,EAChC;AAGA,QAAM,eAAe,oBAAI,IAAsB;AAC/C,QAAM,cAAc,oBAAI,IAAsC;AAE9D,aAAW,UAAU,OAAO,KAAK,GAAG,KAAK,GAAG;AACxC,UAAM,MAAM,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,MAAM;AACnD,QAAI,KAAK;AACL,mBAAa,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;AACjC,kBAAY,IAAI,QAAQ,IAAI,UAAiB;AAC7C;AAAA,IACJ;AAEA,UAAM,QAAQ,MAAM,OAAO,KAAK,OAAK,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,KAAK,OAAK,EAAE,OAAO,MAAM,CAAC;AACrG,QAAI,OAAO;AACP,YAAM,WAAW,YAAY,MAAM,OAAO;AAC1C,mBAAa,IAAI,QAAQ,QAAQ;AACjC,YAAM,MAAM,MAAM,QAAS,KAAK,OAAK,EAAE,OAAO,MAAM;AACpD,kBAAY,IAAI,QAAQ,IAAI,UAAiB;AAC7C;AAAA,IACJ;AAEA,iBAAa,IAAI,QAAQ,CAAC,CAAC;AAC3B,gBAAY,IAAI,QAAQ,MAAS;AAAA,EACrC;AAGA,QAAM,QAAQ,uBAAuB,OAAO,UAAU,EAAE,GAAG,UAAU,MAAM,MAAM,CAAC;AAGlF,QAAM,iBAAiB,oBAAI,IAA6D;AACxF,QAAM,sBAAsB,oBAAI,IAAoB;AAEpD,aAAW,CAAC,QAAQ,IAAI,KAAK,aAAa,QAAQ,GAAG;AACjD,wBAAoB,IAAI,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC;AAAA,EAC5D;AAEA,aAAW,KAAK,OAAO;AACnB,QAAI,EAAE,UAAU,OAAQ;AACxB,UAAM,MAAM,GAAG,EAAE,MAAM,KAAK,OAAO,EAAE,SAAS,CAAC;AAC/C,QAAI,MAAM,eAAe,IAAI,GAAG;AAChC,QAAI,CAAC,KAAK;AACN,YAAM,EAAE,SAAS,oBAAI,IAAY,GAAG,UAAU,oBAAI,IAAY,EAAE;AAChE,qBAAe,IAAI,KAAK,GAAG;AAAA,IAC/B;AACA,QAAI,QAAQ,IAAI,EAAE,MAAM;AACxB,QAAI,EAAE,WAAY,KAAI,SAAS,IAAI,EAAE,UAAU;AAAA,EAGnD;AAGA,QAAM,cAA8C,CAAC;AACrD,QAAM,UAA4B,CAAC;AAEnC,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,GAAG,KAAK,GAAG;AACnD,UAAM,YAAW,kBAAa,IAAI,MAAM,MAAvB,YAA4B,CAAC;AAC9C,UAAM,gBAAgB,KAAK,IAAI,GAAG,SAAS,MAAM;AACjD,UAAM,OAAuB,CAAC;AAE9B,eAAW,QAAQ,MAAM;AACrB,YAAM,MAAM,GAAG,MAAM,KAAK,OAAO,IAAI,CAAC;AACtC,YAAM,MAAM,eAAe,IAAI,GAAG;AAGlC,UAAI,CAAC,KAAK;AACN,aAAK,KAAK,IAAI;AACd;AAAA,MACJ;AAEA,YAAM,sBAAsB,IAAI,SAAS,OAAO,IAAI,IAAI,SAAS,OAAO;AACxE,YAAM,WAAW,uBAAuB;AAExC,UAAI,UAAU;AACV,gBAAQ,KAAK;AAAA,UACT;AAAA,UACA,WAAW;AAAA,UACX,SAAS,MAAM,KAAK,IAAI,OAAO;AAAA,UAC/B,UAAU,SAAS,SAAS,SAAS,MAAM,IAAI;AAAA,QACnD,CAAC;AAAA,MACL,OAAO;AACH,aAAK,KAAK,IAAI;AAAA,MAClB;AAAA,IACJ;AAEA,QAAI,KAAK,OAAQ,aAAY,MAAM,IAAI;AAAA,EAC3C;AAEA,QAAM,WAAyB;AAAA,IAC3B,GAAG;AAAA,IACH,WAAW;AAAA,MACP,KAAI,WAAM,cAAN,mBAAiB,UAAS,EAAE,QAAQ,MAAM,UAAW,OAAO,IAAI,CAAC;AAAA,MACrE,GAAI,OAAO,KAAK,WAAW,EAAE,SAAS,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,IACpE;AAAA,EACJ;AAEA,SAAO,EAAE,OAAO,UAAU,QAAQ;AACtC;AAIA,SAAS,YAAY,MAA+C;AAChE,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI;AACrD;;;AC7EO,SAAS,mBACZ,OACA,SACA,WACA,UACA,WAAuC,CAAC,GAC3B;AAlEjB;AAmEI,QAAM,QAAuB,cAAS,SAAT,YAAiB;AAC9C,QAAM,iBAAyB,OAAO;AAAA,KAClC,cAAS,wBAAT,YAAgC;AAAA,EACpC,IACO,SAAS,sBACV;AAGN,QAAM,aAA+B;AAAA,IACjC,sBAAsB;AAAA,IACtB,YAAY,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,IAC1C,mBAAmB;AAAA,IACnB,MAAM,SAAS,QAAQ,QAAQ;AAAA,IAC/B,IAAI,cAAS,aAAT,YAAqB,CAAC;AAAA,EAC9B;AAEA,QAAM,WAAkB,oBAAI,KAAK,GAAE,YAAY;AAC/C,QAAM,QAAgB,UAAU;AAGhC,QAAM,sBACF,eAAU,iBAAV,YACA,qBAAqB,UAAU,yBAAyB;AAC5D,QAAM,kBAA4B,QAAQ;AAAA,IACtC;AAAA,IACA;AAAA,EACJ;AAGA,QAAM,UAA4B,IAAI;AAAA,MACjC,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EAC9C;AACA,QAAM,YAAgC,IAAI;AAAA,MACrC,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EAC7C;AACA,QAAM,kBAEY,mBAAQ,IAAI,KAAK,MAAjB,mBAAoB,gBAApB,YAAmC;AAGrD,QAAM,kBAAkB,gBACnB,IAAI,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC,EAC/B,OAAO,CAAC,MAAkB,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,MAAM;AA9GpB,QAAAC;AA+GY,UAAM,SAA+B,cAAc,CAAC,KAC7CA,MAAA,UAAU,0BAA0B,EAAE,EAAE,MAAxC,OAAAA,MAA6C,CAAC,IAC/C;AACN,WAAO;AAAA,MACH,IAAI,EAAE;AAAA,MACN,MAAM,OAAO,EAAE,IAAI;AAAA,MACnB,GAAI,UAAU,OAAO,SAAS,EAAE,iBAAiB,OAAO,IAAI,CAAC;AAAA,IACjE;AAAA,EACJ,CAAC;AAGL,QAAM,EAAE,YAAY,WAAW,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAGA,QAAM,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,QAAM,WAAmB,OAAO;AAChC,QAAM,iBAAiB,OAAO;AAG9B,QAAM,EAAE,YAAY,aAAa,IAAI;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,EAAE,KAAK,IAAI,IAAI,cAAc,cAAc,QAAQ;AAGzD,QAAM,kBAAkB;AAAA,IACpB,MAAM;AAAA,IACN,EAAE,OAAO,aAAa,gBAAgB,YAAY,aAAa;AAAA,IAC/D;AAAA,IACA;AAAA,EACJ;AAGA,QAAM,YAAY;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAGA,QAAM,WACF,SAAS,QACH;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IACA;AAGV,QAAM,iBAAiB,iBAAiB,UAAU;AAClD,QAAM,OAAO;AAAA,IACT,gBAAgB,MAAM;AAAA,IACtB,aAAa,SAAS;AAAA,IACtB,SAAS,SAAS,gBACZ,EAAE,QAAQ,SAAS,cAAc,IACjC;AAAA,IACN,SAAS;AAAA,MACL,KAAK;AAAA,MACL,aAAc,0CAAkB,CAAC;AAAA,MAIjC,cAAc;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,IACZ;AAAA,EACJ;AAEA,QAAM,WAA0B;AAAA,IAC5B,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACP,KAAK;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,IACJ;AAAA,IAEA;AAAA,IACA,KAAK,oBAAO;AAAA,IAEZ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAI,gBAAgB,SACd,EAAE,WAAW,gBAAgB,OAAO,IACpC,CAAC;AAAA,IACP,GAAI,UAAU,SAAS,EAAE,UAAU,IAAI,CAAC;AAAA,IACxC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B;AAAA,EACJ;AAEA,SAAO;AACX;AAIA,SAAS,cAAc,GAAmB;AACtC,QAAM,aACF,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS;AACnD,SAAO,cAAc,aAAa,CAAC;AACvC;AAEA,SAAS,qBAAqB,SAA6C;AACvE,QAAM,OAAiB,CAAC;AACxB,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,4BAAW,CAAC,CAAC,GAAG;AAC9D,eAAW,SAAS,gCAAa,CAAC,GAAG;AACjC,WAAK,KAAK,GAAG,OAAO,KAAK,KAAK,EAAE;AAAA,IACpC;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,gBAAgB,OAAc;AACnC,MAAI,MAAM,WAAY,QAAO;AAC7B,SAAO,CAAC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,UAAU;AAC3E;AAEA,SAAS,YACL,iBACA,WACA,WAIF;AACE,QAAM,aAAgD,CAAC;AACvD,QAAM,aAAuC,CAAC;AAE9C,aAAW,OAAO,iBAAiB;AAC/B,UAAM,IAAuB,UAAU,IAAI,GAAG;AAC9C,QAAI,CAAC,EAAG;AAER,UAAM,YACF,UAAU,0BAA0B,GAAG;AAC3C,QAAI,aAAa,UAAU,QAAQ;AAC/B,iBAAW,GAAG,IAAI,CAAC,GAAG,SAAS;AAAA,IACnC;AAGA,QAAI,CAAC,gBAAgB,CAAC,GAAG;AACrB,YAAM,OAA2B,EAAE;AACnC,YAAM,MACF,UAAU,oBAAoB,GAAG;AACrC,UAAI,CAAC,QAAQ,QAAQ,OAAW;AAChC,iBAAW,IAAI,IAAI;AAAA,IACvB;AAAA,EACJ;AAEA,SAAO,EAAE,YAAY,WAAW;AACpC;AAIA,SAAS,gBACL,iBACA,WACA,SACA,WACA,OACA,aAC6D;AAjTjE;AAsTI,aAAW,OAAO,iBAAiB;AAC/B,UAAM,IAAuB,UAAU,IAAI,GAAG;AAC9C,QAAI,CAAC,EAAG;AACR,UAAM,OAAiC;AAAA,OAClC,OAAE,SAAF,mBAAgB;AAAA,IACrB;AACA,QAAI,CAAC,KAAM;AAEX,UAAM,MACF,UAAU,oBAAoB,GAAG;AACrC,UAAM,YAAY,qBAAqB,MAAM,GAAG;AAChD,QAAI,OAAO,SAAS,SAAS,KAAM,YAAuB,GAAG;AACzD,aAAO;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS,IAAI,EAAE,IAAI,KAAK;AAAA,MAC5C;AAAA,IACJ;AAEA;AAAA,EACJ;AAEA,QAAM,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,MAAI,YAAa,QAAO;AAExB,SAAO;AAAA,IACH,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,WAAW,mBAAmB,KAAK;AAAA,EACvD;AACJ;AAEA,SAAS,iBAAiB,GAAsC;AAC5D,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,QAAM,MAAM;AACZ,MACI,IAAI,YAAY,WAChB,IAAI,YAAY,YAChB,IAAI,YAAY;AAEhB,WAAO;AACX,QAAM,MAAoB,EAAE,SAAS,IAAI,QAAQ;AACjD,MAAI,IAAI,QAAQ,OAAO,IAAI,SAAS,SAAU,KAAI,OAAO,IAAI;AAC7D,MAAI,OAAO,IAAI,aAAa,YAAY,OAAO,SAAS,IAAI,QAAQ,GAAG;AACnE,QAAI,WAAW,IAAI;AAAA,EACvB;AACA,MAAI,OAAO,IAAI,aAAa,YAAY,OAAO,SAAS,IAAI,QAAQ,GAAG;AACnE,QAAI,WAAW,IAAI;AAAA,EACvB;AACA,MAAI,IAAI,SAAS,OAAO,IAAI,UAAU,UAAU;AAC5C,UAAM,MACF,OAAO,IAAI,MAAM,QAAQ,YAAY,OAAO,SAAS,IAAI,MAAM,GAAG,IAC5D,IAAI,MAAM,MACV;AACV,UAAM,MACF,OAAO,IAAI,MAAM,QAAQ,YAAY,OAAO,SAAS,IAAI,MAAM,GAAG,IAC5D,IAAI,MAAM,MACV;AACV,QAAI,QAAQ,UAAa,QAAQ,QAAW;AACxC,UAAI,QAAQ;AAAA,QACR,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,QACnC,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,qBACL,MACA,KACM;AACN,QAAM,YAAY,wBAAwB,MAAM,GAAG;AACnD,MAAI,OAAO,SAAS,SAAS,GAAG;AAC5B,UAAM,WAAW,wBAAwB,WAAqB,IAAI;AAClE,QAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,EAAG,QAAO;AAAA,EAC1D;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY,OAAO,SAAS,KAAK,QAAQ,GAAG;AACrE,UAAM,WAAW,WAAW,KAAK,UAAU,KAAK,KAAK;AACrD,QAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,EAAG,QAAO;AAAA,EAC1D;AAEA,SAAO;AACX;AAEA,SAAS,wBACL,MACA,KACM;AACN,UAAQ,KAAK,SAAS;AAAA,IAClB,KAAK,SAAS;AACV,YAAM,IAAI,OAAO,MAAM,QAAQ,GAAG,IAAK,IAAiB,CAAC,IAAI,GAAG;AAChE,aAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,IACpC;AAAA,IACA,KAAK,UAAU;AACX,UAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI;AACnC,UAAI,OAAO,QAAQ,SAAU,QAAO,IAAI;AACxC,aAAO;AAAA,IACX;AAAA,IACA,KAAK,QAAQ;AACT,UAAI;AACA,YAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO;AAExD,cAAM,KAAK,IAAI;AAAA,UACX;AAAA,UACA;AAAA,UACA,uBAAuB,KAAK,IAAI;AAAA;AAAA,QACpC;AACA,cAAM,SAAS,MAAM,QAAQ,GAAG,IAAK,IAAiB,CAAC,IAAI;AAC3D,cAAM,SAAS,MAAM,QAAQ,GAAG,IACzB,MACD,QAAQ,SACN,CAAC,GAAG,IACJ,CAAC;AACT,cAAM,MAAM,GAAG,QAAQ,MAAM;AAC7B,cAAM,IAAI,OAAO,GAAG;AACpB,eAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,MACpC,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,EACf;AACJ;AAEA,SAAS,wBAAwB,OAAe,MAA4B;AACxE,MAAI,OAAO;AACX,MAAI,OAAO,KAAK,aAAa,YAAY,OAAO,SAAS,KAAK,QAAQ,GAAG;AACrE,YAAQ,KAAK;AAAA,EACjB;AACA,SAAO,WAAW,MAAM,KAAK,KAAK;AACtC;AAEA,SAAS,WACL,OACAC,QACM;AACN,MAAI,OAAO;AACX,OAAIA,UAAA,gBAAAA,OAAO,SAAQ,OAAW,QAAO,KAAK,IAAI,MAAMA,OAAM,GAAG;AAC7D,OAAIA,UAAA,gBAAAA,OAAO,SAAQ,OAAW,QAAO,KAAK,IAAI,MAAMA,OAAM,GAAG;AAC7D,SAAO;AACX;AAEA,SAAS,2BACL,iBACA,WACA,SACA,WACA,OACyE;AAjd7E;AAkdI,QAAM,cAAc,sBAAsB,WAAW,SAAS;AAC9D,aAAW,EAAE,SAAS,SAAS,KAAK,aAAa;AAC7C,QAAI,CAAC,gBAAgB,SAAS,OAAO,EAAG;AACxC,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,UAAM,UAAS,oCAAO,YAAP,mBAAgB,KAAK,CAAC,SAAS,KAAK,OAAO;AAC1D,UAAM,kBAAkB;AAAA,OACnB,sCAAQ,SAAR,mBAAsB;AAAA,IAC3B;AACA,QAAI,oBAAoB,QAAW;AAC/B,aAAO;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,WAAW,iBAAiB;AACnC,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,QAAI,CAAC,MAAO;AACZ,UAAM,gBACF,MAAM,WAAW,QAChB,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS;AAC5D,QAAI,CAAC,cAAe;AACpB,UAAM,kBAAkB;AAAA,MACnB,MAAc;AAAA,IACnB;AACA,QAAI,oBAAoB,QAAW;AAC/B,aAAO;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,qBAAqB;AAAA,KACtB,mBAAQ,IAAI,KAAK,MAAjB,mBAAoB,SAApB,mBAAkC;AAAA,EACvC;AACA,MAAI,uBAAuB,QAAW;AAClC,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ,EAAE,MAAM,OAAO,IAAI,MAAM;AAAA,IACrC;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,oBAAoB,OAAoC;AAC7D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAChE,QACA;AACV;AAIA,SAAS,gBACL,OACA,iBACA,WACA,SACA,WAIF;AAlhBF;AAmhBI,QAAM,aAAqD,CAAC;AAC5D,QAAM,UAAkC,CAAC;AAGzC,QAAM,MAAM,QAAQ,IAAI,KAAK;AAC7B,MAAI;AACJ,MAAI;AAEJ,OAAI,2BAAK,gBAAe,QAAW;AAC/B,cAAU,IAAI;AACd,oBAAgB;AAAA,EAEpB;AAGA,QAAM,cAAc,sBAAsB,WAAW,SAAS;AAE9D,aAAW,EAAE,SAAS,SAAS,KAAK,aAAa;AAE7C,QAAI,CAAC,gBAAgB,SAAS,OAAO,EAAG;AAExC,UAAM,IAAI,UAAU,IAAI,OAAO;AAC/B,QAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,EAAE,OAAO,EAAG;AAErC,UAAM,MAAM,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACnD,QAAI,CAAC,IAAK;AAEV,UAAM,QAAQ,SAAI,iBAAJ,YAAoB;AAIlC,UAAM,MAAM,IAAI;AAGhB,QAAI,SAAS,UAAW;AAExB,QAAI,QAAQ,QAAW;AAEnB,UAAI,YAAY,UAAa,kBAAkB,OAAO;AAClD,kBAAU;AACV,wBAAgB;AAEhB,gBAAQ,SAAS;AACjB,gBAAQ,KAAK,OAAO;AAAA,MACxB,OAAO;AAEH,gBAAQ,KAAK,GAAG;AAAA,MACpB;AAEA,kBAAY,YAAY,UAAU,GAAG;AAAA,IACzC;AAAA,EACJ;AAGA,MAAI,kBAAkB,YAAY,YAAY,QAAW;AACrD,YAAQ,QAAQ,OAAO;AACvB,gBAAY,YAAY,OAAO,OAAO;AAAA,EAC1C,OAAO;AAAA,EAEP;AAEA,QAAM,eAAe,eAAe,OAAO;AAC3C,SAAO,EAAE,YAAY,aAAa;AACtC;AAEA,SAAS,sBACL,WACA,WAC4C;AAvlBhD;AAwlBI,MACI,UAAU,wBACV,UAAU,qBAAqB,QACjC;AACE,WAAO,UAAU,qBAAqB,MAAM;AAAA,EAChD;AAEA,QAAM,MAAoD,CAAC;AAC3D,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO;AAAA,KAC/B,eAAU,8BAAV,YAAuC,CAAC;AAAA,EAC5C,GAAG;AACC,UAAM,IAAI,UAAU,IAAI,GAAG;AAC3B,QAAI,CAAC,EAAG;AACR,eAAW,OAAO,0BAAU,CAAC;AACzB,UAAI,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,EAChD;AACA,SAAO;AACX;AAEA,SAAS,YACL,KACA,QACA,KACI;AACJ,MAAI,CAAC,IAAI,MAAM,EAAG,KAAI,MAAM,IAAI,CAAC;AACjC,MAAI,MAAM,EAAE,KAAK,GAAG;AACxB;AAEA,SAAS,eAA0C,KAAe;AAC9D,QAAM,IAAI,oBAAI,IAAY;AAC1B,QAAM,MAAW,CAAC;AAClB,aAAW,KAAK,KAAK;AACjB,UAAM,MAAM,OAAO,CAAC;AACpB,QAAI,EAAE,IAAI,GAAG,EAAG;AAChB,MAAE,IAAI,GAAG;AACT,QAAI,KAAK,CAAC;AAAA,EACd;AACA,SAAO;AACX;AAWA,SAAS,2BACL,WACA,KACA,QACA,QAC0D;AA9oB9D;AA+oBI,MAAI,CAAC,UAAW,QAAO,EAAE,QAAQ,QAAW,UAAU,OAAU;AAGhE,MAAI;AACA,UAAM,EAAE,OAAO,YAAY,IAAiB;AAAA,MACxC;AAAA,QACI,SAAS,CAAC;AAAA,QACV,QAAQ,CAAC;AAAA,QACT,gBAAgB;AAAA,QAChB;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,WAAO;AAAA,MACH,QAAQ,YAAY;AAAA,MAGpB,UAAU;AAAA,IACd;AAAA,EACJ,QAAQ;AAEJ,UAAM,MAAwB,CAAC;AAC/B,UAAM,cAAsB,YAAO,yBAAP,YAA+B;AAG3D,QAAK,UAAkB,OAAO;AAC1B,YAAM,YAAoD,CAAC;AAC3D,iBAAW,CAAC,QAAQ,UAAU,KAAK,OAAO;AAAA,QACrC,UAAkB;AAAA,MAIvB,GAAG;AACC,YAAI,CAAC,IAAI,WAAW,MAAM,EAAG;AAC7B,cAAM,YAAW,SAAI,WAAW,MAAM,MAArB,YAA0B,CAAC,GAAG,CAAC;AAChD,cAAM,OAA+B,CAAC;AACtC,mBAAW,QAAQ,kCAAc,CAAC,GAAG;AACjC,cAAI,CAAC,OAAO,QAAQ,MAAM,SAAS,MAAM,EAAG;AAC5C,cACI,cACA,IAAI,eACJ,CAAC,gBAAgB,QAAQ,MAAM,IAAI,WAAW;AAE9C;AACJ,eAAK,KAAK,IAAI;AAAA,QAClB;AACA,YAAI,KAAK,OAAQ,WAAU,MAAM,IAAI;AAAA,MACzC;AACA,UAAI,OAAO,KAAK,SAAS,EAAE,OAAQ,CAAC,IAAY,QAAQ;AAAA,IAC5D;AAGA,QAAK,UAAkB,QAAQ;AAC3B,YAAM,aAGF,CAAC;AACL,YAAM,UAAU,IAAI,IAAI,IAAI,aAAa,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC;AAClE,iBAAW,CAAC,SAAS,KAAK,KAAK,OAAO;AAAA,QACjC,UAAkB;AAAA,MAIvB,GAAG;AACC,YAAI,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAG;AACnC,cAAM,SAA0BC,gBAAe,OAAO,IAChD,OAAO,OAAO,IACb;AACP,cAAM,OAA+B,CAAC;AACtC,mBAAW,QAAQ,wBAAS,CAAC,GAAG;AAC5B,cAAI,CAAC,OAAO,QAAQ,MAAM,QAAQ,MAAM,EAAG;AAC3C,cACI,cACA,IAAI,eACJ,CAAC,gBAAgB,QAAQ,MAAM,IAAI,WAAW;AAE9C;AACJ,eAAK,KAAK,IAAI;AAAA,QAClB;AACA,YAAI,KAAK,OAAQ,YAAW,MAAM,IAAI;AAAA,MAC1C;AACA,UAAI,OAAO,KAAK,UAAU,EAAE;AACxB,QAAC,IAAY,SAAS;AAAA,IAC9B;AAEA,WAAO;AAAA,MACH,QAAQ,OAAO,KAAK,GAAG,EAAE,SAAS,MAAM;AAAA,MACxC,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAEA,SAASA,gBAAe,GAAyB;AAC7C,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AACrD;AAYA,SAAS,wBACL,iBACA,WACA,WACA,UACiB;AA/vBrB;AAgwBI,QAAM,QAA2B,CAAC;AAElC,aAAW,OAAO,iBAAiB;AAC/B,UAAM,IAAI,UAAU,IAAI,GAAG;AAC3B,QAAI,CAAC,EAAG;AAER,UAAM,mBAAkB,OAAE,iBAAF,YAAkB,YAAY;AACtD,UAAM,SAAS,mBAAmB,OAAE,SAAF,mBAAgB,OAAO;AAGzD,QAAI,kBAAkB,QAAQ;AAC1B,YAAM,MACF,UAAU,oBAAoB,EAAE,EAAE;AACtC,YAAM,OAAO;AAAA,QACT,EAAE;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA,UAAI,KAAM,OAAM,KAAK,IAAI;AAAA,IAC7B;AAGA,QAAI,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,QAAQ;AAC9C,YAAM,kBACF,eAAU,0BAA0B,EAAE,EAAE,MAAxC,YAA6C,CAAC;AAClD,UAAI,eAAe,QAAQ;AACvB,cAAM,UAAU,IAAI;AAAA,UAChB,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,QAClC;AACA,mBAAW,OAAO,gBAAgB;AAC9B,gBAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,cAAI,CAAC,IAAK;AACV,gBAAK,SAAI,iBAAJ,YAAoB,YAAY,UAAW;AAChD,gBAAM,KAAK,mBAAmB,SAAI,SAAJ,mBAAkB,OAAO;AACvD,cAAI,CAAC,GAAI;AAET,gBAAM,YACF,UAAU,oBAAoB,EAAE,EAAE;AACtC,gBAAM,OAAO;AAAA,YACT,IAAI;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AACA,cAAI,KAAM,OAAM,KAAK,IAAI;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,kBAAkB,GAAuC;AAC9D,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,QAAM,MAAM;AACZ,MAAI,CAAC,IAAI,QAAQ,OAAO,IAAI,SAAS,YAAY,CAAC,OAAO,SAAS,IAAI,IAAI;AACtE,WAAO;AACX,MACI,IAAI,SAAS,UACb,IAAI,SAAS,kBACb,IAAI,SAAS,eACb,IAAI,SAAS;AAEb,WAAO;AACX,QAAM,MAAqB,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK;AAC5D,MAAI,IAAI,YAAY,WAAW,IAAI,YAAY;AAC3C,QAAI,UAAU,IAAI;AACtB,MACI,IAAI,gBAAgB,mBACpB,IAAI,gBAAgB,kBACpB,IAAI,gBAAgB,OACtB;AACE,QAAI,cAAc,IAAI;AAAA,EAC1B;AACA,MAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,GAAG;AACnD,QAAI,QAAQ,IAAI,MAAM,KAAK;AAAA,EAC/B;AACA,SAAO;AACX;AAEA,SAAS,2BACL,QACA,QACA,UACA,OAC2B;AAv1B/B;AAw1BI,QAAM,OAAwB;AAAA,IAC1B;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,IAChE,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,QAAQ,EAAE,SAAS;AAAA,EACvB;AACA,MAAI,OAAO,SAAS,aAAa;AAC7B,SAAK,OAAO,WAAU,YAAO,YAAP,YAAkB;AACxC,QAAI,OAAO,YAAY,UAAU;AAC7B,WAAK,OAAO,QAAQ,MAAM,QAAQ,KAAK,IACjC,MAAM,SACN,OAAO,UAAU,WACf,MAAM,SACN;AAAA,IACZ,OAAO;AACH,WAAK,OAAO,QAAQ,MAAM,QAAQ,KAAK,KAChC,WAAM,CAAC,MAAP,YAAY,OACZ,wBAAS;AAAA,IACpB;AAAA,EACJ;AACA,SAAO;AACX;AAIA,SAAS,kBACL,OACA,iBACA,WACA,WAC6B;AAx3BjC;AAy3BI,QAAM,MAAqC,CAAC;AAC5C,MAAI,KAAK,IAAI;AAEb,aAAW,OAAO,iBAAiB;AAC/B,UAAM,IAAI,UAAU,IAAI,GAAG;AAC3B,QAAI,CAAC,EAAG;AAER,UAAM,QAAQ,iBAAiB,EAAE,OAAO;AACxC,UAAM,aAAa,MAAM,IAAI,KAAK;AAElC,UAAM,kBAAiB,eAAU,0BAA0B,GAAG,MAAvC,YAA4C,CAAC;AACpE,eAAW,OAAO,gBAAgB;AAC9B,UAAI,GAAG,IAAI,aAAa,QAAQ;AAAA,IACpC;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,iBAAiB,MAAkD;AACxE,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,eAAW,KAAK,KAAM,KAAI,EAAG,KAAI,IAAI,OAAO,CAAC,CAAC;AAAA,EAClD,OAAO;AACH,QAAI,IAAI,OAAO,IAAI,CAAC;AAAA,EACxB;AACA,SAAO;AACX;AAIA,SAAS,iBACL,OACA,QACA,QACA,qBACA,mBACA,kBACA,WACA,iBACA,WACqC;AACrC,QAAM,MAAiC,CAAC;AAGxC,QAAM,qBAMa,WAAmB;AAEtC,MAAI;AACA,QAAI,sBAAsB,mBAAmB;AACzC,YAAM,QAAQ;AAAA,QACV;AAAA,UACI,GAAG;AAAA,UACH,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA,EAAE,MAAM,MAAM;AAAA,MAClB;AACA,UAAI,SAAS,MAAM,QAAQ;AACvB,YAAI,YAAY;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ,QAAQ;AAAA,EAER;AAGA,QAAM,kBAA6D,CAAC;AACpE,aAAW,OAAO,iBAAiB;AAC/B,UAAM,IAAI,UAAU,IAAI,GAAG;AAC3B,QAAI,CAAC,EAAG;AACR,UAAM,SAAS,UAAU,oBAAoB,GAAG,MAAM;AACtD,QAAI,UAAU,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG;AACxC,sBAAgB,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACJ;AACA,MAAI,gBAAgB,QAAQ;AACxB,IAAC,IAAY,UAAU;AAAA,EAC3B;AAEA,MAAI,CAAE,IAAY,aAAa,CAAE,IAAY,QAAS,QAAO;AAC7D,SAAO;AACX;AAIA,SAAS,iBAAiB,UAOxB;AA/9BF;AAg+BI,QAAM,wBAAuB,cAAS,yBAAT,YAAiC;AAC9D,QAAM,KAAK,oBAAoB,SAAS,UAAU;AAClD,SAAO,EAAE,YAAY,IAAI,qBAAqB;AAClD;AAEA,SAASC,QACL,KACA,IACgC;AAChC,SAAO,qBAAqB,KAAK,EAAE;AACvC;AAEA,SAAS,cACL,cACA,UAC6B;AAC7B,MAAI,MAA0B;AAC9B,MAAI,MAA0B;AAE9B,aAAW,OAAO,cAAc;AAC5B,UAAM,MAAMA,QAAO,UAAU,GAAG;AAChC,QAAI,CAAC,IAAK;AAEV,QAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,SAAS,IAAI,GAAG,GAAG;AACzD,YAAM,QAAQ,SAAY,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,IAC7D;AACA,QAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,SAAS,IAAI,GAAG,GAAG;AACzD,YAAM,QAAQ,SAAY,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,IAC7D;AAAA,EACJ;AAEA,SAAO,EAAE,KAAK,oBAAO,GAAG,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC,EAAG;AAClE;;;ACj6BO,SAAS,qBACZ,UAAiC,CAAC,GACpB;AAjGlB;AAkGI,QAAM,WAAW,eAAe,QAAQ,SAAS;AACjD,MAAI,UAAU,eAAe,QAAQ,SAAS;AAE9C,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAW,aAAQ,aAAR,YAAoB,CAAC;AACtC,QAAM,YAAW,aAAQ,aAAR,YAAoB,CAAC;AAEtC,WAAS,QAA6B;AAClC,WAAO;AAAA,MACH,UAAU,eAAe,QAAQ;AAAA,MACjC,SAAS,eAAe,OAAO;AAAA,MAC/B,SAAS,CAAC,cAAc,UAAU,OAAO;AAAA,IAC7C;AAAA,EACJ;AAEA,WAAS,QAAyB;AAC9B,WAAO,eAAe,OAAO;AAAA,EACjC;AAEA,WAAS,QAA6B;AAClC,cAAU,eAAe,QAAQ;AACjC,WAAO,MAAM;AAAA,EACjB;AAEA,WAAS,IAAI,WAAiD;AA1HlE,QAAAC,KAAAC;AA2HQ,UAAM,MAA8B,CAAC;AAErC,eAAW,CAAC,SAAS,IAAI,KAAK,OAAO,SAAQD,MAAA,QAAQ,WAAR,OAAAA,MAAkB,CAAC,CAAC,GAAG;AAChE,UAAI,OAAO,OAAO,MAAM,OAAO,SAAS,EAAG;AAC3C,UAAI,KAAK;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,UAAU,CAAC,GAAI,sBAAQ,CAAC,CAAE;AAAA,MAC9B,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,MAAO,QAAO;AAEnB,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,SAAQC,MAAA,QAAQ,UAAR,OAAAA,MAAiB,CAAC,CAAC,GAAG;AAC9D,YAAM,OAAO,4BAA4B,OAAO,MAAM;AACtD,UAAI,OAAO,KAAK,OAAO,MAAM,OAAO,SAAS,EAAG;AAEhD,UAAI,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,KAAK;AAAA,QACd,UAAU,CAAC,GAAI,sBAAQ,CAAC,CAAE;AAAA,MAC9B,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AACA,WAAS,SAAS,SAA2C;AAtJjE,QAAAD,KAAAC,KAAA;AAuJQ,QAAI,QAAQ,UAAU,UAAU;AAC5B,aAAO,CAAC,IAAIA,OAAAD,MAAA,QAAQ,WAAR,gBAAAA,IAAiB,QAAQ,aAAzB,OAAAC,MAAqC,CAAC,CAAE;AAAA,IACxD;AACA,WAAO,CAAC,IAAI,mBAAQ,UAAR,mBAAgB,QAAQ,YAAxB,YAAmC,CAAC,CAAE;AAAA,EACtD;AAEA,WAAS,MACL,SACA,YACmB;AAhK3B,QAAAD,KAAAC;AAiKQ,UAAM,aAAa;AAAA,MACf,kCAAc,SAAS,OAAO;AAAA,MAC9B;AAAA,IACJ;AAEA,QAAI,QAAQ,UAAU,UAAU,CAAC,OAAO;AACpC,aAAO;AAAA,QACH;AAAA,QACA,SAAS,CAAC;AAAA,QACV,UAAU,WAAW,IAAI,CAAC,eAAe;AAAA,UACrC;AAAA,UACA,IAAI;AAAA,UACJ,SAAS,CAAC,uBAAuB;AAAA,QACrC,EAAE;AAAA,QACF,UAAU,CAAC,uBAAuB;AAAA,MACtC;AAAA,IACJ;AAIA,UAAM,gBAAgB,eAAe,OAAO;AAE5C,QAAI,QAAQ,UAAU,UAAU;AAC5B,OAAAD,MAAA,cAAc,WAAd,OAAAA,MAAA,cAAc,SAAW,CAAC;AAC1B,UAAI,WAAW;AACX,sBAAc,OAAO,QAAQ,OAAO,IAAI;AAAA,UACvC,QAAO,cAAc,OAAO,QAAQ,OAAO;AAAA,IACpD,OAAO;AACH,OAAAC,MAAA,cAAc,UAAd,OAAAA,MAAA,cAAc,QAAU,CAAC;AACzB,UAAI,WAAW;AACX,sBAAc,MAAM,QAAQ,MAAM,IAAI;AAAA,UACrC,QAAO,cAAc,MAAM,QAAQ,MAAM;AAAA,IAClD;AAGA,QAAI,CAAC,OAAO;AACR,UAAI,QAAQ,UAAU,UAAU;AAC5B,eAAO;AAAA,UACH;AAAA,UACA,SAAS,CAAC;AAAA,UACV,UAAU,WAAW,IAAI,CAAC,eAAe;AAAA,YACrC;AAAA,YACA,IAAI;AAAA,YACJ,SAAS,CAAC,uBAAuB;AAAA,UACrC,EAAE;AAAA,UACF,UAAU,CAAC,uBAAuB;AAAA,QACtC;AAAA,MACJ;AAEA,YAAMC,YAAqC,CAAC;AAC5C,YAAMC,WAA0B,CAAC;AAEjC,iBAAW,aAAa,YAAY;AAChC,cAAM,UAAiC,CAAC;AAExC,YAAI,OAAO,SAAS,MAAM,OAAO,QAAQ,OAAO,GAAG;AAC/C,kBAAQ,KAAK,gBAAgB;AAAA,QACjC;AAEA,YAAI,QAAQ,QAAQ;AAChB,UAAAD,UAAS,KAAK,EAAE,WAAW,IAAI,OAAO,QAAQ,CAAC;AAAA,QACnD,OAAO;AACH,UAAAC,SAAQ,KAAK,SAAS;AAAA,QAC1B;AAAA,MACJ;AAEA,aAAO;AAAA,QACH;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,SAAAA;AAAA,QACA,UAAAD;AAAA,QACA,UAAU,CAAC;AAAA,MACf;AAAA,IACJ;AAEA,UAAM,YAA0B;AAAA,MAC5B,GAAG;AAAA,MACH,WAAW;AAAA,IACf;AAEA,UAAM,QAAQ,uBAAuB,WAAW,UAAU;AAAA,MACtD,GAAG;AAAA,MACH,MAAM;AAAA,IACV,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM;AAC/B,UAAI,QAAQ,UAAU,UAAU;AAC5B,eACI,EAAE,UAAU,YACZ,OAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,OAAO;AAAA,MAEpD;AACA,aACI,EAAE,UAAU,UACZ,OAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,MAAM;AAAA,IAElD,CAAC;AAED,UAAM,WAAqC,WACtC,IAAI,CAAC,cAAc;AAChB,YAAM,UAAU,OACX,OAAO,CAAC,MAAM,OAAO,EAAE,SAAS,MAAM,OAAO,SAAS,CAAC,EACvD,IAAI,CAAC,MAAM,cAAc,EAAE,MAAM,CAAC;AAEvC,aAAO;AAAA,QACH;AAAA,QACA,IAAI,QAAQ,WAAW;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ,CAAC,EACA,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AAE5B,UAAM,UAAU,WAAW;AAAA,MACvB,CAAC,cACG,CAAC,SAAS;AAAA,QACN,CAAC,MAAM,OAAO,EAAE,SAAS,MAAM,OAAO,SAAS;AAAA,MACnD;AAAA,IACR;AAEA,UAAM,OACF,QAAQ,UAAU,WACZ,EAAE,IAAI,MAAM,SAAS,QAAQ,QAAQ,IACrC,wBAAwB,OAAO,QAAQ,MAAM;AACvD,UAAM,WAAU,6BAAM,MAAK,KAAK,UAAU;AAE1C,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,CAAC;AAAA,IACf;AAAA,EACJ;AAEA,WAAS,IACL,SACA,WACAE,UACmB;AACnB,WAAO,QAAQ,SAAS,CAAC,SAAS,GAAGA,QAAO;AAAA,EAChD;AAEA,WAAS,QACL,SACA,YACAA,UACmB;AACnB,UAAM,WAAW,SAAS,OAAO;AACjC,UAAM,SAAS,CAAC,GAAG,QAAQ;AAE3B,UAAM,WACF,QAAOA,YAAA,gBAAAA,SAAS,WAAU,WACpB,MAAMA,SAAQ,OAAO,GAAG,OAAO,MAAM,IACrC;AAEV,UAAM,WAAW,uBAAuB,YAAY,IAAI,EAAE;AAAA,MACtD,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC;AAAA,IACxD;AAEA,QAAI,aAAa,QAAW;AACxB,aAAO,KAAK,GAAG,QAAQ;AAAA,IAC3B,OAAO;AACH,aAAO,OAAO,UAAU,GAAG,GAAG,QAAQ;AAAA,IAC1C;AAEA,WAAO,QAAQ,SAAS,QAAQA,QAAO;AAAA,EAC3C;AAEA,WAASC,QACL,SACA,WACmB;AACnB,UAAM,OAAO,SAAS,OAAO,EAAE;AAAA,MAC3B,CAAC,OAAO,OAAO,EAAE,MAAM,OAAO,SAAS;AAAA,IAC3C;AACA,WAAO,WAAW,SAAS,IAAI;AAAA,EACnC;AAEA,WAAS,QACL,SACA,YACAD,UACmB;AACnB,UAAM,SAAS,CAAC,EAACA,YAAA,gBAAAA,SAAS;AAC1B,UAAM,aAAa,uBAAuB,YAAY,IAAI;AAC1D,UAAM,UAAU,MAAM,SAAS,UAAU;AACzC,UAAM,OAAO,SAAS,QAAQ,UAAU;AACxC,WAAO,WAAW,SAAS,IAAI;AAAA,EACnC;AAEA,WAAS,MAAM,SAAgD;AAC3D,WAAO,WAAW,SAAS,CAAC,CAAC;AAAA,EACjC;AAEA,WAAS,SACL,SACA,KAKc;AACd,QAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAI,QAAQ,UAAU,UAAU;AAC5B,aAAO,qBAAqB;AAAA,QACxB,SAAS,QAAQ;AAAA,QACjB;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,SAAS,2BAAK;AAAA,QACd,QAAQ,2BAAK;AAAA,QACb,OAAO,2BAAK;AAAA,MAChB,CAAC;AAAA,IACL;AAEA,UAAM,OAAO,4BAA4B,OAAO,QAAQ,MAAM;AAC9D,QAAI,CAAC,KAAK,QAAS,QAAO,CAAC;AAE3B,WAAO,qBAAqB;AAAA,MACxB,SAAS,KAAK;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,OAAO,KAAK,YAAY,CAAC;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,SAAS,2BAAK;AAAA,MACd,QAAQ,2BAAK;AAAA,MACb,OAAO,2BAAK;AAAA,IAChB,CAAC;AAAA,EACL;AAEA,WAAS,WACL,SACA,UACmB;AA9Y3B,QAAAJ,KAAAC;AA+YQ,UAAM,OAAO,eAAe,OAAO;AAEnC,QAAI,QAAQ,UAAU,UAAU;AAC5B,OAAAD,MAAA,KAAK,WAAL,OAAAA,MAAA,KAAK,SAAW,CAAC;AACjB,UAAI,SAAS,QAAQ;AACjB,aAAK,OAAO,QAAQ,OAAO,IAAI,CAAC,GAAG,QAAQ;AAAA,MAC/C,OAAO;AACH,eAAO,KAAK,OAAO,QAAQ,OAAO;AAClC,YAAI,CAAC,OAAO,KAAK,KAAK,MAAM,EAAE,OAAQ,QAAO,KAAK;AAAA,MACtD;AAAA,IACJ,OAAO;AACH,OAAAC,MAAA,KAAK,UAAL,OAAAA,MAAA,KAAK,QAAU,CAAC;AAChB,UAAI,SAAS,QAAQ;AACjB,aAAK,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG,QAAQ;AAAA,MAC7C,OAAO;AACH,eAAO,KAAK,MAAM,QAAQ,MAAM;AAChC,YAAI,CAAC,OAAO,KAAK,KAAK,KAAK,EAAE,OAAQ,QAAO,KAAK;AAAA,MACrD;AAAA,IACJ;AAEA,cAAU;AACV,WAAO,MAAM;AAAA,EACjB;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAIA,SAAS,eAAe,OAA0C;AAC9D,SAAO;AAAA,IACH,IAAI,+BAAO,SAAQ,EAAE,OAAO,iBAAiB,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,IAC/D,IAAI,+BAAO,UAAS,EAAE,QAAQ,iBAAiB,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,EACtE;AACJ;AAEA,SAAS,iBACL,OAC4B;AAC5B,QAAM,MAAoC,CAAC;AAC3C,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,EAAG,KAAI,CAAC,IAAI,CAAC,GAAI,gBAAK,CAAC,CAAE;AAClE,SAAO;AACX;AAEA,SAAS,cAAc,GAAqB,GAA8B;AACtE,SAAO,KAAK,UAAU,gBAAK,CAAC,CAAC,MAAM,KAAK,UAAU,gBAAK,CAAC,CAAC;AAC7D;AAEA,SAAS,uBACL,OACA,eACc;AACd,QAAM,MAAsB,CAAC;AAC7B,aAAW,QAAQ,wBAAS,CAAC,GAAG;AAC5B,QAAI,CAAC,oBAAoB,IAAI,EAAG;AAChC,UAAM,SAAS,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC;AACzD,QAAI,OAAQ;AACZ,QAAI,KAAK,IAAI;AAAA,EACjB;AACA,SAAO,gBAAgB,MAAM;AACjC;AAEA,SAAS,oBAAoB,OAAuC;AAChE,SACK,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAClD,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAE5D;AAEA,SAAS,MAAM,GAAW,KAAa,KAAqB;AACxD,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;AACzC;AAQA,SAAS,wBACL,OACA,QACoB;AACpB,QAAM,MAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACrD,MAAI,KAAK;AACL,QAAI,CAAC,oBAAqB,IAAY,UAAU,GAAG;AAC/C,aAAO,EAAE,IAAI,OAAO,SAAS,CAAC,YAAY,EAAE;AAAA,IAChD;AACA,WAAO;AAAA,MACH,IAAI;AAAA,MACJ,SAAU,IAAY;AAAA,MACtB,aAAa,CAAC,IAAI,EAAE;AAAA,IACxB;AAAA,EACJ;AAEA,QAAM,MAAM,gBAAgB,MAAM,QAAQ,MAAM;AAChD,MAAI,CAAC,KAAK;AACN,WAAO,EAAE,IAAI,OAAO,SAAS,CAAC,gBAAgB,EAAE;AAAA,EACpD;AAEA,MAAI,CAAC,oBAAqB,IAAI,OAAuB,UAAU,GAAG;AAC9D,WAAO,EAAE,IAAI,OAAO,SAAS,CAAC,YAAY,EAAE;AAAA,EAChD;AAEA,SAAO;AAAA,IACH,IAAI;AAAA,IACJ,SAAU,IAAI,OAAuB;AAAA,IACrC,aAAaC,gBAAe,IAAI,MAAM,OAAO;AAAA,EACjD;AACJ;AAEA,SAAS,gBACL,QACA,UAC4C;AA9gBhD;AA+gBI,aAAW,SAAS,QAAQ;AACxB,eAAW,WAAU,WAAM,YAAN,YAAiB,CAAC,GAAG;AACtC,UAAI,OAAO,OAAO,SAAU,QAAO,EAAE,OAAO,OAAO;AAAA,IACvD;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAASA,gBAAe,GAA4C;AAChE,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,OAAO,OAAO;AAC7C,SAAO,IAAI,CAAC,CAAC,IAAI,CAAC;AACtB;AAEA,SAAS,cAAc,QAAsC;AACzD,UAAQ,OAAO,MAAM,GAAG;AAAA,IACpB,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;;;AC3iBO,SAAS,SAAS,KAA0B,MAAsB;AAFzE;AAGI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,QAAQ,oBAAI,IAAY;AAAA,IAC1B,KAAI,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACxC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EAC3C,CAAC;AACD,MAAI,YAAY,WAAW,IAAI;AAC/B,SAAO,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC7D,SAAO;AACX;AAEO,SAAS,eACZ,KACA,SACA,MACM;AAjBV;AAkBI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,QAAO,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7D,QAAM,QAAQ,IAAI,MAAK,gCAAK,YAAL,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3D,MAAI,YAAY;AAChB,MAAI,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC1D,SAAO,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC7D,SAAO;AACX;AAEO,SAAS,MACZ,KACA,QACM;AA9BV;AA+BI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,QAAQ,oBAAI,IAAY;AAAA,IAC1B,KAAI,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACxC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACvC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG,QAAQ,CAAC,MAAG;AAnC5C,UAAAC,KAAAC;AAmC+C,cAAAA,OAAAD,MAAA,EAAE,YAAF,gBAAAA,IAAW,IAAI,CAAC,MAAM,EAAE,QAAxB,OAAAC,MAA+B,CAAC;AAAA,KAAC;AAAA,EAC5E,CAAC;AACD,WAAS,IAAI,GAAG,IAAI,KAAQ,KAAK;AAC7B,UAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AACzB,QAAI,CAAC,MAAM,IAAI,EAAE,EAAG,QAAO;AAAA,EAC/B;AACA,QAAM,IAAI,MAAM,uBAAuB;AAC3C;AAEO,SAAS,cAAc,KAAqB;AAC/C,QAAM,IAAI,IAAI,MAAM,sCAAsC;AAC1D,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC,EAAE,KAAK;AACvB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,UAAU,CAAC;AAC7B;AAEO,SAAS,aAAa,KAAkC;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,MAAM,uBAAuB;AAC3C,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,QAAQ,CAAC;AAC3B;AAEO,SAAS,wBAAwB,KAAqB;AACzD,SAAO,WAAW,GAAG;AACzB;AAEO,SAAS,WAAW,KAAqB;AAC5C,QAAM,IAAI,IAAI,MAAM,yBAAyB;AAC7C,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,QAAQ,CAAC;AAC3B;AAEO,SAAS,WAAW,KAAqB;AAC5C,QAAM,IAAI,IAAI,MAAM,cAAc;AAClC,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,SAAO,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AAC3C;;;AClEO,SAAS,UACZ,KACA,KACA,OAAyB,CAAC,GACpB;AACN,QAAM,aAAa,IAAI,aAAa,kBAAkB;AACtD,MAAI;AACA,QAAI,QAAQ;AACZ,QAAI,SAAS,aAAa,MAAM;AAC5B,UAAI,IAAI,SAAS,OAAO;AACpB,gBAAQ,aAAa,KAAK,IAAI,IAAI,IAAI;AAAA,MAC1C,WAAW,IAAI,SAAS,SAAS;AAC7B,gBAAQ,eAAe,KAAK,IAAI,IAAI,IAAI;AAAA,MAC5C,OAAO;AACH,gBAAQ,gBAAgB,KAAK,IAAI,SAAS,IAAI,IAAI,IAAI;AAAA,MAC1D;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX,SAAS,KAAK;AACV,QAAI,aAAa,YAAY,MAAM;AACnC,UAAM;AAAA,EACV;AACJ;AAEO,SAAS,aACZ,KACA,OACA,MACM;AAxCV;AAyCI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAC3C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAEnD,QAAM,MAAK,UAAK,OAAL,YAAW,IAAI,SAAS,IAAI,EAAE;AACzC,QAAM,UAAS,UAAK,kBAAL,YAAsB,gBAAe,SAAI,UAAJ,YAAa,EAAE;AAEnE,MAAI,CAAC,KAAK,cAAc;AACpB,QAAI,WAAW,CAAC,MAAM;AAlD9B,UAAAC;AAmDY,YAAMC,SAAQ,EAAE,GAAG,KAAK,IAAI,MAAM;AAClC,MAAAA,OAAM,UAAU,IAAI;AACpB,MAAAA,OAAM,wBAAwB;AAC9B,MAAAA,OAAM,qBAAqB;AAC3B,YAAM,OAAMD,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC;AAC1B,YAAM,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AAC/C,UAAI,OAAO,MAAM,GAAG,GAAGC,MAAK;AAC5B,QAAE,UAAU;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,UAAU,CAAC,GAAe,QAAwB;AACpD,QAAI,KAAK,CAAC;AACV,eAAW,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG;AACxD,cAAQ,OAAc,GAAG;AAAA,IAC7B;AAAA,EACJ;AACA,QAAM,UAA0B,CAAC;AACjC,UAAQ,KAAK,OAAO;AAEpB,aAAW,KAAK,SAAS;AACrB,UAAM,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,EAAE,CAAC;AAAA,EAC7D;AAEA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM;AA7EtC,QAAAD,KAAAE,KAAAC;AA8EQ,UAAM,SAAS,EAAE,GAAG,EAAE;AACtB,WAAO,KAAK,MAAM,IAAI,EAAE,EAAE;AAC1B,WAAO,QACH,EAAE,OAAO,IAAI,KACP,UACCH,MAAA,KAAK,kBAAL,OAAAA,MAAsB,gBAAeE,MAAA,EAAE,UAAF,OAAAA,MAAW,EAAE,EAAE;AAC/D,WAAO,UAAU,EAAE,WAAWC,MAAA,MAAM,IAAI,EAAE,OAAO,MAAnB,OAAAA,MAAwB,EAAE,UAAW;AACnE,WAAO,qBAAqB;AAC5B,WAAO,wBAAwB;AAC/B,WAAO;AAAA,EACX,CAAC;AAED,MAAI,WAAW,CAAC,MAAM;AA1F1B,QAAAH;AA2FQ,UAAM,OAAMA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC;AAC1B,UAAM,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AACnD,QAAI,OAAO,UAAU,GAAG,GAAG,OAAO,CAAC,CAAQ;AAC3C,eAAW,KAAK,OAAO,MAAM,CAAC,EAAG,KAAI,KAAK,CAAQ;AAClD,MAAE,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AACX;AAEO,SAAS,eACZ,KACA,SACA,MACM;AAzGV;AA0GI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,QAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC/C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAEvD,QAAM,MAAK,UAAK,OAAL,YAAW,IAAI,SAAS,IAAI,EAAE;AACzC,QAAM,UAAS,UAAK,kBAAL,YAAsB,gBAAe,SAAI,UAAJ,YAAa,EAAE;AACnE,QAAM,OAAO,KAAK,eACZ,KAAK,aAAa,IAAI,IAAI,IAC1B,aAAa,IAAI,IAAI;AAE3B,QAAM,QAAQ,CAAC,QAAa;AArHhC,QAAAA;AAsHQ,eAAI;AAAA,MACA;AAAA,QACCA,MAAA,KAAK,qBAAL,OAAAA,MAAyB,yBAAyB,GAAG;AAAA,IAC1D;AAAA;AAEJ,QAAM,kBAAiB,SAAI,YAAJ,YAAe,CAAC,GAAG,IAAI,CAAC,MAAG;AA3HtD,QAAAA,KAAAE;AA2H0D;AAAA,MAClD,GAAG;AAAA,MACH,IAAI,MAAM,EAAE,EAAE;AAAA,MACd,SAAQF,MAAA,KAAK,kBAAL,OAAAA,MAAsB,gBAAeE,MAAA,EAAE,UAAF,OAAAA,MAAW,EAAE,EAAE;AAAA,IAChE;AAAA,GAAE;AAEF,QAAM,SAAS;AAAA,IACX,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAU,UAAK,iBAAL,YAAqB,QAAQ,IAAI,UAAU;AAAA,IACrD,SAAS;AAAA,EACb;AAEA,QAAM,cAAc,oBAAI,IAAoB;AAC5C,IAAC,SAAI,YAAJ,YAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM;AA3I1C,QAAAF,KAAAE;AA4IQ,UAAM,YAAWA,OAAAF,MAAA,cAAc,CAAC,MAAf,gBAAAA,IAAkB,OAAlB,OAAAE,MAAwB,EAAE;AAC3C,gBAAY,IAAI,EAAE,IAAI,QAAQ;AAAA,EAClC,CAAC;AAED,MAAI,WAAW,CAAC,MAAM;AAhJ1B,QAAAF,KAAAE,KAAAC,KAAAC,KAAAC,KAAAC,KAAAC;AAiJQ,UAAM,OAAMP,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC;AACzB,UAAM,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO;AACjD,QAAI,OAAO,MAAM,GAAG,GAAG,MAAa;AACpC,MAAE,SAAS;AAEX,QAAI,KAAK,sBAAsB;AAC3B,iBAAW,MAAKE,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG;AAC7B,aAAIC,MAAA,EAAE,aAAF,gBAAAA,IAAY,SAAS,UAAU;AAC/B,gBAAM,IAAI,IAAI,IAAI,EAAE,QAAQ;AAC5B,YAAE,IAAI,EAAE;AACR,YAAE,WAAW,MAAM,KAAK,CAAC;AAAA,QAC7B;AACA,aAAIC,MAAA,EAAE,aAAF,gBAAAA,IAAY,SAAS,UAAU;AAC/B,gBAAM,IAAI,IAAI,IAAI,EAAE,QAAQ;AAC5B,YAAE,IAAI,EAAE;AACR,YAAE,WAAW,MAAM,KAAK,CAAC;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,KAAK,gBAAgB;AACrB,YAAM,OAA+D;AAAA,QACjE;AAAA,QACA;AAAA,MACJ;AAEA,iBAAW,UAAU,MAAM;AACvB,cAAM,UAAUC,MAAA,EAAU,MAAM,MAAhB,OAAAA,MAAqB,CAAC;AACtC,cAAM,UAAoC,EAAE,GAAG,OAAO;AAEtD,mBAAW,CAAC,KAAK,OAAO,KAAK,OAAO;AAAA,UAChC;AAAA,QACJ,GAAG;AACC,cAAI,QAAQ,SAAS;AACjB,kBAAM,SAAS;AACf,kBAAM,SAAS,oBAAI,IAAI,CAAC,IAAIC,MAAA,QAAQ,MAAM,MAAd,OAAAA,MAAmB,CAAC,GAAI,GAAG,OAAO,CAAC;AAC/D,oBAAQ,MAAM,IAAI,MAAM,KAAK,MAAM;AACnC;AAAA,UACJ;AAEA,cAAI,YAAY,IAAI,GAAG,GAAG;AACtB,kBAAM,SAAS,YAAY,IAAI,GAAG;AAClC,kBAAM,SAAS,oBAAI,IAAI,CAAC,IAAIC,MAAA,QAAQ,MAAM,MAAd,OAAAA,MAAmB,CAAC,GAAI,GAAG,OAAO,CAAC;AAC/D,oBAAQ,MAAM,IAAI,MAAM,KAAK,MAAM;AAAA,UACvC;AAAA,QACJ;AAEA,QAAC,EAAU,MAAM,IAAI;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,SAAO;AACX;AAEO,SAAS,gBACZ,KACA,SACA,UACA,MACM;AA7MV;AA8MI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,QAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7C,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AACrD,QAAM,WAAU,OAAE,YAAF,YAAa,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AACnE,MAAI,SAAS,GAAG;AACZ,UAAM,IAAI,MAAM,qBAAqB,OAAO,KAAK,QAAQ,EAAE;AAAA,EAC/D;AACA,QAAM,QAAO,OAAE,YAAF,YAAa,CAAC,GAAG,MAAM;AAEpC,QAAM,QAAQ,IAAI;AAAA,IACd;AAAA,MACC,UAAK,qBAAL,YAAyB,yBAAyB,IAAI,EAAE;AAAA,EAC7D;AACA,QAAM,aAAY,UAAK,kBAAL,YAAsB,gBAAe,SAAI,UAAJ,YAAa,IAAI,EAAE;AAE1E,MAAI,WAAW,CAAC,MAAM;AA9N1B,QAAAP,KAAAE,KAAAC;AA+NQ,UAAM,QAAOH,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACzD,UAAM,OAAME,MAAA,IAAI,YAAJ,OAAAA,MAAe,CAAC;AAC5B,UAAMD,SAAQ,EAAE,GAAG,KAAK,IAAI,OAAO,OAAO,SAAS;AACnD,QAAI,OAAO,SAAS,GAAG,GAAGA,MAAK;AAC/B,QAAI,UAAU;AAEd,QAAI,KAAK,gBAAgB;AACrB,YAAM,SAAS,GAAG,OAAO,KAAK,QAAQ;AACtC,YAAM,SAAS,GAAG,OAAO,KAAK,KAAK;AACnC,iBAAW,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,MACJ,GAAY;AACR,cAAM,KAAIE,MAAA,EAAE,MAAM,MAAR,OAAAA,MAAa,CAAC;AACxB,YAAI,EAAE,MAAM,GAAG;AACX,YAAE,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,YAAE,MAAM,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,SAAO;AACX;;;ACnPA,SAAS,YAAY,KAAkC;AAHvD;AAII,QAAM,QAAQ,IAAI,MAAK,SAAI,SAAS,EAAE,YAAf,YAA0B,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACrE,WAAS,IAAI,GAAG,IAAI,KAAQ,KAAK;AAC7B,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,CAAC,MAAM,IAAI,EAAE,EAAG,QAAO;AAAA,EAC/B;AACA,QAAM,IAAI,MAAM,8BAA8B;AAClD;AAEO,SAAS,UACZ,KACA,OACM;AAfV;AAgBI,QAAM,MAAK,WAAM,OAAN,YAAY,YAAY,GAAG;AAEtC,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AArBlC,UAAAK;AAsBgB,YAAM,WAAWA,MAAA,EAAE,YAAF,OAAAA,MAAA,EAAE,UAAY,CAAC;AAChC,UAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;AAClC,cAAM,IAAI,MAAM,cAAc,EAAE,kBAAkB;AAAA,MACtD;AACA,cAAQ,KAAK,EAAE,GAAG,OAAO,GAAG,CAAC;AAAA,IACjC,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AAED,SAAO;AACX;AAEO,SAAS,aACZ,KACA,IACA,OACI;AACJ,QAAM,EAAE,IAAI,UAAU,GAAG,KAAK,IAAI;AAClC,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAClB,YAAM,UAAU,EAAE;AAClB,UAAI,EAAC,mCAAS,QAAQ;AAEtB,YAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC9C,UAAI,CAAC,OAAQ;AACb,aAAO,OAAO,QAAQ,IAAI;AAAA,IAC9B,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,aAAa,KAA0B,IAAkB;AACrE,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA3DlC;AA4DgB,UAAI,GAAC,OAAE,YAAF,mBAAW,QAAQ;AACxB,QAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/C,UAAI,CAAC,EAAE,QAAQ,OAAQ,QAAO,EAAE;AAAA,IACpC,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;;;AClEA,SAAS,aAAAC,kBAAiB;;;ACEnB,SAAS,cACZ,OACA,UACyC;AAL7C;AAMI,aAAW,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG;AAChC,UAAM,QAAO,OAAE,YAAF,YAAa,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAChE,QAAI,OAAO,EAAG,QAAO,EAAE,SAAS,EAAE,IAAI,OAAO,IAAI;AAAA,EACrD;AACA,SAAO;AACX;AAEO,SAAS,gBAAgB,OAA4C;AACxE,SAAO,MAAM,QAAQ,+BAAO,OAAO,KAAK,MAAM,QAAQ,SAAS;AACnE;AAEO,SAAS,oBAAoB,OAA4C;AAC5E,UAAO,+BAAO,YAAW,QAAQ,CAAC,gBAAgB,KAAK;AAC3D;AAEO,SAAS,6BACZ,OACA,SACI;AAxBR;AAyBI,OAAI,WAAM,yBAAN,mBAA6B,UAAU;AACvC,WAAO,MAAM,qBAAqB,OAAO;AAAA,EAC7C;AACA,OAAI,WAAM,yBAAN,mBAA6B,UAAU;AACvC,WAAO,MAAM,qBAAqB,OAAO;AAAA,EAC7C;AACA,MACI,MAAM,wBACN,OAAO,KAAK,MAAM,oBAAoB,EAAE,WAAW,GACrD;AACE,WAAO,MAAM;AAAA,EACjB;AACA,MACI,MAAM,wBACN,OAAO,KAAK,MAAM,oBAAoB,EAAE,WAAW,GACrD;AACE,WAAO,MAAM;AAAA,EACjB;AACJ;AAEO,SAAS,oBAAoB,MAAqB,IAAS;AAC9D,MAAI,OAAO,KAAK,kBAAkB,YAAY;AAC1C,QAAI,CAAC,KAAK,cAAc,EAAE,GAAG;AACzB,YAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE,CAAC,EAAE;AAAA,IACrD;AACA;AAAA,EACJ;AACA,MAAI,KAAK,YAAY;AACjB,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,YAAY,EAAS,GAAG;AACnE,YAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE,CAAC,EAAE;AAAA,IACrD;AACA;AAAA,EACJ;AACA,QAAM,IAAI,MAAM,yBAAyB;AAC7C;;;ADnDO,SAAS,QACZ,KACA,IACA,WACI;AACJ,QAAM,QAAQ,OAAO,gCAAa,EAAE,EAAE,KAAK;AAE3C,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAlBlC;AAmBgB,UAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,YAAI,CAAC,EAAG;AACR,cAAK,OAAE,UAAF,YAAW,QAAQ,MAAO;AAC/B,UAAE,QAAQ;AACV,YAAI,IAAI,aAAa;AACrB;AAAA,MACJ;AAEA,UAAI,IAAI,WAAW,EAAE,GAAG;AACpB,cAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,YAAI,CAAC,IAAK;AACV,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO;AAC3D,cAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,YAAI,CAAC,EAAG;AACR,cAAK,OAAE,UAAF,YAAW,QAAQ,MAAO;AAC/B,UAAE,QAAQ;AACV,YAAI,IAAI,aAAa;AACrB;AAAA,MACJ;AAEA,YAAM,QAAO,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD,UAAI,CAAC,IAAK;AACV,YAAK,SAAI,UAAJ,YAAa,QAAQ,MAAO;AACjC,UAAI,QAAQ;AACZ,UAAI,IAAI,aAAa;AAAA,IACzB,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,aACZ,KACA,SACA,UACI;AACJ,QAAM,MAAM,OAAO,aAAa,WAAW,WAAW;AACtD,QAAM,OAAO,IAAI,KAAK;AAEtB,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA7DlC;AA8DgB,YAAM,UAAS,OAAE,WAAF,YAAY,CAAC;AAC5B,YAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7C,UAAI,CAAC,GAAG;AACJ,YAAI,IAAI,KAAK,SAAS;AAAA,UAClB,MAAM;AAAA,UACN,SAAS,oBAAoB,OAAO;AAAA,UACpC,MAAM,EAAE,QAAQ;AAAA,QACpB,CAAC;AACD;AAAA,MACJ;AAEA,YAAM,kBACD,OAAQ,EAAU,eAAe,YAC9B,OAAO,SAAU,EAAU,UAAU,KACxC,OAAQ,EAAU,eAAe,YAC7B,EAAU,WAAW,KAAK,EAAE,SAAS;AAC9C,YAAM,mBAAmB,MAAM,QAAQ,EAAE,OAAO,IAC1C,EAAE,QAAQ;AAAA,QACN,CAAC,MACI,OAAQ,EAAU,eAAe,YAC9B,OAAO,SAAU,EAAU,UAAU,KACxC,OAAQ,EAAU,eAAe,YAC7B,EAAU,WAAW,KAAK,EAAE,SAAS;AAAA,MAClD,IACA;AAEN,UAAI,mBAAmB,kBAAkB;AACrC,YAAI,IAAI,KAAK,SAAS;AAAA,UAClB,MAAM;AAAA,UACN,SACI;AAAA,UACJ,MAAM;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ,CAAC;AACD;AAAA,MACJ;AAEA,UAAI,KAAK,WAAW,GAAG;AACnB,YAAI,UAAU,EAAG,QAAQ,EAAU;AACnC;AAAA,MACJ;AAEA,YAAM,YAAY,OAAO;AAAA,QACrB,CAAC,MAAG;AA5GxB,cAAAC;AA4G2B,mBAAE,OAAO,aAAYA,MAAA,EAAE,SAAF,OAAAA,MAAU,QAAQ;AAAA;AAAA,MAClD;AACA,UAAI,WAAW;AACX,YAAI,IAAI,KAAK,SAAS;AAAA,UAClB,MAAM;AAAA,UACN,SAAS,wCAAwC,IAAI;AAAA,UACrD,MAAM,EAAE,SAAS,cAAc,UAAU,GAAG;AAAA,QAChD,CAAC;AACD;AAAA,MACJ;AAEA,MAAC,EAAU,OAAO;AAAA,IACtB,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,UACZ,KACA,SACA,OAOM;AAvIV;AAwII,QAAM,MAAK,WAAM,OAAN,YAAY,IAAI,MAAM,GAAG;AAEpC,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA7IlC,UAAAA,KAAA;AA8IgB,YAAM,MAAKA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,qBAAqB,OAAO,aAAa;AACjE,YAAM,QAAQ,OAAE,YAAF,cAAE,UAAY,CAAC;AAC7B,UAAI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;AAC/B,cAAM,IAAI,MAAM,cAAc,EAAE,kBAAkB;AAAA,MACtD;AACA,WAAK,KAAK,EAAE,GAAG,OAAO,GAAG,CAAQ;AAAA,IACrC,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AAED,SAAO;AACX;AAEO,SAAS,aACZ,KACA,UACA,OAOF;AACE,MAAI,CAAC,IAAI,WAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AACA,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA7KlC;AA8KgB,YAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,UAAI,CAAC,MAAO;AACZ,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,OAAO;AAC7D,UAAI,EAAC,uBAAG,SAAS;AACjB,YAAM,IAAI,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACjD,UAAI,EAAG,QAAO,OAAO,GAAG,KAAK;AAAA,IACjC,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,aAAa,KAA0B,UAAkB;AACrE,MAAI,CAAC,IAAI,WAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AACA,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAhMlC;AAiMgB,YAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,UAAI,CAAC,MAAO;AACZ,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,OAAO;AAC7D,UAAI,EAAC,uBAAG,SAAS;AACjB,QAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,QAAQ;AAErD,YAAM,OAA+D;AAAA,QACjE;AAAA,QACA;AAAA,MACJ;AACA,iBAAW,KAAK,MAAM;AAClB,cAAM,MAAO,EAAU,CAAC;AACxB,YAAI,CAAC,IAAK;AACV,YAAI,IAAI,QAAQ,EAAG,QAAO,IAAI,QAAQ;AACtC,YAAI,CAAC,OAAO,KAAK,GAAG,EAAE,OAAQ,QAAQ,EAAU,CAAC;AAAA,MACrD;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,UAAU,KAA0B,IAAY,OAAqB;AACjF,QAAM,QAAQ,wBAAS,IAAI,KAAK;AAChC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAElD,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA7NlC;AA8NgB,UAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,YAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,MACJ;AACA,UAAI,IAAI,UAAU,EAAE,GAAG;AACnB,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,YAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,MACJ;AACA,UAAI,IAAI,WAAW,EAAE,GAAG;AACpB,cAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,YAAI,CAAC,IAAK;AACV,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO;AAC3D,cAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,YAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,MACJ;AACA,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,SACZ,KACA,SACA,MACF;AACE,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA9PlC;AA+PgB,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,UAAI,CAAC,EAAG;AACR,QAAE,OAAO;AAAA,IACb,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,WACZ,KACA,IACA,OACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA/QlC;AAgRgB,YAAM,YAAY,OAAO,UAAU,eAAe;AAAA,QAC9C;AAAA,QACA;AAAA,MACJ;AACA,YAAM,UACF,cACE,OAAO,MAAM,eAAe,YAC1B,OAAO,SAAS,MAAM,UAAU,KAC/B,OAAO,MAAM,eAAe,YACzB,MAAM,WAAW,KAAK,EAAE,SAAS;AAC7C,YAAM,MAAgC,UAChC,OAAO,MAAM,eAAe,WACxB,MAAM,WAAW,KAAK,IACtB,OAAO,MAAM,UAAU,IAC3B;AACN,YAAM,WAAW,MAAM;AAEvB,UAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,YAAI,CAAC,EAAG;AACR,YAAI,WAAW;AACX,cAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,cACpC,GAAE,aAAa;AAAA,QACxB;AACA;AAAA,MACJ;AAEA,UAAI,IAAI,WAAW,EAAE,GAAG;AACpB,cAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,YAAI,CAAC,IAAK;AACV,cAAMC,OAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO;AAC3D,cAAM,KAAI,KAAAA,MAAA,gBAAAA,GAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,YAAI,CAAC,EAAG;AAER,cAAM,eAAe,OAAE,iBAAF,YAAkB;AAGvC,cAAM,OAAO,8BAAY;AAEzB,YAAI,SAAS,WAAW;AACpB,cAAI,aAAa,QAAQ,QAAW;AAChC,gBAAI,IAAI,KAAK,SAAS;AAAA,cAClB,SAAS;AAAA,cACT,MAAM;AAAA,cACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,YAChC,CAAC;AAAA,UACL;AACA,YAAE,eAAe;AACjB,cAAI,gBAAgB,EAAG,QAAQ,EAAU;AACzC;AAAA,QACJ;AAEA,YAAI,SAAU,GAAE,eAAe;AAC/B,YAAI,WAAW;AACX,cAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,cACpC,GAAE,aAAa;AAAA,QACxB;AACA;AAAA,MACJ;AAEA,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAI,CAAC,GAAG;AACJ,cAAM,IAAI;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAEA,YAAMC,iBAAgB,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS;AACrE,YAAMC,YAAW,CAAC,CAAE,EAAU;AAE9B,UAAI,UAAU;AACV,UAAE,eAAe;AAAA,MACrB;AACA,YAAM,iBAAiB,OAAE,iBAAF,YAAkB;AAIzC,UAAID,gBAAe;AACf,YAAI,WAAW;AACX,cAAI,IAAI,KAAK,SAAS;AAAA,YAClB,SACI;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,UAChC,CAAC;AAAA,QACL;AACA,YAAI,gBAAiB,EAAW,QAAQ,EAAU;AAClD;AAAA,MACJ;AAEA,UAAI,CAACC,WAAU;AACX,YAAI,WAAW;AACX,cAAI,IAAI,KAAK,SAAS;AAAA,YAClB,SACI;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,UAChC,CAAC;AAAA,QACL;AACA,YAAI,gBAAiB,EAAW,QAAQ,EAAU;AAClD;AAAA,MACJ;AAEA,UAAI,kBAAkB,WAAW;AAC7B,YAAI,aAAa,QAAQ,QAAW;AAChC,cAAI,IAAI,KAAK,SAAS;AAAA,YAClB,SAAS;AAAA,YACT,MAAM;AAAA,YACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,UAChC,CAAC;AAAA,QACL;AACA,YAAI,gBAAiB,EAAW,QAAQ,EAAU;AAClD;AAAA,MACJ;AAEA,UAAI,WAAW;AACX,YAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,YACpC,CAAC,EAAU,aAAa;AAAA,MACjC;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,OACZ,KACA,SACF;AA/YF;AAgZI,QAAM,MAAK,aAAQ,OAAR,YAAc,IAAI,MAAM,GAAG;AACtC,QAAM,UAAU,EAAE,GAAG,SAAS,GAAG;AACjC,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AArZlC,UAAAH;AAsZgB,QAAE,UAAU,CAAC,IAAIA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAI,OAAO;AAAA,IAC9C,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AAzZlC,UAAAA;AA0ZgB,QAAE,YAAWA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IAC3D,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,UACZ,KACA,IACA,OACF;AACE,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAxalC;AAyagB,QAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG,IAAI,CAAC,MAAM;AACrC,YAAI,EAAE,OAAO,GAAI,QAAO;AACxB,eAAO;AACP,eAAO,EAAE,GAAG,GAAG,GAAG,MAAM;AAAA,MAC5B,CAAC;AAAA,IACL,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AAhblC;AAibgB,QAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,QAAI,CAAC,MAC/B,EAAE,OAAO,MAAM,OAAO,OAAO;AAAA,MACjC;AAAA,IACJ,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,UAAU,KAA0B,IAAY;AAC5D,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA7blC;AA8bgB,kBAAYI,WAAU,CAAC;AACvB,QAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,iBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAI,EAAE,YAAY,GAAI,QAAO,EAAE;AAC/B,UAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,UAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,MAC1D;AACA,iBAAW,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAC5B,YAAI,MAAM,QAAQ,EAAE,OAAO,GAAG;AAC1B,YAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,QAChD,WAAW,EAAE,YAAY,IAAI;AACzB,iBAAO,EAAE;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,aAAa,SAAS;AAAA,EAC1C,CAAC;AACL;AAEO,SAAS,SACZ,KACA,SAKF;AAxdF;AAydI,QAAM,MAAK,aAAQ,OAAR,YAAc,IAAI,MAAM,GAAG;AACtC,QAAM,UAAU,EAAE,GAAG,SAAS,GAAG;AACjC,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA9dlC,UAAAJ;AA+dgB,QAAE,SAAS,CAAC,IAAIA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAI,OAAgB;AAAA,IACrD,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AAlelC,UAAAA;AAmegB,QAAE,WAAUA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IACzD,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,YACZ,KACA,IACA,OACF;AACE,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAnflC;AAofgB,gCAAwB,OAAE,yBAAF,mBAAyB,OAC3C,CAAC,IAAI,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC,CAAE,IACxC;AACN,gCAAwB,OAAE,yBAAF,mBAAyB,OAC3C,CAAC,IAAI,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC,CAAE,IACxC;AAEN,QAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACnC,YAAI,EAAE,OAAO,GAAI,QAAO;AACxB,eAAOI,WAAU,CAAC;AAClB,cAAM,YAAY,EAAE,GAAG,GAAG,GAAG,MAAM;AACnC,YAAI,CAAC,oBAAoB,SAAS,GAAG;AACjC,uCAA6B,GAAG,EAAE;AAAA,QACtC;AACA,eAAO;AAAA,MACX,CAAC;AAAA,IACL,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AAtgBlC;AAugBgB,QAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,QAAI,CAAC,MAC7B,EAAE,OAAO,MAAM,OAAO,OAAO;AAAA,MACjC;AACA,UAAI,uBAAuB;AACvB,UAAE,uBAAuB;AAAA,UACrB,IAAI,OAAE,yBAAF,YAA0B,CAAC;AAAA,UAC/B,CAAC,EAAE,GAAG,CAAC,GAAG,qBAAqB;AAAA,QACnC;AAAA,MACJ,OAAO;AACH,qCAA6B,GAAG,EAAE;AAAA,MACtC;AACA,UAAI,uBAAuB;AACvB,UAAE,uBAAuB;AAAA,UACrB,IAAI,OAAE,yBAAF,YAA0B,CAAC;AAAA,UAC/B,CAAC,EAAE,GAAG,CAAC,GAAG,qBAAqB;AAAA,QACnC;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,YAAY,KAA0B,IAAY;AAC9D,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAjiBlC;AAkiBgB,kBAAYA,WAAU,CAAC;AACvB,QAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD,mCAA6B,GAAG,EAAE;AAClC,iBAAW,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,MACJ,GAAY;AACR,cAAM,IAAI,EAAE,MAAM;AAClB,YAAI,CAAC,EAAG;AACR,mBAAW,KAAK,OAAO,KAAK,CAAC,GAAG;AAC5B,YAAE,CAAC,MAAK,OAAE,CAAC,MAAH,YAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,QAAQ,EAAE;AAC9C,cAAI,GAAC,OAAE,CAAC,MAAH,mBAAM,QAAQ,QAAO,EAAE,CAAC;AAAA,QACjC;AAAA,MACJ;AACA,iBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,UAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,UAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,MAC1D;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,aAAa,SAAS;AAAA,EAC1C,CAAC;AACL;AAEO,SAAS,OAAO,KAA0B,IAAY;AACzD,MAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,QAAI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA9jBtC;AA+jBoB,UAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAEvD,mBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,cAAI,EAAE,YAAY,GAAI,QAAO,EAAE;AAC/B,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,QAC1D;AAEA,mBAAW,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAC5B,cAAI,MAAM,QAAQ,EAAE,OAAO,GAAG;AAC1B,cAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,UAChD,WAAW,EAAE,YAAY,IAAI;AACzB,mBAAO,EAAE;AAAA,UACb;AAAA,QACJ;AAEA,aAAI,OAAE,mBAAF,mBAAmB,IAAK,QAAO,EAAE,eAAe,EAAE;AACtD,mBAAW,KAAK,OAAO,MAAK,OAAE,mBAAF,YAAoB,CAAC,CAAC,GAAG;AACjD,YAAE,eAAgB,CAAC,MAAK,OAAE,eAAgB,CAAC,MAAnB,YAAwB,CAAC,GAAG;AAAA,YAChD,CAAC,QAAK;AAllBlC,kBAAAJ;AAklBsC,uBAAAA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AAAA;AAAA,UACtD;AACA,cAAI,CAAC,EAAE,eAAgB,CAAC,EAAE,OAAQ,QAAO,EAAE,eAAgB,CAAC;AAAA,QAChE;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,IAAI,UAAU,EAAE,GAAG;AACnB,QAAI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAhmBtC;AAimBoB,UAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAErD,mBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,QAC1D;AAEA,mBAAW,KAAK,OAAO,MAAK,OAAE,mBAAF,YAAoB,CAAC,CAAC,GAAG;AACjD,YAAE,eAAgB,CAAC,MAAK,OAAE,eAAgB,CAAC,MAAnB,YAAwB,CAAC,GAAG;AAAA,YAChD,CAAC,QAAQ,QAAQ;AAAA,UACrB;AACA,cAAI,CAAC,EAAE,eAAgB,CAAC,EAAE,OAAQ,QAAO,EAAE,eAAgB,CAAC;AAAA,QAChE;AAEA,cAAM,OAA+D;AAAA,UACjE;AAAA,UACA;AAAA,QACJ;AACA,mBAAW,KAAK,MAAM;AAClB,gBAAM,MAAO,EAAU,CAAC;AACxB,cAAI,CAAC,IAAK;AACV,qBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAChC,gBAAI,GAAG,MAAK,SAAI,GAAG,MAAP,YAAY,CAAC,GAAG,OAAO,CAAC,QAAQ,QAAQ,EAAE;AACtD,gBAAI,GAAC,SAAI,GAAG,MAAP,mBAAU,QAAQ,QAAO,IAAI,GAAG;AAAA,UACzC;AACA,cAAI,CAAC,OAAO,KAAK,GAAG,EAAE,OAAQ,QAAQ,EAAU,CAAC;AAAA,QACrD;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,IAAI,WAAW,EAAE,GAAG;AACpB,iBAAa,KAAK,EAAE;AACpB;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,2BAA2B;AAC/C;AAEO,SAAS,QAAQ,KAA0B,IAA8B;AA1oBhF;AA2oBI,QAAM,QAAQ,IAAI,SAAS;AAC3B,MAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,UAAM,MAAK,WAAM,YAAN,YAAiB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,WAAO;AAAA,MACH,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,EAAE,aAAa,uBAAG,QAAQ;AAAA,IACtC;AAAA,EACJ;AACA,MAAI,IAAI,UAAU,EAAE,GAAG;AACnB,UAAM,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,UAAM,OAAO,MAAM,QAAQ,uBAAG,OAAO,IAC9B,EAAG,WACJ,uBAAG,WACD,CAAC,EAAE,OAAO,IACV,CAAC;AACT,WAAO,EAAE,MAAM,SAAS,MAAM,GAAG,QAAQ,EAAE,YAAY,KAAK,EAAE;AAAA,EAClE;AACA,MAAI,IAAI,WAAW,EAAE,GAAG;AACpB,UAAM,MAAM,cAAc,OAAO,EAAE;AACnC,UAAM,IAAI,QAAO,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,IAAI;AACzE,UAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,WAAO;AAAA,MACH,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,EAAE,SAAS,2BAAK,QAAQ;AAAA,IACpC;AAAA,EACJ;AACA,SAAO,EAAE,MAAM,UAAU,MAAM,QAAW,QAAQ,CAAC,EAAE;AACzD;;;AEtqBO,SAAS,cACZ,KACA,OACA,MACA,OACF;AACE,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAZlC;AAagB,YAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,UAAI,CAAC,EAAG;AACR,cAAO,OAAE,gBAAF,mBAAgB;AACvB,UAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,UAAI,UAAU,OAAW,QAAO,EAAE,YAAY,IAAI;AAAA,UAC7C,GAAE,YAAY,IAAI,IAAI;AAAA,IAC/B,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AArBlC;AAsBgB,YAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,UAAI,CAAC,EAAG;AACR,UAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,UAAI,SAAS,OAAW,QAAO,EAAE,YAAY,IAAI;AAAA,UAC5C,GAAE,YAAY,IAAI,IAAI;AAAA,IAC/B,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,wBACZ,KACA,OACA,MACF;AACE,MAAI;AACJ,MAAI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAzClC;AA0CgB,YAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,UAAI,CAAC,EAAG;AACR,cAAO,OAAE,gBAAF,mBAAgB;AACvB,sBAAe,OAAE,0BAAF,mBAA0B;AAEzC,UAAI,EAAE,YAAa,QAAO,EAAE,YAAY,IAAI;AAC5C,UAAI,EAAE,sBAAuB,QAAO,EAAE,sBAAsB,IAAI;AAAA,IACpE,CAAC;AAAA,IACL,MAAM,MACF,IAAI,WAAW,CAAC,MAAM;AAnDlC;AAoDgB,YAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,UAAI,CAAC,EAAG;AACR,UAAI,SAAS,QAAW;AACpB,YAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,UAAE,YAAY,IAAI,IAAI;AAAA,MAC1B;AACA,UAAI,iBAAiB,QAAW;AAC5B,YAAI,CAAC,EAAE,sBAAuB,GAAE,wBAAwB,CAAC;AACzD,UAAE,sBAAsB,IAAI,IAAI;AAAA,MACpC;AAAA,IACJ,CAAC;AAAA,EACT,CAAC;AACL;AAEO,SAAS,gBACZ,KACA,OACA,MACF;AACE,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA1ElC;AA2EgB,YAAM,QAAO,OAAE,YAAF,YAAa,CAAC;AAC3B,YAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,YAAM,WAAW,oBAAI,IAAsB;AAC3C,iBAAW,KAAK,MAAM;AAClB,YAAI,EAAE,SAAS;AACX,cAAI,CAAC,SAAS,IAAI,EAAE,OAAO,EAAG,UAAS,IAAI,EAAE,SAAS,CAAC,CAAC;AACxD,mBAAS,IAAI,EAAE,OAAO,EAAG,KAAK,EAAE,EAAE;AAAA,QACtC;AAAA,MACJ;AAEA,YAAM,UAAU,CAAC,OAAe;AArFhD,YAAAK,KAAA;AAsFoB,cAAM,IAAI,KAAK,IAAI,EAAE;AACrB,YAAI,CAAC,EAAG;AAER,cAAM,YAAWA,MAAA,EAAE,0BAAF,gBAAAA,IAA0B;AAC3C,YAAI,UAAU;AACV,cAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,YAAE,YAAY,IAAI,IAAI,SAAS;AAC/B,iBAAO,EAAE,sBAAuB,IAAI;AACpC,cAAI,OAAO,MAAK,OAAE,0BAAF,YAA2B,CAAC,CAAC,EAAE,WAAW,GAAG;AACzD,mBAAO,EAAE;AAAA,UACb;AAAA,QACJ,WAAW,EAAE,aAAa;AACtB,iBAAO,EAAE,YAAY,IAAI;AACzB,cAAI,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,GAAG;AACzC,mBAAO,EAAE;AAAA,UACb;AAAA,QACJ;AAEA,mBAAW,YAAW,cAAS,IAAI,EAAE,MAAf,YAAoB,CAAC,GAAG;AAC1C,kBAAQ,OAAO;AAAA,QACnB;AAAA,MACJ;AAEA,cAAQ,KAAK;AAAA,IACjB,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;;;AC7GO,SAAS,qBACZ,KACA,IACwB;AAP5B;AAQI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,uBAAuB,OAAU,SAAV,mBAAgB,QAAQ;AAC1D;AAEO,SAAS,qBACZ,KACA,IACA,MACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAtBlC;AAuBgB,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAI,CAAC,EAAG;AAER,YAAM,aAAa,sBAAsB,IAAI;AAE7C,UAAI,CAAC,YAAY;AACb,cAAK,OAAU,SAAV,mBAAgB,cAAa,QAAW;AACzC,iBAAQ,EAAU,KAAK;AACvB,cAAK,EAAU,QAAQ,OAAO,KAAM,EAAU,IAAI,EAAE,WAAW,GAAG;AAC9D,mBAAQ,EAAU;AAAA,UACtB;AAAA,QACJ;AACA;AAAA,MACJ;AAEA,MAAC,EAAU,OAAO;AAAA,QACd,GAAI,EAAU;AAAA,QACd,UAAU;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,uBACZ,KACA,IACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAtDlC;AAuDgB,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAI,CAAC,KAAK,GAAE,OAAU,SAAV,mBAAgB,UAAU;AACtC,aAAQ,EAAU,KAAK;AACvB,UAAK,EAAU,QAAQ,OAAO,KAAM,EAAU,IAAI,EAAE,WAAW,GAAG;AAC9D,eAAQ,EAAU;AAAA,MACtB;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,mBACZ,KACA,IACiC;AArErC;AAsEI,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,yBAA0B,EAAU,UAAU;AACzD;AAEO,SAAS,mBACZ,KACA,IACA,OACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AApFlC;AAqFgB,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAI,CAAC,EAAG;AAER,YAAM,aAAa,yBAAyB,KAAK;AAEjD,UAAI,CAAC,YAAY;AACb,YAAI,gBAAgB,EAAG,QAAQ,EAAU;AACzC;AAAA,MACJ;AAEA,MAAC,EAAU,aAAa;AAAA,IAC5B,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,qBACZ,KACA,IACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA5GlC;AA6GgB,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAI,CAAC,KAAK,CAAE,EAAU,WAAY;AAClC,aAAQ,EAAU;AAAA,IACtB,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,sBAAsB,OAA0C;AAC5E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,QAAM,KAAK,EAAE;AACb,MAAI,OAAO,WAAW,OAAO,YAAY,OAAO,OAAQ,QAAO;AAE/D,QAAM,MAAoB,EAAE,SAAS,GAAG;AACxC,MAAI,OAAO,UAAU,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,KAAK,GAAG;AAC9D,QAAI,OAAO,EAAE;AAAA,EACjB;AACA,MAAI,OAAO,EAAE,aAAa,YAAY,OAAO,SAAS,EAAE,QAAQ,GAAG;AAC/D,QAAI,WAAW,EAAE;AAAA,EACrB;AACA,MAAI,OAAO,EAAE,aAAa,YAAY,OAAO,SAAS,EAAE,QAAQ,GAAG;AAC/D,QAAI,WAAW,EAAE;AAAA,EACrB;AACA,MAAI,EAAE,SAAS,OAAO,EAAE,UAAU,UAAU;AACxC,UAAM,MACF,OAAO,EAAE,MAAM,QAAQ,YAAY,OAAO,SAAS,EAAE,MAAM,GAAG,IACxD,EAAE,MAAM,MACR;AACV,UAAM,MACF,OAAO,EAAE,MAAM,QAAQ,YAAY,OAAO,SAAS,EAAE,MAAM,GAAG,IACxD,EAAE,MAAM,MACR;AACV,QAAI,QAAQ,UAAa,QAAQ,QAAW;AACxC,UAAI,QAAQ;AAAA,QACR,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,QACnC,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;;;AClJO,SAAS,oBACZ,MACA,GACA,UACA,SACO;AATX;AAUI,MAAI,aAAa,QAAS,QAAO;AACjC,QAAM,UAAU,IAAI,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,MAAI,MAA0B;AAC9B,QAAM,QAAQ,oBAAI,IAAY;AAC9B,SAAO,KAAK;AACR,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,MAAM,IAAI,GAAG,EAAG;AACpB,UAAM,IAAI,GAAG;AACb,WAAM,aAAQ,IAAI,GAAG,MAAf,mBAAkB;AAAA,EAC5B;AACA,SAAO;AACX;AAEO,SAAS,+BACZ,KACA,GACA,YACA,UACO;AACP,MAAI,eAAe,SAAU,QAAO;AAEpC,QAAM,qBAAqB,CAAC,OAAyB;AA/BzD;AAgCQ,QAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,YAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,aAAO,CAAC,IAAI,4BAAG,aAAH,YAAe,CAAC,GAAI,IAAI,4BAAG,aAAH,YAAe,CAAC,CAAE;AAAA,IAC1D;AACA,UAAM,OAAM,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC;AAC7C,UAAM,OAAM,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC;AAC7C,WAAO,CAAC,GAAG,KAAK,GAAG,GAAG;AAAA,EAC1B;AAEA,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAQ,CAAC,QAAQ;AAEvB,SAAO,MAAM,SAAS,GAAG;AACrB,UAAM,OAAO,MAAM,IAAI;AACvB,QAAI,SAAS,WAAY,QAAO;AAChC,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAChB,UAAM,KAAK,GAAG,mBAAmB,IAAI,CAAC;AAAA,EAC1C;AAEA,SAAO;AACX;AAEO,SAAS,QACZ,KACA,YACA,SACF;AACE,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AA/DlC;AAgEgB,YAAM,WAAW,IAAI,QAAQ,UAAU;AACvC,YAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACvD,UACI,SAAS,SAAS,SACjB,SAAS,SAAS,WAAW,oBAAoB,SAAS,IAAI,KAC/D,SAAS,SAAS,UACpB;AACE,YAAI,SAAS,SAAS,OAAO;AACzB,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC3D,cAAI,GAAG;AACH,kBAAM,WAAqB,CAAC;AAC5B,kBAAM,OAAO,IAAI,KAAI,OAAE,aAAF,YAAc,CAAC,CAAC;AACrC,uBAAW,MAAM,KAAK;AAClB,kBACI;AAAA,gBACI;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ,GACF;AACE,oBAAI,KAAK,gBAAgB;AAAA,kBACrB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,kBACtD,MAAM;AAAA,kBACN,MAAM;AAAA,oBACF;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,kBACV;AAAA,gBACJ,CAAC;AACD;AAAA,cACJ;AACA,mBAAK,IAAI,EAAE;AACX,uBAAS,KAAK,EAAE;AAAA,YACpB;AACA,gBAAI,SAAS,SAAS,OAAM,aAAE,aAAF,mBAAY,WAAZ,YAAsB,KAAK,GAAG;AACtD,gBAAE,WAAW,MAAM,KAAK,IAAI;AAAA,YAChC;AAEA,gBAAI,EAAE,UAAU;AACZ,gBAAE,WAAW,EAAE,SAAS;AAAA,gBACpB,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,cAC/B;AACA,kBAAI,EAAE,SAAS,WAAW,GAAG;AACzB,uBAAO,EAAE;AAAA,cACb;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,gBAAM,WAAqB,CAAC;AAC5B,gBAAM,WAAU,aAAE,yBAAF,mBAAyB,gBAAzB,YAAwC,CAAC;AACzD,gBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,qBAAW,MAAM,KAAK;AAClB,gBACI,+BAA+B,KAAK,GAAG,YAAY,EAAE,GACvD;AACE,kBAAI,KAAK,gBAAgB;AAAA,gBACrB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,gBACtD,MAAM;AAAA,gBACN,MAAM;AAAA,kBACF;AAAA,kBACA,UAAU;AAAA,kBACV,MAAM;AAAA,gBACV;AAAA,cACJ,CAAC;AACD;AAAA,YACJ;AACA,iBAAK,IAAI,EAAE;AACX,qBAAS,KAAK,EAAE;AAAA,UACpB;AACA,cAAI,SAAS,SAAS,KAAK,QAAQ,SAAS,GAAG;AAC3C,gBAAI,CAAC,EAAE,qBAAsB,GAAE,uBAAuB,CAAC;AACvD,cAAE,qBAAqB,UAAU,IAAI,MAAM,KAAK,IAAI;AAAA,UACxD;AAEA,eAAI,OAAE,yBAAF,mBAAyB,aAAa;AACtC,cAAE,qBAAqB,UAAU,IAC7B,EAAE,qBAAqB,UAAU,EAAE;AAAA,cAC/B,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,YAC/B;AACJ,gBAAI,EAAE,qBAAqB,UAAU,EAAE,WAAW,GAAG;AACjD,qBAAO,EAAE,qBAAqB,UAAU;AAAA,YAC5C;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,CAAC,EAAE,OAAQ,GAAE,SAAS,CAAC;AAC3B,YAAI,CAAC,EAAE,QAAS,GAAE,UAAU,CAAC;AAAA,MACjC,OAAO;AACH,cAAM,IAAI,MAAM,iDAAiD;AAAA,MACrE;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,QACZ,KACA,YACA,SACF;AACE,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAxKlC;AAyKgB,YAAM,WAAW,IAAI,QAAQ,UAAU;AACvC,YAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACvD,UACI,SAAS,SAAS,SACjB,SAAS,SAAS,WAAW,oBAAoB,SAAS,IAAI,KAC/D,SAAS,SAAS,UACpB;AACE,YAAI,SAAS,SAAS,OAAO;AACzB,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC3D,cAAI,GAAG;AACH,kBAAM,WAAqB,CAAC;AAC5B,kBAAM,OAAO,IAAI,KAAI,OAAE,aAAF,YAAc,CAAC,CAAC;AACrC,uBAAW,MAAM,KAAK;AAClB,kBACI;AAAA,gBACI;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ,GACF;AACE,oBAAI,KAAK,gBAAgB;AAAA,kBACrB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,kBACtD,MAAM;AAAA,kBACN,MAAM;AAAA,oBACF;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,kBACV;AAAA,gBACJ,CAAC;AACD;AAAA,cACJ;AACA,mBAAK,IAAI,EAAE;AACX,uBAAS,KAAK,EAAE;AAAA,YACpB;AACA,gBAAI,SAAS,SAAS,OAAM,aAAE,aAAF,mBAAY,WAAZ,YAAsB,KAAK,GAAG;AACtD,gBAAE,WAAW,MAAM,KAAK,IAAI;AAAA,YAChC;AAEA,gBAAI,EAAE,UAAU;AACZ,gBAAE,WAAW,EAAE,SAAS;AAAA,gBACpB,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,cAC/B;AACA,kBAAI,EAAE,SAAS,WAAW,GAAG;AACzB,uBAAO,EAAE;AAAA,cACb;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,gBAAM,WAAqB,CAAC;AAC5B,gBAAM,WAAU,aAAE,yBAAF,mBAAyB,gBAAzB,YAAwC,CAAC;AACzD,gBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,qBAAW,MAAM,KAAK;AAClB,gBACI,+BAA+B,KAAK,GAAG,YAAY,EAAE,GACvD;AACE,kBAAI,KAAK,gBAAgB;AAAA,gBACrB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,gBACtD,MAAM;AAAA,gBACN,MAAM;AAAA,kBACF;AAAA,kBACA,UAAU;AAAA,kBACV,MAAM;AAAA,gBACV;AAAA,cACJ,CAAC;AACD;AAAA,YACJ;AACA,iBAAK,IAAI,EAAE;AACX,qBAAS,KAAK,EAAE;AAAA,UACpB;AACA,cAAI,SAAS,SAAS,KAAK,QAAQ,SAAS,GAAG;AAC3C,gBAAI,CAAC,EAAE,qBAAsB,GAAE,uBAAuB,CAAC;AACvD,cAAE,qBAAqB,UAAU,IAAI,MAAM,KAAK,IAAI;AAAA,UACxD;AAEA,eAAI,OAAE,yBAAF,mBAAyB,aAAa;AACtC,cAAE,qBAAqB,UAAU,IAC7B,EAAE,qBAAqB,UAAU,EAAE;AAAA,cAC/B,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,YAC/B;AACJ,gBAAI,EAAE,qBAAqB,UAAU,EAAE,WAAW,GAAG;AACjD,qBAAO,EAAE,qBAAqB,UAAU;AAAA,YAC5C;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,CAAC,EAAE,OAAQ,GAAE,SAAS,CAAC;AAC3B,YAAI,CAAC,EAAE,QAAS,GAAE,UAAU,CAAC;AAAA,MACjC,OAAO;AACH,cAAM,IAAI,MAAM,iDAAiD;AAAA,MACrE;AAAA,IACJ,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,QACZ,KACA,MACA,QACAC,OACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM,WAAW,IAAI;AAAA,IACrB,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAlRlC;AAmRgB,UAAI,SAAS,QAAQ;AACjB,YAAI,IAAI,QAAQ,MAAM,KAAK,IAAI,QAAQA,KAAI,GAAG;AAC1C,cAAI,oBAAoB,KAAK,GAAG,QAAQA,KAAI,GAAG;AAC3C,kBAAM,IAAI,MAAM,8BAA8B,MAAM,MAAMA,KAAI,EAAE;AAAA,UACpE;AACA,gBAAM,UAAS,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAOA,KAAI;AACzD,cAAI,MAAO,OAAM,UAAU;AAC3B;AAAA,QACJ;AACA,YACK,IAAI,QAAQ,MAAM,KAAK,IAAI,UAAUA,KAAI,KACzC,IAAI,UAAU,MAAM,KAAK,IAAI,QAAQA,KAAI,GAC5C;AACE,gBAAM,UAAU,IAAI,UAAUA,KAAI,IAAIA,QAAO;AAC7C,gBAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,SAASA;AAC7C,gBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,cAAI,CAAC,EAAG;AACR,cAAI,CAAC,EAAE,SAAS;AACZ,cAAE,UAAU;AACZ;AAAA,UACJ;AACA,cAAI,OAAO,EAAE,YAAY,UAAU;AAC/B,gBAAI,EAAE,YAAY,MAAO,GAAE,UAAU,CAAC,EAAE,SAAS,KAAK;AACtD;AAAA,UACJ;AACA,cAAI,CAAC,EAAE,QAAQ,SAAS,KAAK,EAAG,GAAE,QAAQ,KAAK,KAAK;AACpD;AAAA,QACJ;AACA,cAAM,IAAI,MAAM,2BAA2B,MAAM,MAAMA,KAAI,EAAE;AAAA,MACjE;AAEA,UAAI,SAAS,aAAa,SAAS,WAAW;AAC1C,cAAM,MAAM,SAAS,YAAY,aAAa;AAE9C,YAAI,IAAI,QAAQ,MAAM,KAAK,IAAI,UAAUA,KAAI,GAAG;AAC5C,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACvD,cAAI,CAAC,EAAG;AACR,gBAAM,OAAO,qCAAW,CAAC;AACzB,cAAI,CAAC,IAAI,SAASA,KAAI,EAAG,KAAI,KAAKA,KAAI;AACtC;AAAA,QACJ;AAEA,YAAI,IAAI,WAAW,MAAM,KAAK,IAAI,UAAUA,KAAI,GAAG;AAC/C,gBAAM,SACF,SAAS,YACH,yBACA;AACV,gBAAM,OAAQ,EAAU,MAAM;AAG9B,gBAAM,OAAO,EAAE,GAAI,sBAAQ,CAAC,EAAG;AAC/B,gBAAM,OAAM,UAAK,MAAM,MAAX,YAAgB,CAAC;AAC7B,cAAI,CAAC,IAAI,SAASA,KAAI,EAAG,KAAI,KAAKA,KAAI;AACtC,eAAK,MAAM,IAAI;AACf,UAAC,EAAU,MAAM,IAAI;AACrB;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,GAAG,IAAI,uBAAuB,MAAM,MAAMA,KAAI,EAAE;AAAA,MACpE;AAEA,UAAI,SAAS,WAAW;AACpB,4BAAoB,IAAI,MAAM,MAAM;AAEpC,YAAIA,MAAK,WAAW,IAAI,GAAG;AACvB,cAAI,KAAK;AAAA,YACL,MAAM;AAAA,YACN,IAAI,MACA,IAAI,WAAW,CAAC,SAAS;AAvVzD,kBAAAC;AAwVoC,oBAAM,MAAKA,MAAA,KAAK,YAAL,OAAAA,MAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAOD,KAAI;AACxD,kBAAI,EAAG,CAAC,EAAU,aAAa;AAAA,YACnC,CAAC;AAAA,YACL,MAAM,MAAM,IAAI,KAAK;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAEA,YAAIA,MAAK,WAAW,IAAI,GAAG;AACvB,cAAI,KAAK;AAAA,YACL,MAAM;AAAA,YACN,IAAI,MACA,IAAI,WAAW,CAAC,SAAS;AApWzD,kBAAAC,KAAAC;AAqWoC,yBAAW,MAAKD,MAAA,KAAK,WAAL,OAAAA,MAAe,CAAC,GAAG;AAC/B,sBAAM,KAAIC,MAAA,EAAE,YAAF,gBAAAA,IAAW,KAAK,CAAC,MAAM,EAAE,OAAOF;AAC1C,oBAAI,GAAG;AACH,kBAAC,EAAU,aAAa;AACxB;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,CAAC;AAAA,YACL,MAAM,MAAM,IAAI,KAAK;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACzE;AAEA,YAAM,IAAI,MAAM,yBAAyB,IAAI,EAAE;AAAA,IACnD,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;AAEO,SAAS,WACZ,KACA,MACA,QACAA,OACI;AACJ,MAAI,KAAK;AAAA,IACL,MAAM,cAAc,IAAI;AAAA,IACxB,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AApYlC;AAqYgB,UAAI,SAAS,QAAQ;AACjB,YAAI,IAAI,QAAQ,MAAM,KAAK,IAAI,QAAQA,KAAI,GAAG;AAC1C,gBAAM,UAAS,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAOA,KAAI;AACzD,eAAI,+BAAO,aAAY,OAAQ,QAAO,MAAM;AAC5C;AAAA,QACJ;AACA,YACK,IAAI,QAAQ,MAAM,KAAK,IAAI,UAAUA,KAAI,KACzC,IAAI,UAAU,MAAM,KAAK,IAAI,QAAQA,KAAI,GAC5C;AACE,gBAAM,UAAU,IAAI,UAAUA,KAAI,IAAIA,QAAO;AAC7C,gBAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,SAASA;AAC7C,gBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,cAAI,EAAC,uBAAG,SAAS;AACjB,cAAI,OAAO,EAAE,YAAY,UAAU;AAC/B,gBAAI,EAAE,YAAY,MAAO,QAAO,EAAE;AAClC;AAAA,UACJ;AACA,YAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,MAAM,KAAK;AAC/C,gBAAI,OAAE,YAAF,mBAAW,YAAW,EAAG,QAAO,EAAE;AACtC;AAAA,QACJ;AACA,cAAM,IAAI,MAAM,6BAA6B,MAAM,MAAMA,KAAI,EAAE;AAAA,MACnE;AAEA,UAAI,SAAS,aAAa,SAAS,WAAW;AAC1C,cAAM,MAAM,SAAS,YAAY,aAAa;AAE9C,YAAI,IAAI,QAAQ,MAAM,KAAK,IAAI,UAAUA,KAAI,GAAG;AAC5C,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACvD,cAAI,CAAC,EAAG;AACR,YAAE,GAAG,MAAK,OAAE,GAAG,MAAL,YAAU,CAAC,GAAG,OAAO,CAAC,MAAM,MAAMA,KAAI;AAChD,cAAI,GAAC,OAAE,GAAG,MAAL,mBAAQ,QAAQ,QAAQ,EAAU,GAAG;AAC1C;AAAA,QACJ;AAEA,YAAI,IAAI,WAAW,MAAM,KAAK,IAAI,UAAUA,KAAI,GAAG;AAC/C,gBAAM,SACF,SAAS,YACH,yBACA;AACV,gBAAM,OAAQ,EAAU,MAAM;AAG9B,cAAI,CAAC,KAAM;AACX,cAAI,KAAK,MAAM,GAAG;AACd,iBAAK,MAAM,MAAK,UAAK,MAAM,MAAX,YAAgB,CAAC,GAAG;AAAA,cAChC,CAAC,QAAQ,QAAQA;AAAA,YACrB;AACA,gBAAI,GAAC,UAAK,MAAM,MAAX,mBAAc,QAAQ,QAAO,KAAK,MAAM;AAAA,UACjD;AACA,cAAI,CAAC,OAAO,KAAK,IAAI,EAAE,OAAQ,QAAQ,EAAU,MAAM;AACvD;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,GAAG,IAAI,uBAAuB,MAAM,MAAMA,KAAI,EAAE;AAAA,MACpE;AAEA,UAAI,SAAS,WAAW;AACpB,4BAAoB,IAAI,MAAM,MAAM;AAEpC,YAAIA,MAAK,WAAW,IAAI,GAAG;AACvB,cAAI,KAAK;AAAA,YACL,MAAM;AAAA,YACN,IAAI,MACA,IAAI,WAAW,CAAC,SAAS;AAtczD,kBAAAC;AAucoC,oBAAM,MAAKA,MAAA,KAAK,YAAL,OAAAA,MAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAOD,KAAI;AACxD,kBAAI,EAAG,QAAQ,EAAU;AAAA,YAC7B,CAAC;AAAA,YACL,MAAM,MAAM,IAAI,KAAK;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAEA,YAAIA,MAAK,WAAW,IAAI,GAAG;AACvB,cAAI,KAAK;AAAA,YACL,MAAM;AAAA,YACN,IAAI,MACA,IAAI,WAAW,CAAC,SAAS;AAndzD,kBAAAC,KAAAC;AAodoC,yBAAW,MAAKD,MAAA,KAAK,WAAL,OAAAA,MAAe,CAAC,GAAG;AAC/B,sBAAM,KAAIC,MAAA,EAAE,YAAF,gBAAAA,IAAW,KAAK,CAAC,MAAM,EAAE,OAAOF;AAC1C,oBAAI,GAAG;AACH,yBAAQ,EAAU;AAClB;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,CAAC;AAAA,YACL,MAAM,MAAM,IAAI,KAAK;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACzE;AAEA,YAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAAA,IACtD,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;;;ACjeO,SAASG,+BACZ,KACA,YACA,OAQc;AACd,QAAM,YAAgD;AAAA,IAClD;AAAA,IACA,SAAS;AAAA,MACL,OAAO,MAAM;AAAA,MACb,iBAAiB,MAAM;AAAA,MACvB,gBAAgB,MAAM;AAAA,MACtB,sBAAsB,MAAM;AAAA,MAC5B,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,IACpB;AAAA,EACJ;AACA,QAAM,SAAS,8BAAkC,WAAW;AAAA,IACxD,SAAS,IAAI;AAAA,EACjB,CAAC;AACD,MAAI,yBAAyB,OAAO,WAAW;AAC/C,SAAO,OAAO;AAClB;;;AC/BO,SAAS,UACZ,KACA,IACA,MAMF;AACE,MAAI,IAAI,QAAQ,EAAE,GAAG;AACjB,QAAI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAlBtC;AAmBoB,cAAM,OAAM,OAAE,YAAF,YAAa,CAAC;AAC1B,cAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvC,YAAI,CAAC,IAAK;AACV,cAAM,YAAW,SAAI,YAAJ,YAAe;AAChC,cAAM,WAAW,IAAI;AAAA,UACjB,CAAC,MAAG;AAxB5B,gBAAAC;AAwBgC,qBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,gBAAgB;AAAA;AAAA,QACzC;AAEA,cAAM,SAAS,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD,YAAI,SAAS,EAAG;AAChB,cAAM,SAAS,SAAS,OAAO,QAAQ,CAAC,EAAE,CAAC;AAE3C,YAAI,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AACzD,YAAI,KAAK,UAAU;AACf,iBAAO,KAAK;AAAA,YACR;AAAA,YACA,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AAAA,UACpD;AAAA,QACJ;AACA,YAAI,KAAK,SAAS;AACd,iBAAO,KAAK;AAAA,YACR,SAAS;AAAA,YACT,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,IAAI;AAAA,UACvD;AAAA,QACJ;AACA,YAAI,SAAS,UAAa,OAAO,MAAM,IAAI,GAAG;AAC1C,iBAAO,SAAS;AAAA,QACpB;AAEA,cAAM,MAAa,CAAC;AACpB,mBAAW,KAAK,KAAK;AACjB,gBAAM,cAAa,OAAE,YAAF,YAAa,gBAAgB;AAChD,cAAI,CAAC,WAAW;AACZ,gBAAI,KAAK,CAAC;AAAA,UACd;AAAA,QACJ;AACA,iBAAS,OAAO,MAAM,GAAG,MAAM;AAC/B,UAAE,UAAU,CAAC,GAAG,KAAK,GAAG,QAAQ;AAAA,MACpC,CAAC;AAAA,MACL,MAAM,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,IAAI,UAAU,EAAE,GAAG;AACnB,QAAI,CAAC,KAAK,YAAY;AAClB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AACA,UAAM,UAAU;AAChB,UAAM,QAAQ,KAAK;AAEnB,QAAI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAzEtC;AA0EoB,cAAM,OAAO,OAAE,mBAAF,cAAE,iBAAmB,CAAC;AACnC,cAAM,OAAO,6CAAe,CAAC;AAC7B,cAAM,SAAS,IAAI,QAAQ,OAAO;AAClC,YAAI,UAAU,EAAG,KAAI,OAAO,QAAQ,CAAC;AAErC,YAAI,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AACzD,YAAI,KAAK,SAAU,QAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,KAAK,QAAQ,CAAC;AAChE,YAAI,KAAK,SAAS;AACd,iBAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7D;AACA,YAAI,SAAS,UAAa,OAAO,MAAM,IAAI,EAAG,QAAO,IAAI;AAEzD,YAAI,OAAO,MAAM,GAAG,OAAO;AAAA,MAC/B,CAAC;AAAA,MACL,MAAM,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,IAAI,WAAW,EAAE,GAAG;AACpB,gBAAY,KAAK,IAAI,IAAI;AACzB;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,8BAA8B;AAClD;AAEO,SAAS,YACZ,KACA,UACA,MACF;AACE,MAAI,CAAC,IAAI,WAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAChE;AAEA,MAAI,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI,MACA,IAAI,WAAW,CAAC,MAAM;AAjHlC;AAkHgB,YAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,UAAI,CAAC,MAAO;AACZ,YAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,OAAO;AAC7D,UAAI,EAAC,uBAAG,SAAS;AAEjB,YAAM,SAAS,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC3D,UAAI,SAAS,EAAG;AAEhB,YAAM,SAAS,EAAE,QAAQ,OAAO,QAAQ,CAAC,EAAE,CAAC;AAE5C,UAAI,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AACzD,UAAI,KAAK,UAAU;AACf,eAAO,KAAK;AAAA,UACR;AAAA,UACA,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AAAA,QACrD;AAAA,MACJ;AACA,UAAI,KAAK,SAAS;AACd,eAAO,KAAK;AAAA,UACR,EAAE,QAAQ;AAAA,UACV,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,IAAI;AAAA,QACxD;AAAA,MACJ;AACA,UAAI,SAAS,UAAa,OAAO,MAAM,IAAI,GAAG;AAC1C,eAAO,EAAE,QAAQ;AAAA,MACrB;AAEA,QAAE,QAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,IACpC,CAAC;AAAA,IACL,MAAM,MAAM,IAAI,KAAK;AAAA,EACzB,CAAC;AACL;;;ACvIA,SAAS,MAAS,OAAa;AAC3B,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAC3C;AAEA,SAAS,oBACL,KACuB;AACvB,MAAI,EAAC,2BAAK,QAAQ,QAAO,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAA+B,CAAC;AAEtC,aAAW,MAAM,KAAK;AAClB,UAAM,MAAM,OAAO,EAAE;AACrB,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACX;AAWO,SAAS,qBAA0C;AACtD,SAAO;AAAA,IACH,SAAS;AAAA,IACT,OAAO,CAAC;AAAA,IACR,cAAc;AAAA,IACd,aAAa,CAAC;AAAA,IACd,eAAe,CAAC;AAAA,IAChB,mBAAmB;AAAA,IACnB,UAAU;AAAA,EACd;AACJ;AAEO,SAAS,cACZ,SACmB;AACnB,SAAO,MAAM,4BAAW,mBAAmB,CAAC;AAChD;AAyBO,SAAS,gBACZ,SACA,SAAS,MACH;AApFV;AAqFI,QAAM,QAAQ,IAAI,MAAK,wCAAS,UAAT,YAAkB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7D,WAAS,IAAI,GAAG,IAAI,KAAO,KAAK;AAC5B,UAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AACzB,QAAI,CAAC,MAAM,IAAI,EAAE,EAAG,QAAO;AAAA,EAC/B;AACA,QAAM,IAAI,MAAM,+BAA+B;AACnD;AAEO,SAAS,gBACZ,SACA,OAWmB;AA1GvB;AA2GI,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,MAAK,WAAM,OAAN,YAAY,gBAAgB,MAAM,IAAI;AAEjD,OAAK,MAAM,KAAK;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,YAAY,oBAAoB,MAAM,UAAU;AAAA,IAChD,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,EAChB,CAAC;AAED,OAAK,eAAe;AACpB,SAAO;AACX;AAEO,SAAS,qBACZ,SACA,OAYmB;AA7IvB;AA8II,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,MAAK,WAAM,OAAN,YAAY,gBAAgB,MAAM,KAAK;AAElD,OAAK,MAAM,KAAK;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,OAAO,OAAM,WAAM,UAAN,YAAe,CAAC,CAAC;AAAA,IAC9B,QAAO,WAAM,UAAN,YAAe;AAAA,IACtB,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,EAChB,CAAC;AAED,OAAK,eAAe;AACpB,SAAO;AACX;AAEO,SAAS,kBACZ,SACA,IACA,OAC+B;AAvKnC;AAwKI,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,MAAM,KAAK,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,UAAU,KAAK,MAAM,GAAG;AAC9B,OAAK,MAAM,GAAG,IAAI;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,EACP;AAEA,QAAI,UAAK,MAAM,GAAG,MAAd,mBAAiB,UAAS,SAAS;AACnC,SAAK,MAAM,GAAG,IAAI;AAAA,MACd,GAAG,KAAK,MAAM,GAAG;AAAA,MACjB,YAAY;AAAA,QACP,KAAK,MAAM,GAAG,EACV;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,qBACZ,SACA,IACmB;AACnB,QAAM,OAAO,cAAc,OAAO;AAClC,OAAK,eAAe;AACpB,SAAO;AACX;AAEO,SAAS,mBACZ,SACA,MACmB;AACnB,QAAM,OAAO,cAAc,OAAO;AAClC,OAAK,WAAW;AAChB,SAAO;AACX;AAEO,SAAS,0BACZ,SACA,WACmB;AACnB,QAAM,OAAO,cAAc,OAAO;AAClC,OAAK,oBAAoB;AACzB,SAAO;AACX;AAEO,SAAS,sBACZ,SACA,IACmB;AA/NvB;AAgOI,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,WAAW,IAAI,KAAI,UAAK,gBAAL,YAAoB,CAAC,CAAC;AAE/C,MAAI,SAAS,IAAI,EAAE,EAAG,UAAS,OAAO,EAAE;AAAA,MACnC,UAAS,IAAI,EAAE;AAEpB,OAAK,cAAc,MAAM,KAAK,QAAQ;AACtC,SAAO;AACX;AAEO,SAAS,mBACZ,SACA,IACA,UACmB;AA9OvB;AA+OI,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,MAAM,IAAI,KAAI,UAAK,gBAAL,YAAoB,CAAC,CAAC;AAE1C,MAAI,SAAU,KAAI,IAAI,EAAE;AAAA,MACnB,KAAI,OAAO,EAAE;AAElB,OAAK,cAAc,MAAM,KAAK,GAAG;AACjC,SAAO;AACX;AAEO,SAAS,oBACZ,SACA,IACmB;AA5PvB;AA6PI,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,SAAS,IAAI,KAAI,UAAK,kBAAL,YAAsB,CAAC,CAAC;AAE/C,MAAI,OAAO,IAAI,EAAE,EAAG,QAAO,OAAO,EAAE;AAAA,MAC/B,QAAO,IAAI,EAAE;AAElB,OAAK,gBAAgB,MAAM,KAAK,MAAM;AACtC,SAAO;AACX;AAEO,SAAS,6BACZ,SACA,QACA,YACA,OAAwC,UACT;AAC/B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,OAAO,KAAK,MAAM;AAAA,IACpB,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA,EACzC;AAEA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,WAAW,oBAAoB,UAAU;AAC/C,QAAM,UAAU,oBAAoB,KAAK,UAAU;AAEnD,MAAI,SAAS,WAAW;AACpB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAEA,MAAI,SAAS,UAAU;AACnB,SAAK,aAAa,oBAAoB,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC/D,WAAO;AAAA,EACX;AAEA,OAAK,aAAa,QAAQ;AAAA,IACtB,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC;AAAA,EAC1D;AACA,SAAO;AACX;AAMO,SAAS,kBACZ,SACA,IACA,MAC+B;AAjTnC;AAkTI,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,cAAc,OAAO;AAElC,QAAM,MAAM,oBAAI,IAAY,CAAC,EAAE,CAAC;AAEhC,MAAI,6BAAM,SAAS;AACf,UAAM,QAAQ,CAAC,EAAE;AACjB,WAAO,MAAM,QAAQ;AACjB,YAAM,UAAU,MAAM,MAAM;AAC5B,iBAAW,SAAS,KAAK,MAAM;AAAA,QAC3B,CAAC,MAAM,EAAE,aAAa;AAAA,MAC1B,GAAG;AACC,YAAI,CAAC,IAAI,IAAI,MAAM,EAAE,GAAG;AACpB,cAAI,IAAI,MAAM,EAAE;AAChB,gBAAM,KAAK,MAAM,EAAE;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,OAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAEpD,MAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,YAAY,GAAG;AACjD,SAAK,eAAe;AAAA,EACxB;AAEA,OAAK,gBAAe,UAAK,gBAAL,YAAoB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AACrE,OAAK,kBAAiB,UAAK,kBAAL,YAAsB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAEzE,SAAO;AACX;AAEO,SAAS,gBACZ,SACA,QACA,MAM+B;AAC/B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACnD,MAAI,CAAC,KAAM,QAAO;AAElB,OAAK,WAAW,KAAK;AAErB,QAAM,WAAW,KAAK,MACjB,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,YAAY,EAAE,OAAO,MAAM,EAC7D,KAAK,CAAC,GAAG,MAAG;AAvWrB;AAuWyB,oBAAE,UAAF,YAAW,OAAM,OAAE,UAAF,YAAW;AAAA,GAAE;AAEnD,MAAI,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,SAAS;AAElE,MAAI,KAAK,UAAU;AACf,UAAM,MAAM,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AAC5D,QAAI,OAAO,EAAG,QAAO;AAAA,EACzB;AAEA,MAAI,KAAK,SAAS;AACd,UAAM,MAAM,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO;AAC3D,QAAI,OAAO,EAAG,QAAO,MAAM;AAAA,EAC/B;AAEA,QAAM,UAAU,CAAC,GAAG,QAAQ;AAC5B,UAAQ,OAAO,MAAM,GAAG,IAAI;AAE5B,UAAQ,QAAQ,CAAC,MAAM,MAAM;AACzB,SAAK,QAAQ;AAAA,EACjB,CAAC;AAED,SAAO;AACX;AAEO,SAAS,yBACZ,SACA,QACA,YACA,UAc+B;AAjZnC;AAkZI,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,cAAc,OAAO;AAClC,QAAM,OAAO,KAAK,MAAM;AAAA,IACpB,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA,EACzC;AAEA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,SAAQ,UAAK,UAAL,YAAc,CAAC;AAC7B,QAAM,QAAO,UAAK,UAAL,YAAc;AAE3B,QAAM,WAAW,WAAW,OAAO,CAAC,cAAc;AAC9C,UAAM,UAAU,MAAM,IAAI,CAAC,SAAS;AA/Z5C,UAAAC,KAAAC,KAAA;AAgaY,UAAI,KAAK,SAAS,iBAAiB;AAC/B,gBAAOA,OAAAD,MAAA,SAAS,iBAAT,gBAAAA,IAAA,eAAwB,WAAW,UAAnC,OAAAC,MAA4C;AAAA,MACvD;AACA,UAAI,KAAK,SAAS,iBAAiB;AAC/B,gBAAO,oBAAS,iBAAT,kCAAwB,WAAW,UAAnC,YAA4C;AAAA,MACvD;AACA,cAAO,oBAAS,kBAAT,kCAAyB,WAAW,UAApC,YAA6C;AAAA,IACxD,CAAC;AAED,WAAO,SAAS,QAAQ,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK,OAAO;AAAA,EACzE,CAAC;AAED,OAAK,qBAAqB,oBAAoB,QAAQ;AACtD,OAAK,aAAa,KAAK,IAAI;AAE3B,SAAO;AACX;;;A1CpVA,IAAM,YAAY;AAIX,IAAM,SAAN,MAAa;AAAA,EAYhB,YAAY,SAAkB,KAAgB,OAAsB,CAAC,GAAG;AARxE,SAAQ,UAA4B,CAAC;AACrC,SAAQ,QAAQ;AAChB,SAAQ,WAAW;AAtGvB;AA6GQ,SAAK,UAAU;AACf,SAAK,MAAM;AAEX,SAAK,OAAO;AAAA,MACR,GAAG;AAAA,MACH,cAAc,KAAK;AAAA,QACf;AAAA,QACA,KAAK,KAAI,UAAK,iBAAL,YAAqB,WAAW,GAAI;AAAA,MACjD;AAAA,MACA,oBAAmB,UAAK,sBAAL,YAA0B;AAAA,IACjD;AACA,SAAK,YAAY,KAAK,aAAa,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEA,QAAQ,IAAY;AAChB,WAAO,KAAK,QAAQ,QAAQ,EAAE;AAAA,EAClC;AAAA,EAEA,UAAU,IAAY;AAClB,WAAO,KAAK,QAAQ,UAAU,EAAE;AAAA,EACpC;AAAA,EAEA,WAAW,IAAY;AACnB,WAAO,KAAK,QAAQ,WAAW,EAAE;AAAA,EACrC;AAAA,EAEA,WAAyB;AACrB,WAAO,KAAK,QAAQ,SAAS;AAAA,EACjC;AAAA,EAEA,SAAS,OAAe,IAAsB;AAC1C,UAAM,SAAS,KAAK,aAAa;AACjC,QAAI,KAAK;AACT,QAAI,QAAQ;AACR,WAAK,WAAW;AAChB,WAAK,eAAe,KAAK,aAAa,QAAQ,SAAS;AAAA,IAC3D;AACA,SAAK;AACL,QAAI;AACA,SAAG;AACH,WAAK;AAAA,IACT,UAAE;AACE,WAAK;AACL,UAAI,QAAQ;AACR,YAAI,IAAI;AACJ,eAAK,OAAO,KAAK;AAAA,QACrB,WAAW,KAAK,cAAc;AAC1B,eAAK,aAAa,KAAK,cAAc,MAAM;AAAA,QAC/C;AACA,aAAK,WAAW;AAChB,aAAK,eAAe;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,KAAK,KAAoB;AApK7B;AAqKQ,QAAI;AACA,YAAM,SAAS,KAAK,aAAa,IAAI,OAAO,SAAS;AACrD,UAAI,GAAG;AACP,WAAK,cAAc,IAAI,MAAM,MAAM;AAAA,IACvC,SAAS,KAAK;AACV,WAAK,KAAK,gBAAgB;AAAA,QACtB,UAAU,gCAAe,YAAf,YAA0B,OAAO,GAAG;AAAA,QAC9C,MAAM;AAAA,MACV,CAAC;AACD,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,OAAgB;AACZ,QAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,SAAK;AACL,SAAK,aAAa,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM;AAClD,SAAK,KAAK,eAAe;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,MACxB,OAAO,KAAK;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,OAAgB;AACZ,QAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,EAAG,QAAO;AAClD,SAAK;AACL,SAAK,aAAa,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM;AAClD,SAAK,KAAK,eAAe;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,MACxB,OAAO,KAAK;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,aAAa,IAAY;AACrB,SAAK,WAAW,IAAI,EAAE,YAAY,OAAU,CAAC;AAAA,EACjD;AAAA,EAEA,UAAU,KAAc,OAAyB,CAAC,GAAW;AACzD,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK,IAAI;AAAA,EAChD;AAAA,EAEA,QAAQ,IAAY,WAAyB;AACzC,WAAO,QAAQ,KAAK,UAAU,GAAG,IAAI,SAAS;AAAA,EAClD;AAAA,EAEA,aAAa,SAAiB,UAA2C;AACrE,WAAO,aAAa,KAAK,UAAU,GAAG,SAAS,QAAQ;AAAA,EAC3D;AAAA,EAEA,2BAA2D;AACvD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,UACI,IACA,MAMF;AACE,WAAO,UAAU,KAAK,UAAU,GAAG,IAAI,IAAI;AAAA,EAC/C;AAAA,EAEA,YACI,UACA,MACF;AACE,WAAO,YAAY,KAAK,UAAU,GAAG,UAAU,IAAI;AAAA,EACvD;AAAA,EAEA,UACI,SACA,OAOM;AACN,WAAO,UAAU,KAAK,UAAU,GAAG,SAAS,KAAK;AAAA,EACrD;AAAA,EAEA,aACI,UACA,OAOF;AACE,WAAO,aAAa,KAAK,UAAU,GAAG,UAAU,KAAK;AAAA,EACzD;AAAA,EAEA,aAAa,UAAkB;AAC3B,WAAO,aAAa,KAAK,UAAU,GAAG,QAAQ;AAAA,EAClD;AAAA,EAEA,UAAU,IAAY,OAAqB;AACvC,WAAO,UAAU,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EAChD;AAAA,EAEA,SAAS,SAAiB,MAA0B;AAChD,WAAO,SAAS,KAAK,UAAU,GAAG,SAAS,IAAI;AAAA,EACnD;AAAA,EAEA,WACI,IACA,OACI;AACJ,WAAO,WAAW,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EACjD;AAAA,EAEA,OACI,SACF;AACE,WAAO,OAAO,KAAK,UAAU,GAAG,OAAO;AAAA,EAC3C;AAAA,EAEA,UAAU,IAAY,OAAqB;AACvC,WAAO,UAAU,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EAChD;AAAA,EAEA,UAAU,IAAY;AAClB,WAAO,UAAU,KAAK,UAAU,GAAG,EAAE;AAAA,EACzC;AAAA,EAEA,UAAU,OAAiE;AACvE,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK;AAAA,EAC5C;AAAA,EAEA,aAAa,IAAY,OAA0C;AAC/D,WAAO,aAAa,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EACnD;AAAA,EAEA,aAAa,IAAkB;AAC3B,WAAO,aAAa,KAAK,UAAU,GAAG,EAAE;AAAA,EAC5C;AAAA,EAEA,SACI,SAKF;AACE,WAAO,SAAS,KAAK,UAAU,GAAG,OAAO;AAAA,EAC7C;AAAA,EAEA,YAAY,IAAY,OAAuB;AAC3C,WAAO,YAAY,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EAClD;AAAA,EAEA,YAAY,IAAY;AACpB,WAAO,YAAY,KAAK,UAAU,GAAG,EAAE;AAAA,EAC3C;AAAA,EAEA,OAAO,IAAY;AACf,WAAO,OAAO,KAAK,UAAU,GAAG,EAAE;AAAA,EACtC;AAAA,EAEA,QAAQ,IAAY;AAChB,WAAO,QAAQ,KAAK,UAAU,GAAG,EAAE;AAAA,EACvC;AAAA,EAEA,qBAAqB,IAAsC;AACvD,WAAO,qBAAqB,KAAK,UAAU,GAAG,EAAE;AAAA,EACpD;AAAA,EAEA,qBAAqB,IAAY,MAAqB;AAClD,WAAO,qBAAqB,KAAK,UAAU,GAAG,IAAI,IAAI;AAAA,EAC1D;AAAA,EAEA,uBAAuB,IAAkB;AACrC,WAAO,uBAAuB,KAAK,UAAU,GAAG,EAAE;AAAA,EACtD;AAAA,EAEA,QAAQ,YAAoB,SAA4B;AACpD,WAAO,QAAQ,KAAK,UAAU,GAAG,YAAY,OAAO;AAAA,EACxD;AAAA,EAEA,QAAQ,YAAoB,SAA4B;AACpD,WAAO,QAAQ,KAAK,UAAU,GAAG,YAAY,OAAO;AAAA,EACxD;AAAA,EAEA,QAAQ,MAAgB,QAAgBC,OAAoB;AACxD,WAAO,QAAQ,KAAK,UAAU,GAAG,MAAM,QAAQA,KAAI;AAAA,EACvD;AAAA,EAEA,WAAW,MAAgB,QAAgBA,OAAoB;AAC3D,WAAO,WAAW,KAAK,UAAU,GAAG,MAAM,QAAQA,KAAI;AAAA,EAC1D;AAAA,EAEA,cAAc,OAAe,MAAc,OAA4B;AACnE,WAAO,cAAc,KAAK,UAAU,GAAG,OAAO,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,wBAAwB,OAAe,MAAc;AACjD,WAAO,wBAAwB,KAAK,UAAU,GAAG,OAAO,IAAI;AAAA,EAChE;AAAA,EAEA,gBAAgB,OAAe,MAAc;AACzC,WAAO,gBAAgB,KAAK,UAAU,GAAG,OAAO,IAAI;AAAA,EACxD;AAAA,EAEA,mBAAmB,IAA+C;AAC9D,WAAO,mBAAmB,KAAK,UAAU,GAAG,EAAE;AAAA,EAClD;AAAA,EAEA,mBAAmB,IAAY,OAAsB;AACjD,WAAO,mBAAmB,KAAK,UAAU,GAAG,IAAI,KAAK;AAAA,EACzD;AAAA,EAEA,qBAAqB,IAAkB;AACnC,WAAO,qBAAqB,KAAK,UAAU,GAAG,EAAE;AAAA,EACpD;AAAA,EAEA,aAA8C;AAC1C,WAAOC,WAAU,KAAK,OAAO;AAAA,EACjC;AAAA,EAEA,WAAW,MAAkC;AACzC,SAAK,eAAe,MAAM,aAAa;AAAA,EAC3C;AAAA,EAEA,eAAqB;AACjB,SAAK,eAAe,QAAW,eAAe;AAAA,EAClD;AAAA,EAEA,gBAAqC;AACjC,UAAM,OAAO,KAAK,UACZA,WAAU,KAAK,OAAO,IACtB,mBAAmB;AACzB,SAAK,UAAUA,WAAU,IAAI;AAC7B,WAAO;AAAA,EACX;AAAA,EAEA,mBAAmB,OAUR;AACP,UAAM,OAAO,gBAAgB,KAAK,SAAS,KAAK;AAChD,SAAK,eAAe,MAAM,sBAAsB;AAChD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,wBAAwB,OAWb;AACP,UAAM,OAAO,qBAAqB,KAAK,SAAS,KAAK;AACrD,SAAK,eAAe,MAAM,4BAA4B;AACtD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,kBACI,IACA,OACI;AACJ,SAAK;AAAA,MACD,kBAAuB,KAAK,SAAS,IAAI,KAAK;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,kBAAkB,IAAe,MAAoC;AACjE,SAAK;AAAA,MACD,kBAAuB,KAAK,SAAS,IAAI,IAAI;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,gBACI,QACA,MAMI;AACJ,SAAK;AAAA,MACD,gBAAqB,KAAK,SAAS,QAAQ,IAAI;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,6BACI,QACA,YACA,OAAwC,UACpC;AACJ,SAAK;AAAA,MACD;AAAA,QACI,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,qBAAqB,IAAsB;AACvC,UAAM,OAAO,qBAA0B,KAAK,SAAS,EAAE;AACvD,SAAK,UAAUA,WAAU,IAAI;AAE7B,SAAK;AAAA,MACD;AAAA,MACA;AAAA,QACI,cAAc;AAAA,MAClB;AAAA,IACJ;AAEA,SAAK;AAAA,MACD;AAAA,MACA;AAAA,QACI,SAASA,WAAU,KAAK,OAAO;AAAA,QAC/B,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,mBAAmB,MAA6C;AAC5D,SAAK;AAAA,MACD,mBAAmB,KAAK,SAAS,IAAI;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,0BAA0B,WAAoC;AAC1D,SAAK;AAAA,MACD,0BAA0B,KAAK,SAAS,SAAS;AAAA,MACjD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,sBAAsB,IAAqB;AACvC,SAAK;AAAA,MACD,sBAAsB,KAAK,SAAS,EAAE;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,mBAAmB,IAAe,UAAyB;AACvD,SAAK;AAAA,MACD,mBAAmB,KAAK,SAAS,IAAI,QAAQ;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,oBAAoB,IAAqB;AACrC,SAAK;AAAA,MACD,oBAAoB,KAAK,SAAS,EAAE;AAAA,MACpC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,yBACI,QACA,YACA,UAckB;AAjjB1B;AAkjBQ,UAAM,OAAO;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,SAAK,eAAe,MAAM,6BAA6B;AAEvD,UAAM,OAAO,6BAAM,MAAM;AAAA,MACrB,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA;AAGzC,YAAO,wCAAM,uBAAN,mBAA0B,YAA1B,YAAqC,CAAC;AAAA,EACjD;AAAA,EAEQ,eACJ,MACA,SAAS,eACX;AACE,SAAK,UAAUA,WAAU,IAAI;AAC7B,SAAK;AAAA,MACD;AAAA,MACA;AAAA,QACI,SAASA,WAAU,KAAK,OAAO;AAAA,QAC/B,UAAU,KAAK,aAAa,MAAM;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EACQ,aAAa,MAA0B;AAC3C,UAAM,OAAO,UAAU,MAAM;AAAA,MACzB,aAAa,KAAK,QACb,eAAe,EACf,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,MAC7B,oBAAoB;AAAA,IACxB,CAAC;AACD,SAAK,QAAQ,KAAK,IAAI;AACtB,SAAK,IAAI,aAAa;AAAA,EAC1B;AAAA,EAEQ,WAAW,KAAsC;AACrD,UAAM,MAAMA,WAAU,KAAK,QAAQ,SAAS,CAAC;AAC7C,QAAI,GAAG;AACP,SAAK,aAAa,GAAG;AAAA,EACzB;AAAA,EAEQ,cAAc,SAAiB,SAAyB;AAC5D,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,OAAO,KAAK,aAAa,OAAO;AACtC,SAAK,YAAY,IAAI;AACrB,SAAK,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC7C,QAAI,KAAK,KAAK,mBAAmB;AAC7B,WAAK,KAAK,iBAAiB;AAAA,QACvB,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR;AAAA,QACA,UAAU;AAAA,MACd,CAAC;AAAA,IACL,OAAO;AACH,WAAK,KAAK,iBAAiB;AAAA,QACvB,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR;AAAA,QACA,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,OAAO,OAAe;AAC1B,UAAM,OAAO,KAAK,aAAa,KAAK;AACpC,SAAK,YAAY,IAAI;AACrB,SAAK,KAAK,iBAAiB;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,IACd,CAAC;AAAA,EACL;AAAA,EAEQ,aAAa,MAA8B;AAC/C,UAAM,QAAQA,WAAU,KAAK,QAAQ,SAAS,CAAC;AAC/C,UAAM,SAAS,KAAK,IAAI,SAAS;AACjC,WAAO;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,QACJ;AAAA,MACJ;AAAA,MACA,SAASA,WAAU,KAAK,OAAO;AAAA,IACnC;AAAA,EACJ;AAAA,EAEQ,aAAa,GAAmB,QAAyB;AAC7D,SAAK,QAAQ,KAAKA,WAAU,EAAE,KAAK,CAAC;AAEpC,UAAM,SAAS,EAAE;AACjB,UAAM,SAAS,iCAAQ;AAEvB,QAAI,QAAQ;AACR,UAAI,OAAO,UAAW,MAAK,IAAI,aAAa,OAAO,SAAS;AAC5D,UAAI,OAAO,SAAU,MAAK,IAAI,YAAY,OAAO,QAAQ;AACzD,UAAI,OAAO,WAAW;AAClB,aAAK,IAAI;AAAA,UACL,MAAM,QAAQ,OAAO,SAAS,IACxB,OAAO,YACP,MAAM,KAAK,OAAO,SAAS;AAAA,QACrC;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,WAAK,IAAI,aAAa;AAAA,IAC1B;AACA,SAAK,KAAK,iBAAiB,EAAE,OAAO,EAAE,OAAO,QAAQ,UAAU,EAAE,CAAC;AAAA,EACtE;AAAA,EAEQ,YAAY,MAAsB;AACtC,QAAI,KAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACtC,WAAK,UAAU,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,IACvD;AACA,SAAK,QAAQ,KAAK,IAAI;AACtB,UAAM,OAAO,KAAK,QAAQ,SAAS,KAAK,KAAK;AAC7C,QAAI,OAAO,GAAG;AACV,WAAK,QAAQ,OAAO,GAAG,IAAI;AAC3B,WAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACvC,OAAO;AACH,WAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ;AAAA,EAEQ,KACJ,OACA,SACF;AACE,SAAK,IAAI,KAAK,OAAc,OAAc;AAAA,EAC9C;AAAA,EAEO,8BACH,YACA,KAUc;AACd,WAAOC,+BAA8B,KAAK,UAAU,GAAG,YAAY,GAAG;AAAA,EAC1E;AAAA,EAEQ,YAAiC;AACrC,WAAO;AAAA,MACH,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,UAAU,MAAM,KAAK,QAAQ,SAAS;AAAA,MACtC,SAAS,CAAC,OAAO,KAAK,QAAQ,EAAE;AAAA,MAChC,WAAW,CAAC,OAAO,KAAK,UAAU,EAAE;AAAA,MACpC,YAAY,CAAC,OAAO,KAAK,WAAW,EAAE;AAAA,MACtC,UAAU,CAAC,OAAO,OAAO,KAAK,SAAS,OAAO,EAAE;AAAA,MAChD,MAAM,CAAC,QAAQ,KAAK,KAAK,GAAG;AAAA,MAC5B,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,YAAY,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,MACxC,cAAc,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,MAC9C,MAAM,CAAC,OAAO,YAAY,KAAK,KAAK,OAAO,OAAO;AAAA,MAClD,cAAc,CAAC,QAAQ,KAAK,aAAa,GAAG;AAAA,MAC5C,cAAc,CAAC,GAAG,WAAW,KAAK,aAAa,GAAG,MAAM;AAAA,MACxD,SAAS,CAAC,OAAO,QAAQ,KAAK,UAAU,GAAG,EAAE;AAAA,MAC7C,UAAU,CAAC,SAAS,SAAS,KAAK,UAAU,GAAG,IAAI;AAAA,MACnD,gBAAgB,CAAC,SAAS,SACtB,eAAe,KAAK,UAAU,GAAG,SAAS,IAAI;AAAA,MAClD,OAAO,CAAC,WAAW,MAAM,KAAK,UAAU,GAAG,MAAa;AAAA,MACxD,0BAA0B,CAAC,UAAU;AACjC,aAAK,yBAAyB;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AACJ;;;A2CnsBO,IAAM,YAAN,MAAgB;AAAA,EAMnB,YACqB,SACA,MACnB;AAFmB;AACA;AAPrB,SAAQ,MAAM,oBAAI,IAAY;AAG9B,SAAQ,cAA0B,CAAC;AAAA,EAKhC;AAAA;AAAA,EAGH,QAAQ,IAAoB;AACxB,QAAI,CAAC,GAAI,QAAO,KAAK,MAAM;AAC3B,SAAK,IAAI,MAAM;AACf,SAAK,IAAI,IAAI,EAAE;AACf,SAAK,YAAY;AACjB,SAAK,qBAAqB,EAAE;AAC5B,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,IAAY;AAIZ,QAAI,KAAK,IAAI,IAAI,EAAE,EAAG,MAAK,IAAI,OAAO,EAAE;AACxC,SAAK,IAAI,IAAI,EAAE;AAEf,SAAK,YAAY;AACjB,SAAK,qBAAqB,EAAE;AAC5B,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAAY;AACf,QAAI,CAAC,KAAK,IAAI,OAAO,EAAE,EAAG;AAC1B,QAAI,KAAK,cAAc,IAAI;AACvB,WAAK,YAAY,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE;AAC1C,UAAI,KAAK,UAAW,MAAK,qBAAqB,KAAK,SAAS;AAAA,IAChE;AACA,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAAY;AACf,QAAI,KAAK,IAAI,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,QAC/B,MAAK,IAAI,EAAE;AAAA,EACpB;AAAA,EAEA,KAAK,KAAuB,SAAkB;AAC1C,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,SAAK,YAAY,4BAAW,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE;AACrD,QAAI,KAAK,UAAW,MAAK,qBAAqB,KAAK,SAAS;AAC5D,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACJ,QAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,UAAW;AACvC,SAAK,IAAI,MAAM;AACf,SAAK,YAAY;AACjB,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,IAAqB;AACrB,WAAO,KAAK,IAAI,IAAI,EAAE;AAAA,EAC1B;AAAA,EAEA,UAA8B;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,aAAiC;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,IAA0B;AAC/B,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO,MAAM;AACT,YAAM,IAAI,KAAK,YAAY,QAAQ,EAAE;AACrC,UAAI,KAAK,EAAG,MAAK,YAAY,OAAO,GAAG,CAAC;AAAA,IAC5C;AAAA,EACJ;AAAA;AAAA,EAGA,eAAmC;AAxHvC;AAyHQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AAGpC,UAAK,UAAK,KAAK,QAAV,YAAiB,cAAc,aAAa;AAC7C,YAAM,SAAS,MAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QAChC,KAAK,QAAQ,QAAQ,KAAK,KAAK,OAAO;AAAA,MAC1C;AACA,UAAI,OAAO,SAAS,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS,QAAQ,MAAM,KAAK,KAAK,GAAG,EAAE;AAAA,MACzD;AAAA,IACJ;AAEA,UAAM,QAAQ,KAAK,oBAAoB,KAAK;AAC5C,QAAI,CAAC;AACD,aAAO,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE;AAEjE,UAAM,QAAQ,KAAK,mBAAmB,OAAO,KAAK;AAClD,WAAO,EAAE,MAAM,UAAU,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,4BAAsD;AA7J1D;AA8JQ,UAAM,UAAU,KAAK,QAAQ,WAAW;AACxC,UAAM,MAAgC,CAAC;AAEvC,UAAM,OAAO,CAAC,SAAiB,eAAuB;AAjK9D,UAAAC;AAkKY,YAAM,OAAOA,MAAA,wBAAAA,MAAA,eAAiB,CAAC;AAC/B,UAAI,CAAC,IAAI,SAAS,UAAU,EAAG,KAAI,KAAK,UAAU;AAAA,IACtD;AAEA,eAAW,OAAO,KAAK,KAAK;AACxB,UAAI,CAAC,IAAK;AAGV,YAAM,MAAM,IAAI,QAAQ,IAAI;AAC5B,UAAI,QAAQ,IAAI;AACZ,cAAM,WAAW,IAAI,MAAM,MAAM,CAAC;AAClC,cAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,aACI,iCAAQ,UAAS,YACjB,OAAO,OAAO,YAAY,UAC5B;AACE,eAAK,OAAO,SAAS,GAAG;AAAA,QAC5B;AACA;AAAA,MACJ;AAEA,YAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,UAAI,CAAC,IAAK;AAGV,UAAI,IAAI,SAAS,YAAY,OAAO,IAAI,YAAY,UAAU;AAC1D,aAAK,IAAI,UAAS,SAAI,OAAJ,YAAU,GAAG;AAC/B;AAAA,MACJ;AAGA,UAAI,IAAI,SAAS,SAAS;AACtB,cAAM,SAAQ,eAAI,SAAJ,YAAY,IAAI,UAAhB,YAAyB;AACvC,cAAM,WAAU,eAAI,OAAJ,YAAU,+BAAO,OAAjB,YAAuB;AACvC,aAAI,+BAAO,YAAW,QAAQ,OAAO,YAAY,UAAU;AACvD,eAAK,SAAS,OAAO;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAA4B;AApNhC;AAqNQ,UAAM,UAAU,KAAK,QAAQ,WAAW;AACxC,UAAM,MAAgB,CAAC;AACvB,UAAM,OAAO,oBAAI,IAAY;AAE7B,UAAM,OAAO,CAAC,MAAc;AACxB,UAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AACd,aAAK,IAAI,CAAC;AACV,YAAI,KAAK,CAAC;AAAA,MACd;AAAA,IACJ;AAEA,eAAW,OAAO,KAAK,KAAK;AACxB,UAAI,CAAC,IAAK;AAGV,YAAM,MAAM,IAAI,QAAQ,IAAI;AAC5B,UAAI,QAAQ,IAAI;AACZ,cAAM,WAAW,IAAI,MAAM,MAAM,CAAC;AAClC,cAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,aAAI,iCAAQ,UAAS,SAAU,MAAK,GAAG;AACvC;AAAA,MACJ;AAEA,YAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,UAAI,CAAC,IAAK;AAGV,UAAI,IAAI,SAAS,UAAU;AACvB,aAAK,GAAG;AACR;AAAA,MACJ;AAGA,UAAI,IAAI,SAAS,SAAS;AACtB,cAAM,SAAQ,eAAI,SAAJ,YAAY,IAAI,UAAhB,YAAyB;AACvC,aAAI,+BAAO,YAAW,KAAM,MAAK,GAAG;AAAA,MACxC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,OAAO;AACX,UAAM,UAAqB;AAAA,MACvB,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,MACxB,SAAS,KAAK;AAAA,IAClB;AACA,eAAW,MAAM,KAAK,YAAa,IAAG,OAAO;AAAA,EACjD;AAAA,EAEQ,qBAAqB,IAAY;AAxQ7C;AAyQQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAEhC,QAAI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;AAC/B,WAAK,eAAe;AACpB;AAAA,IACJ;AAEA,UAAM,cAAc,CAACC,WAAsC;AACvD,UAAI,EAACA,UAAA,gBAAAA,OAAO,SAAS,QAAO;AAC5B,aAAO,MAAM,QAAQA,OAAM,OAAO,IAC5BA,OAAM,QAAQ,CAAC,IACfA,OAAM;AAAA,IAChB;AAEA,UAAM,eAAe,MAAyB;AAC1C,YAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7C,UAAI,OAAQ,QAAO;AAEnB,UAAI,KAAK,QAAQ,WAAW,EAAE,GAAG;AAC7B,eAAO,OAAO;AAAA,UAAK,CAAC,MAAG;AA9RvC,gBAAAD;AA+RqB,qBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA;AAAA,QAC7C;AAAA,MACJ;AAEA,UAAI,GAAG,SAAS,IAAI,GAAG;AACnB,cAAM,CAAC,OAAO,IAAI,GAAG,MAAM,IAAI;AAC/B,YAAI,CAAC,QAAS,QAAO;AACrB,eAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAAA,MAC9C;AAEA,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,aAAa;AAC3B,QAAI,CAAC,MAAO;AAEZ,UAAM,eAAe,KAAK,WAAW;AACrC,QAAI,cAAc;AACd,YAAM,iBAAiB,gBAAgB,KAAK,OAAO,EAAE;AAAA,QACjD;AAAA,MACJ;AACA,UAAI,iDAAgB,cAAc,MAAM,KAAK;AACzC,aAAK,eAAe;AACpB;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,gBAAgB,YAAY,KAAK;AACvC,QAAI,cAAe,MAAK,eAAe;AAAA,EAC3C;AAAA,EAEQ,oBAAoB,OAAyC;AA9TzE;AA+TQ,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,eAAW,MAAM,KAAK,IAAK,KAAI,KAAK,QAAQ,QAAQ,EAAE,EAAG,QAAO;AAEhE,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,eAAW,MAAM,KAAK,KAAK;AACvB,YAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC,UAAI,uBAAG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;AAAA,IAC3D;AAEA,eAAW,MAAM,KAAK,KAAK;AACvB,UAAI,KAAK,QAAQ,WAAW,EAAE,GAAG;AAC7B,cAAM,OAAO,OAAO;AAAA,UAAK,CAAC,MAAG;AA5U7C,gBAAAA;AA6UqB,qBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA;AAAA,QAC7C;AACA,YAAI,6BAAM;AACN,iBAAO,MAAM,QAAQ,KAAK,OAAO,IAC3B,KAAK,QAAQ,CAAC,IACd,KAAK;AAAA,MACnB;AACA,UAAI,GAAG,SAAS,IAAI,GAAG;AACnB,cAAM,CAAC,GAAG,IAAI,GAAG,MAAM,IAAI;AAC3B,cAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AAC5C,YAAI,6BAAM;AACN,iBAAO,MAAM,QAAQ,KAAK,OAAO,IAC3B,KAAK,QAAQ,CAAC,IACd,KAAK;AAAA,MACnB;AAAA,IACJ;AAEA,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEQ,mBACJ,OACA,OACY;AApWpB;AAqWQ,UAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,UAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,UAAM,MAAM,QAAQ,IAAI,KAAK;AAG7B,UAAM,qBAAqB,KAAK,gBAAgB;AAChD,UAAM,WAAW,KAAK,QAAQ,cAAc,OAAO,kBAAkB;AAErE,UAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,UAAM,UAAU,SACX,IAAI,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC,EAC7B,OAAO,OAAO;AAGnB,UAAM,aAAoB,CAAC;AAC3B,QAAI,MAAM,2BAAK;AACf,UAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAO,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B,YAAM,IAAI,QAAQ,IAAI,GAAG;AACzB,UAAI,CAAC,EAAG;AACR,iBAAW,KAAK,CAAC;AACjB,YAAM,IAAI,GAAG;AACb,YAAM,EAAE;AAAA,IACZ;AACA,UAAM,eAAe,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK;AAG3D,UAAM,WAAmC,CAAC;AAC1C,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,mBAAmB;AACvB,SAAI,2BAAK,eAAc,MAAM;AACzB,eAAS;AAAA,SACL,wCAAU,IAAI,gBAAd,YACK,EAAE,IAAI,IAAI,WAAW;AAAA,MAC9B;AACA,yBAAmB;AAAA,IACvB;AAGA,QAAI,iBAAiB;AACrB,eAAW,SAAS,KAAK,KAAK;AAE1B,YAAM,MAAM,KAAK,eAAe,QAAQ,KAAK;AAC7C,WAAI,2BAAK,eAAc,MAAM;AACzB,cAAM,QAAQ,SAAI,iBAAJ,YAAoB;AAClC,cAAM,OACF,wCAAU,IAAI,gBAAd,YACC,EAAE,IAAI,IAAI,WAAW;AAE1B,yBAAiB,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AACA;AAAA,MACJ;AAGA,YAAM,IAAI,UAAU,IAAI,KAAK;AAC7B,WAAI,uBAAG,YAAW,QAAQ,EAAE,cAAc,MAAM;AAC5C,cAAM,QAAQ,OAAE,iBAAF,YAAkB;AAChC,cAAM,OACF,wCAAU,EAAE,gBAAZ,YACC,EAAE,IAAI,EAAE,WAAW;AAExB,yBAAiB,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,iBACJ,UACA,KACA,MACA,kBACA,gBACO;AACP,QAAI,SAAS,QAAQ;AACjB,UAAI,CAAC,gBAAgB;AACjB,YAAI,oBAAoB,SAAS,SAAS,GAAG;AACzC,mBAAS,CAAC,IAAI;AAAA,QAClB,OAAO;AACH,mBAAS,QAAQ,GAAG;AAAA,QACxB;AACA,eAAO;AAAA,MACX,OAAO;AACH,iBAAS,KAAK,GAAG;AAAA,MACrB;AAAA,IACJ,OAAO;AACH,eAAS,KAAK,GAAG;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,QAAiB,OAAe;AAxd3D;AAydQ,QAAI,KAAK,QAAQ,WAAW,KAAK,GAAG;AAChC,iBAAW,KAAK,QAAQ;AACpB,cAAM,KAAI,OAAE,YAAF,mBAAW,KAAK,CAAC,MAAM,EAAE,OAAO;AAC1C,YAAI,EAAG,QAAO;AAAA,MAClB;AAAA,IACJ;AACA,QAAI,MAAM,SAAS,IAAI,GAAG;AACtB,YAAM,CAAC,KAAK,GAAG,IAAI,MAAM,MAAM,IAAI;AACnC,YAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AACzC,YAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,OAAO;AAC3D,UAAI,EAAG,QAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACX;AACJ;;;ACtdO,IAAM,YAAN,MAAgB;AAAA,EASnB,YACI,SACA,OAA6C,CAAC,GAChD;AAXF,SAAQ,MAAM,IAAI,SAAuB;AAkFzC;AAAA,cAAK,KAAK,IAAI,GAAG,KAAK,KAAK,GAAG;AAC9B,gBAAO,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AA6IlC,SAAQ,UAAoB;AAe5B;AAAA;AAAA,SAAQ,oBAAoB,oBAAI,IAAY;AAjQhD;AA8BQ,SAAK,UAAU;AACf,SAAK,YAAW,UAAK,kBAAL,YAAsB;AACtC,SAAK,YAAY,IAAI,UAAU,SAAS;AAAA,MACpC,KAAK;AAAA,MACL,WAAW;AAAA,IACf,CAAC;AAED,UAAM,QAAQ,QAAQ,KAAK;AAC3B,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB,aAAa,oBAAI,IAAI;AAAA,MACrB,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,KAAK,gBAAgB;AAAA,MACzD,SAAS;AAAA,IACb;AAEA,SAAK,UAAU,SAAS,CAAC,EAAE,IAAI,MAAM;AAEjC,WAAK,MAAM,YAAY,IAAI,IAAI,GAAG;AAClC,WAAK,KAAK;AAGV,WAAK,IAAI,KAAK,oBAAoB,EAAE,IAAI,CAAC;AAGzC,UAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,IACpE,CAAC;AAGD,UAAM,iBACD,UACI,aADJ,aAEA,MAAM;AACH,YAAM,UAAU;AAMhB,UACI,CAAC,QAAQ,eACT,CAAC,QAAQ,WACT,CAAC,QAAQ,UACX;AACE,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,QACH,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,MACtB;AAAA,IACJ;AAEJ,SAAK,WAAW,IAAI,YAAY,KAAK,KAAK;AAAA,MACtC,UAAS,UAAK,YAAL,mBAAc;AAAA,MACvB,UAAU;AAAA,IACd,CAAC;AAED,SAAK,SAAS,IAAI,OAAO,SAAS,MAAM;AAAA,MACpC,YAAY,QAAQ,cAAc;AAAA,MAClC,eAAe,CAAC,OAAO,QAAQ,cAAc,EAAE,eAAe,EAAE;AAAA,MAChE,GAAG;AAAA,IACP,CAAC;AAED,QAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,EACpE;AAAA,EAMO,KACH,OACA,SACI;AACJ,SAAK,IAAI,KAAK,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA,EAGA,WAAwB;AAEpB,WAAO;AAAA,MACH,GAAG,KAAK;AAAA,MACR,WAAW,IAAI,IAAI,KAAK,MAAM,SAAS;AAAA,MACvC,aAAa,IAAI,IAAI,KAAK,MAAM,WAAW;AAAA,MAC3C,OAAO;AAAA,QACH,OAAO,CAAC,GAAG,KAAK,MAAM,MAAM,KAAK;AAAA,QACjC,OAAO,CAAC,GAAG,KAAK,MAAM,MAAM,KAAK;AAAA,MACrC;AAAA,MACA,WAAW,EAAE,GAAG,KAAK,MAAM,UAAU;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,WAA0B;AACtB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,eAAyB;AACrB,WAAO,MAAM,KAAK,KAAK,MAAM,SAAS;AAAA,EAC1C;AAAA,EAEA,cAAwB;AACpB,WAAO,EAAE,GAAG,KAAK,MAAM,SAAS;AAAA,EACpC;AAAA;AAAA,EAGA,eAAqB;AACjB,SAAK,MAAM,QAAQ,KAAK,QAAQ,KAAK;AACrC,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,KAAK,MAAM,KAAK;AAAA,EAClD;AAAA,EAEA,aAAa,KAA0B;AACnC,SAAK,MAAM,YAAY,EAAE,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI;AACzD,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,IAAY,GAAW,GAAiB;AAChD,SAAK,MAAM,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE;AAClC,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,KAA6B,SAAwB;AACxD,SAAK,UAAU,KAAK,KAAK,OAAO;AAAA,EACpC;AAAA,EAEA,eAAe,KAAmC;AAC9C,UAAM,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AACzC,QAAI;AAEJ,eAAW,MAAM,KAAY;AACzB,WAAK,IAAI,EAAE;AACX,gBAAU;AAAA,IACd;AAEA,SAAK,UAAU,KAAK,MAAM,OAAO;AAAA,EACrC;AAAA,EAEA,gBAAgB,IAAkB;AAC9B,SAAK,UAAU,OAAO,EAAE;AAAA,EAC5B;AAAA,EAEA,iBAAuB;AACnB,SAAK,UAAU,MAAM;AAAA,EACzB;AAAA,EAEA,eAAe,UAAyB;AACpC,SAAK,IAAI,KAAK,kBAAkB,EAAE,SAAS,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,eAAe,KAAmC;AAC9C,SAAK,MAAM,cAAc,IAAI,IAAI,GAAU;AAC3C,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,IAAmB;AACxB,SAAK,MAAM,UAAU;AACrB,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,EAAE,GAAG,CAAC;AAAA,EACxC;AAAA;AAAA,EAGA,YAAY,GAA4B;AACpC,SAAK,MAAM,WAAW,EAAE,GAAG,KAAK,MAAM,UAAU,GAAG,EAAE;AACrD,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,mBAAmB,KAAK,YAAY,CAAC;AAAA,EACvD;AAAA;AAAA,EAGA,UAAU,MAAc,MAA+B;AACnD,SAAK,MAAM,YAAY,EAAE,MAAM,KAAK;AACpC,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,YAAY,IAAmB;AAC3B,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AACT,SAAK,IAAI,KAAK,gBAAgB,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AAAA,EACtE;AAAA,EAEA,WAAW,IAAkB;AACzB,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AAET,SAAK,IAAI,KAAK,eAAe,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AACjE,SAAK,MAAM,YAAY;AACvB,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,aAAmB;AACf,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AACT,SAAK,IAAI,KAAK,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC;AAC9C,SAAK,MAAM,YAAY;AACvB,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGQ,OAAa;AACjB,SAAK,MAAM;AACX,QAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,EACpE;AAAA,EAEA,UAAgB;AACZ,SAAK,IAAI,MAAM;AAAA,EACnB;AAAA,EAIA,aAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,WAAW,KAAe;AAC7B,QAAI,KAAK,YAAY,IAAK;AAC1B,SAAK,UAAU;AACf,SAAK,IAAI,KAAK,eAAe,GAAG;AAAA,EACpC;AAAA;AAAA,EAQA,uBAAiC;AAC7B,WAAO,MAAM,KAAK,KAAK,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,oBAAoB,SAA0B;AAC1C,WAAO,KAAK,kBAAkB,IAAI,OAAO,OAAO,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,SAAiB,OAAsB;AACxD,UAAM,KAAK,OAAO,OAAO;AACzB,UAAM,SAAS,KAAK,kBAAkB,IAAI,EAAE;AAC5C,QAAI,SAAS,CAAC,OAAQ,MAAK,kBAAkB,IAAI,EAAE;AAAA,aAC1C,CAAC,SAAS,OAAQ,MAAK,kBAAkB,OAAO,EAAE;AAAA,QACtD;AAGL,SAAK,QAAQ,WAAW;AAAA,MACpB,iBAAiB,IAAI,IAAI,KAAK,iBAAiB;AAAA,IACnD,CAAC;AACD,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,mBAAmB,SAA0B;AACzC,UAAM,OAAO,CAAC,KAAK,oBAAoB,OAAO;AAC9C,SAAK,qBAAqB,SAAS,IAAI;AACvC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,KAA6B;AAC9C,UAAM,OAAO,IAAI,IAAI,MAAM,KAAK,KAAK,MAAM,CAAC;AAE5C,QACI,KAAK,SAAS,KAAK,kBAAkB,QACrC,MAAM,KAAK,IAAI,EAAE,MAAM,CAAC,OAAO,KAAK,kBAAkB,IAAI,EAAE,CAAC,GAC/D;AACE;AAAA,IACJ;AACA,SAAK,oBAAoB;AACzB,SAAK,QAAQ,WAAW;AAAA,MACpB,iBAAiB,IAAI,IAAI,KAAK,iBAAiB;AAAA,IACnD,CAAC;AACD,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,iBAAiB;AACb,WAAO,KAAK,QAAQ,eAAe;AAAA,EACvC;AAAA,EAEA,kBAAkB;AACd,WAAO,KAAK,QAAQ,SAAS;AAAA,EACjC;AACJ;;;AC/TA,YAAY,WAAW;AAGvB,SAAS,MAAM,eAAe;AAwMlB,SAOI,KAPJ;AAjKZ,IAAM,MAAY,oBAA8B,IAAI;AAE7C,SAAS,aAAsB;AAClC,QAAM,IAAU,iBAAW,GAAG;AAC9B,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iDAAiD;AACzE,SAAO;AACX;AAEO,SAAS,qBAAqC;AACjD,SAAa,iBAAW,GAAG;AAC/B;AAmBO,SAAS,aAAa,EAAE,UAAU,QAAQ,QAAQ,GAAsB;AAE3E,QAAM,CAAC,KAAK,MAAM,IAAU,eAAe,MAAG;AA3ElD;AA2EsD;AAAA,MAC9C,IAAI,wCAAS,WAAT,YAAmB,CAAC;AAAA,IAC5B;AAAA,GAAE;AAGF,QAAM,CAAC,eAAe,gBAAgB,IAAU,eAE9C,MAAG;AAlFT;AAkFa,aAAE,IAAI,wCAAS,eAAT,YAAuB,CAAC,EAAG;AAAA,GAAE;AAG5C,QAAM,eAAqB,aAAO,oBAAI,IAAgB,CAAC;AACvD,QAAM,UAAgB,kBAAY,MAAM;AACpC,eAAW,MAAM,aAAa,QAAS,IAAG;AAAA,EAC9C,GAAG,CAAC,CAAC;AAGL,QAAM,UAAgB,aAAiC,IAAI;AAE3D,WAAS,SAAS;AACd,UAAM,OAAO,QAAc;AAE3B,IAAM,gBAAU,MAAM;AAClB,cAAQ,UAAU;AAClB,cAAQ;AACR,aAAO,MAAM;AACT,gBAAQ,UAAU;AAClB,gBAAQ;AAAA,MACZ;AAAA,IACJ,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,WAAO;AAAA,EACX;AAEA,QAAM,MAAY,cAAiB,MAAM;AACrC,WAAO;AAAA,MACH,UAAU,IAAI;AACV,qBAAa,QAAQ,IAAI,EAAE;AAC3B,eAAO,MAAM,aAAa,QAAQ,OAAO,EAAE;AAAA,MAC/C;AAAA,MAEA,IAAI,SAAS;AAnHzB;AAoHgB,cAAM,OAAO,QAAQ;AACrB,cAAM,QACD,wCAAM,WAAN,8CAAyC;AAG9C,YAAI,QAAQ,WAAW,KAAM,QAAO,KAAK,OAAO;AAChD,eAAO,IAAI,OAAO;AAAA,MACtB;AAAA,MAEA,IAAI,SAAS,OAAO;AAChB,cAAM,OAAO,QAAQ;AAIrB,YAAI,MAAM;AACN,eAAK,SAAS,SAAS,KAAK;AAC5B;AAAA,QACJ;AAGA,eAAO,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE;AAChD,gBAAQ;AAAA,MACZ;AAAA;AAAA,MAGA,cAAc,SAAS;AA7InC;AA8IgB,gBAAO,mBAAc,OAAO,MAArB,YAA0B,CAAC;AAAA,MACtC;AAAA,MACA,cAAc,SAAS,WAAW;AAC9B,yBAAiB,CAAC,UAAU;AAAA,UACxB,GAAG;AAAA,UACH,CAAC,OAAO,GAAG,gCAAa,CAAC;AAAA,QAC7B,EAAE;AACF,gBAAQ;AAAA,MACZ;AAAA,MACA,gBAAgB,SAAS,UAAU;AAC/B,yBAAiB,CAAC,SAAS;AAxJ3C;AAyJoB,gBAAM,UAAU,IAAI,KAAI,UAAK,OAAO,MAAZ,YAAiB,CAAC,CAAC;AAC3C,cAAI,QAAQ,IAAI,QAAQ,EAAG,SAAQ,OAAO,QAAQ;AAAA,cAC7C,SAAQ,IAAI,QAAQ;AACzB,iBAAO,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,OAAO,EAAE;AAAA,QACrD,CAAC;AACD,gBAAQ;AAAA,MACZ;AAAA,MACA,qBAAqB,OAAO;AAExB,cAAM,CAAC,SAAS,QAAQ,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AACtD,YAAI,CAAC,WAAW,CAAC,SAAU;AAC3B,yBAAiB,CAAC,SAAS;AApK3C;AAqKoB,gBAAM,UAAU,IAAI,KAAI,UAAK,OAAO,MAAZ,YAAiB,CAAC,CAAC;AAC3C,kBAAQ,OAAO,QAAQ;AACvB,iBAAO,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,OAAO,EAAE;AAAA,QACrD,CAAC;AACD,gBAAQ;AAAA,MACZ;AAAA,MAEA,WAAW;AA5KvB;AA8KgB,cAAM,OAAO,QAAQ;AACrB,cAAM,QAAQ,wCAAM,WAAN,8CAAyC,CAAC;AAExD,eAAO;AAAA,MACX;AAAA,MAEA,SAAS;AACL,cAAM,OAAO,QAAQ;AACrB,YAAI,CAAC,KAAM,QAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,MAAM;AAG7C,eAAO,KAAK,OAAO;AAAA,MACvB;AAAA,MAEA,cAAc,IAAS,SAAiB;AACpC,cAAM,OAAO,QAAQ;AACrB,YAAI,CAAC,KAAM;AACX,aAAK,MAAM,IAAI,OAAO;AAAA,MAC1B;AAAA,MAEA,UAAU,QAAgC;AACtC,cAAM,OAAO,QAAQ;AACrB,YAAI,CAAC,KAAM;AAEX,aAAK,MAAM,MAAM;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,KAAK,eAAe,OAAO,CAAC;AAEhC,SACI,oBAAC,IAAI,UAAJ,EAAa,OAAO,KACjB;AAAA,IAAC;AAAA;AAAA,MACG,SAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU,MAAM,QAAQ;AAAA,MAExB;AAAA,4BAAC,UAAO;AAAA,QACP;AAAA;AAAA;AAAA,EACL,GACJ;AAER;;;ACxJO,SAAS,sBAAgC;AAC5C,QAAM,QAAuB,oBAAI,IAAI;AAErC,QAAM,MAAM,CACR,MACA,YAC8B;AAvEtC;AAwEQ,UAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,IAAK,4BAAW;AACtB,YAAO,QAAG,IAAI,CAAC,MAAR,YAAa,GAAG,IAAI,SAAS;AAAA,EACxC;AAEA,QAAM,WAAW,CACb,MACA,YACA,YACO;AACP,QAAI,KAAK,MAAM,IAAI,IAAI;AACvB,QAAI,CAAC,IAAI;AACL,WAAK,oBAAI,IAAmC;AAC5C,YAAM,IAAI,MAAM,EAAE;AAAA,IACtB;AACA,OAAG,IAAK,4BAAW,WAA4B,UAAU;AAAA,EAC7D;AAEA,QAAM,aAAa,CAAC,MAAiB,YAAiC;AAClE,UAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAI,CAAC,GAAI;AACT,UAAM,MAAO,4BAAW;AACxB,OAAG,OAAO,GAAG;AACb,QAAI,GAAG,SAAS,EAAG,OAAM,OAAO,IAAI;AAAA,EACxC;AAEA,QAAM,eAAe,CACjB,YAKO;AACP,eAAW,KAAK,QAAS,UAAS,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO;AAAA,EACrE;AAEA,SAAO,EAAE,KAAK,UAAU,YAAY,cAAc,QAAQ,MAAM;AACpE;AAGO,SAAS,uBACZ,UACA,MACA,SAC2B;AAC3B,SAAO,SAAS,IAAI,MAAM,OAAO;AACrC;;;ACvHA,SAAgB,iBAAAE,gBAAe,cAAAC,aAAY,WAAAC,gBAAe;AAoD/C,gBAAAC,YAAA;AAzBX,IAAMC,OAAMC,eAAqC,IAAI;AAE9C,SAAS,SAAS;AAAA,EACrB;AAAA,EACA;AACJ,GAIG;AACC,QAAM,WAAWC;AAAA,IACb,MAAM,4CAAmB,oBAAoB;AAAA,IAC7C,CAAC,eAAe;AAAA,EACpB;AAEA,QAAM,QAAQA;AAAA,IACV,OAAO;AAAA,MACH;AAAA,MACA,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,cAAc,SAAS;AAAA,IAC3B;AAAA,IACA,CAAC,QAAQ;AAAA,EACb;AAEA,SAAO,gBAAAH,KAACC,KAAI,UAAJ,EAAa,OAAe,UAAS;AACjD;AAEO,SAAS,YAA4B;AACxC,QAAM,IAAIG,YAAWH,IAAG;AACxB,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kDAAkD;AAC1E,SAAO;AACX;;;AC1DA,YAAYI,YAAW;AACvB,SAAS,WAAAC,gBAAe;AAExB,SAAS,gBAAgB;;;ACHzB,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACAlE;AAAA,EACI,iBAAAC;AAAA,EACA;AAAA,EAEA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACG;AA0PC,gBAAAC,YAAA;AA5OR,IAAM,cAAc;AAiIpB,IAAM,eAAeC,eAA+B,IAAI;AAEjD,SAAS,sBAAgC;AAC5C,QAAM,MAAMC,YAAW,YAAY;AACnC,MAAI,CAAC;AACD,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AACJ,SAAO;AACX;AAIA,SAAS,iBAAiB,MAAiC;AACvD,MAAI,EAAC,6BAAM,QAAQ,QAAO;AAC1B,QAAM,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AACrD,SAAO,UAAU,cAAc,KAAK,CAAC,EAAG;AAC5C;AAGA,SAAS,0BACL,SACA,MACiC;AAlLrC;AAmLI,QAAM,YAA+C,CAAC;AACtD,QAAM,QAAO,gBAAK,WAAL,mBAAa,SAAb,YAAqB,CAAC;AACnC,QAAM,UAAS,aAAQ,SAAS,EAAE,WAAnB,YAA6B,CAAC;AAE7C,QAAM,YAAY,oBAAI,IAAsB;AAC5C,aAAW,KAAK,QAAQ;AACpB,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,OAAM,eAAU,IAAI,EAAE,IAAI,MAApB,YAAyB,CAAC;AACtC,QAAI,KAAK,EAAE,EAAE;AACb,cAAU,IAAI,EAAE,MAAM,GAAG;AAAA,EAC7B;AAEA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC9C,eAAW,QAAO,eAAU,IAAI,IAAI,MAAlB,YAAuB,CAAC,GAAG;AACzC,gBAAU,GAAG,IAAI;AAAA,IACrB;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,oBACL,MACA,OACgB;AAChB,SAAO;AAAA,IACH,sBAAsB;AAAA,IACtB,YAAY,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,IAC1C,mBAAmB;AAAA,IACnB,MAAM,SAAS,QAAQ,QAAQ;AAAA,IAC/B,GAAI,wBAAS,CAAC;AAAA,EAClB;AACJ;AAEA,SAAS,cAAc,MAAqC;AArN5D;AAsNI,QAAM,QAAuB,UAAK,SAAL,YAAa;AAC1C,QAAM,sBAAsB,OAAO,UAAS,UAAK,wBAAL,YAA4B,CAAC,IACnE,QAAO,UAAK,wBAAL,YAA4B,CAAC,IACpC;AACN,SAAO,EAAE,GAAG,MAAM,MAAM,oBAAoB;AAChD;AAEA,SAAS,mBACL,GACA,GACO;AACP,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AAErB,SACI,EAAE,SAAS,EAAE,QACb,EAAE,wBAAwB,EAAE,uBAC5B,EAAE,aAAa,EAAE,YACjB,EAAE,aAAa,EAAE,YACjB,EAAE,gBAAgB,EAAE,eACpB,EAAE,iBAAiB,EAAE,gBACrB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,QAAQ,EAAE,OACZ,EAAE,kBAAkB,EAAE;AAE9B;AAEA,SAAS,iBACL,GACA,GACO;AACP,SAAO,KAAK,UAAU,gBAAK,IAAI,MAAM,KAAK,UAAU,gBAAK,IAAI;AACjE;AAOA,SAAS,mBAAmB,OAIzB;AACC,QAAM,UAAU,WAAW;AAC3B,QAAM,WAAW,UAAU;AAE3B,SACI,gBAAAF,KAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,GAAG,MAAM,UAAU,QAAQ,GACtD,gBAAM,UACX;AAER;AAIO,IAAM,oBAAoB,WAG/B,SAASG,mBACP;AAAA,EACI;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,GACA,KACF;AAEE,QAAM,aAAaC,QAAuB,IAAI;AAC9C,QAAM,eAAeA,QAAyB,IAAI;AAClD,QAAM,UAAUA,QAA8B,IAAI;AAClD,QAAM,WAAWA,QAA4B,IAAI;AAGjD,QAAM,aAAaA,QAA6C,IAAI;AAGpE,QAAM,CAAC,aAAa,cAAc,IAAIC;AAAA,IAClC;AAAA,EACJ;AAGA,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA;AAAA,IAA2B,MACnE,oBAAoB,MAAM;AAAA,EAC9B;AAGA,QAAM,CAAC,EAAE,KAAK,IAAIA,UAAS,CAAC;AAC5B,QAAM,OAAO,MAAM,MAAM,CAAC,MAAM,IAAI,CAAC;AAErC,QAAM,iBAAiBC;AAAA,IACnB,CAAC,MAKK;AA3Td;AA4TY,WAAI,OAAE,SAAF,mBAAQ,QAAS,QAAO,EAAE,KAAK;AACnC,UAAI,EAAE,QAAS,QAAO,EAAE;AAExB,UAAI,EAAE,cAAc;AAChB,cAAM,IAAI,eAAc,OAAE,mBAAF,YAAoB,CAAC,CAAC;AAC9C,UAAE,KAAK,EAAE,YAAY;AACrB,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,IACX;AAAA,IACA,CAAC;AAAA,EACL;AAEA,QAAM,kBAAkBC;AAAA,IACpB,MACI,eAAe;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,IACL,CAAC,gBAAgB,aAAa,MAAM,gBAAgB,YAAY;AAAA,EACpE;AAEA,QAAM,gBAAgBA,SAA+B,MAAM;AACvD,QAAI,KAAM,QAAO,cAAc,IAAI;AACnC,QAAI,CAAC,gBAAiB,QAAO;AAC7B,WAAO,cAAc;AAAA,MACjB,UAAU,CAAC;AAAA,MACX,MAAM;AAAA,MACN,qBAAqB;AAAA,IACzB,CAAC;AAAA,EACL,GAAG,CAAC,MAAM,eAAe,CAAC;AAE1B,EAAAC,WAAU,MAAM;AACZ,WAAO,MAAM;AACT,UAAI,SAAS,QAAS,UAAS,QAAQ;AAAA,IAC3C;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBF;AAAA,IACrB,CACI,GACA,OACA,MACC;AA1Wb;AA2WY,cACI,mBAAE,SAAF,mBAAQ,cAAR,YACA,EAAE,cADF,YAEA,IAAI,UAAU,GAAG;AAAA,QACb,KAAK;AAAA,QACL,WAAW;AAAA,QACX,gBAAgB,MAAM;AAAA,MAC1B,CAAC;AAAA,IAET;AAAA,IACA,CAAC;AAAA,EACL;AAEA,QAAM,QAAQA;AAAA,IACV,MACI,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC,aAAa,WAAW,CAAC,CAAC,QAAQ;AAAA,IAChE,CAAC;AAAA,EACL;AAEA,QAAM,cAAcA,aAAY,CAAC,OAAmC;AAChE,UAAM,IAAI,WAAW;AACrB,UAAM,IAAI,aAAa;AACvB,UAAM,IAAI,QAAQ;AAElB,QAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;AAChB,YAAM,OAAO,KAAK,KAAK,EAAE,MAAM;AAC/B,YAAM,IAAI;AAAA,QACN,uCAAuC,IAAI;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,EAAE;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwBA,aAAY,CAAC,QAAmB;AAC1D,mBAAe,IAAI,WAAW,CAAC;AAC/B,WAAO,IAAI,SAAS,MAAM,eAAe,IAAI,WAAW,CAAC,CAAC;AAAA,EAC9D,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA;AAAA,IACf,CAAC,WAAsC;AAlZ/C;AAmZY,YAAM,IAAI,eAAe,MAAM;AAC/B,UAAI,CAAC,GAAG;AACJ,cAAM,IAAI;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,QAAQ,cAAc,OAAO,IAAI;AACvC,YAAM,MAAM,iBAAiB,GAAG,OAAO;AAAA,QACnC,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,MACtB,CAAC;AAED,iBAAW,UAAU;AACrB,mBAAa,UAAU;AACvB,cAAQ,UAAU;AAElB,wBAAkB,oBAAoB,MAAM,MAAM,MAAM,QAAQ,CAAC;AAGjE,UAAI,SAAS,QAAS,UAAS,QAAQ;AACvC,eAAS,UAAU,IAAI;AAAA,QAAS,MAC5B,eAAe,IAAI,WAAW,CAAC;AAAA,MACnC;AAGA,YAAM,QAAO,OAAE,SAAS,EAAE,YAAb,YAAwB,CAAC;AACtC,YAAM,eAAc,iBAAM,gBAAN,mBAAmB,cAAnB,mBAA8B;AAClD,YAAM,aAAa,MAAM,cACnB,eACC,WAAM,iBAAN,YAAsB,iBAAiB,IAAI;AAElD,UAAI,WAAY,KAAI,QAAQ,UAAU;AAAA,eAC7B,KAAK,OAAQ,KAAI,QAAQ,KAAK,CAAC,EAAG,EAAE;AAG7C,qBAAe,IAAI,WAAW,CAAC;AAG/B,YAAM,MAAM,WAAW;AAEvB,UAAI,OAAO,MAAM,aAAa;AAE1B,cAAM,UAAS,iBAAM,YAAY,WAAlB,mBAA0B,eAA1B,YAAwC,CAAC;AACxD,mBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC9C,cAAI,cAAc,KAAK,sBAAQ,CAAC,CAAC;AAAA,QACrC;AAGA,cAAM,kBAAkB;AAAA,UACpB;AAAA,UACA,MAAM;AAAA,QACV;AACA,mBAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,eAAe,GAAG;AACpD,cAAI,IAAI,KAAK,CAAsB;AAAA,QACvC;AAAA,MACJ;AAEA,WAAK;AAAA,IACT;AAAA,IACA,CAAC,gBAAgB,gBAAgB;AAAA,EACrC;AAGA,EAAAE,WAAU,MAAM;AACZ,QAAI,CAAC,mBAAmB,CAAC,cAAe;AAExC,UAAM,gBAAgB,iBAAiB,iBAAiB,eAAe;AAAA,MACnE;AAAA,MACA,WAAW;AAAA,IACf,CAAC;AAED,QACI,CAAC,MAAM,KACP,WAAW,YAAY,mBACvB,aAAa,YAAY,iBACzB,CAAC,mBAAmB,QAAQ,SAAS,aAAa,GACpD;AACE,iBAAW;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAAA,EACJ,GAAG;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,EAAAA,WAAU,MAAM;AAvfpB;AAwfQ,QAAI,CAAC,aAAc;AACnB,QAAI,CAAC,MAAM,EAAG;AAEd,UAAM,iBAAiB,WAAW;AAClC,QAAI,CAAC,kBAAkB,mBAAmB,gBAAiB;AAC3D,QAAI,CAAC,iBAAiB,eAAe,SAAS,GAAG,YAAY,GAAG;AAC5D,qBAAe,KAAK,YAAY;AAEhC,YAAM,cAAa,kBAAa,YAAb,mBAAsB;AACzC,UACI,aAAa,WACb,cACA,CAAC,eAAe,QAAQ,UAAU,GACpC;AACE,cAAM,WACF,uBAAiB,oBAAe,SAAS,EAAE,YAA1B,YAAqC,CAAC,CAAC,MAAxD,aACA,0BAAe,SAAS,EAAE,YAA1B,mBAAoC,OAApC,mBAAwC;AAC5C,YAAI,QAAS,cAAa,QAAQ,QAAQ,OAAO;AAAA,MACrD;AAEA,WAAK;AAAA,IACT;AAAA,EACJ,GAAG,CAAC,OAAO,iBAAiB,YAAY,CAAC;AAGzC,EAAAA,WAAU,MAAM;AACZ,UAAM,MAAM,aAAa;AACzB,QAAI,CAAC,IAAK;AACV,WAAO,sBAAsB,GAAG;AAAA,EACpC,GAAG,CAAC,uBAAuB,KAAK,CAAC;AAEjC,QAAM,eAAeF;AAAA,IACjB,CAAC,OAAe;AACZ,YAAM,EAAE,UAAU,IAAI,YAAY,cAAc;AAChD,gBAAU,QAAQ,EAAE;AACpB,qBAAe,EAAE;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EAChB;AAEA,QAAM,iBAAiBA,aAAY,MAAM;AAhiB7C;AAiiBQ,UAAM,MAAM,WAAW;AACvB,QAAI,CAAC,IAAK;AAEV,UAAM,IAAI,WAAW;AACrB,QAAI,CAAC,EAAG;AAER,UAAM,UAAS,OAAE,SAAS,EAAE,WAAb,YAAuB,CAAC;AACvC,eAAW,KAAK,QAAQ;AACpB,UAAI,IAAI,EAAE,IAAI,MAA8B;AAC5C,UAAI,cAAc,EAAE,IAAI,CAAC,CAAC;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA;AAAA,IAChB,CAAC,MAAqB,SAAoC;AA/iBlE;AAgjBY,YAAM,MAAM,WAAW;AACvB,UAAI,CAAC,IAAK;AAEV,YAAM,EAAE,SAAS,UAAU,IAAI,YAAY,aAAa;AAExD,YAAM,cAAa,kCAAM,eAAN,YAAoB;AAEvC,YAAM,OAAM,UAAK,cAAL,mBAAgB;AAC5B,UAAI,IAAK,WAAU,QAAQ,GAAG;AAE9B,UAAI,WAAY,gBAAe;AAE/B,YAAM,OAAM,gBAAK,WAAL,mBAAa,eAAb,YAA2B,CAAC;AACxC,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,GAAG;AACxC,YAAI,cAAc,KAAK,sBAAQ,CAAC,CAAC;AAErC,YAAM,kBAAkB,0BAA0B,SAAS,IAAI;AAC/D,iBAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,eAAe;AACjD,YAAI,IAAI,KAAK,CAAsB;AAAA,IAC3C;AAAA,IACA,CAAC,gBAAgB,WAAW;AAAA,EAChC;AAEA,QAAM,QAAQA;AAAA,IACV,CAAC,SAAiC;AAxkB1C;AAykBY,YAAM,WAAU,kCAAM,YAAN,YAAiB;AAEjC,YAAM,EAAE,SAAS,UAAU,IAAI,YAAY,OAAO;AAElD,UAAI,CAAC,SAAS;AACV,cAAM,QAAO,aAAQ,SAAS,EAAE,YAAnB,YAA8B,CAAC;AAC5C,cAAM,OAAM,sBAAiB,IAAI,MAArB,aAA0B,UAAK,CAAC,MAAN,mBAAS;AAC/C,YAAI,IAAK,WAAU,QAAQ,GAAG;AAAA,MAClC;AAEA,qBAAe;AAAA,IACnB;AAAA,IACA,CAAC,gBAAgB,WAAW;AAAA,EAChC;AAEA,QAAM,kBAAkBA;AAAA,IACpB,MAAM,YAAY,iBAAiB,EAAE,UAAU,aAAa;AAAA,IAC5D,CAAC,WAAW;AAAA,EAChB;AACA,QAAM,kBAAkBA;AAAA,IACpB,MAAM,MAAM,KAAK,YAAY,iBAAiB,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/D,CAAC,WAAW;AAAA,EAChB;AACA,QAAM,iBAAiBA;AAAA,IACnB,MAAM,YAAY,gBAAgB,EAAE,UAAU,MAAM;AAAA,IACpD,CAAC,WAAW;AAAA,EAChB;AAGA,QAAM,gBAAgBC,SAAQ,MAAM;AAChC,UAAM,IAAI,WAAW;AACrB,UAAM,IAAI,QAAQ;AAClB,QAAI,CAAC,KAAK,EAAC,uBAAG,aAAa,QAAO,CAAC;AACnC,WAAO,0BAA0B,GAAG,EAAE,WAAW;AAAA,EACrD,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,oBAAoBA,SAAQ,MAAM;AA7mB5C;AA8mBQ,UAAM,IAAI,QAAQ;AAClB,QAAI,EAAC,uBAAG,aAAa,QAAO,CAAC;AAC7B,YAAO,aAAE,YAAY,WAAd,mBAAsB,eAAtB,YAAoC,CAAC;AAAA,EAChD,GAAG,CAAC,KAAK,CAAC;AAEV;AAAA,IACI;AAAA,IACA,OAAwB;AAAA,MACpB;AAAA,MACA;AAAA,MAEA,cAAc,MAAM;AAAA,MACpB,WAAW,CAAC,OAAe,aAAa,EAAE;AAAA,MAE1C;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA,SAAS,MAAG;AAloBxB;AAkoB2B,+BAAe,kBAAa,YAAb,mBAAsB,YAAY;AAAA;AAAA,IACpE;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,SACI,gBAAAP,KAAC,YAAS,iBAAiB,UACvB,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACG,SAAS;AAAA,QACL,QAAQ;AAAA,QACR,YAAY;AAAA,MAChB;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,UAAU;AAAA,YACN,SAAS,WAAW;AAAA,YACpB,WAAW,aAAa;AAAA,YAExB;AAAA,YACA;AAAA,YAEA,MAAM,QAAQ;AAAA,YAEd;AAAA,YACA;AAAA,YAEA;AAAA,YACA;AAAA,YAEA;AAAA,YACA;AAAA,YAEA;AAAA,UACJ;AAAA,UAEC;AAAA;AAAA,MACL;AAAA;AAAA,EACJ,GACJ;AAER,CAAC;;;AC7qBM,SAAS,4BACZ,MACA,KACO;AAXX;AAYI,QAAM,WAAU,UAAK,YAAL,YAAgB;AAEhC,MAAI,UAAmB;AAEvB,MAAI,YAAY,UAAU;AACtB,QAAI,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG,WAAU,IAAI;AAAA,QAC5D,WAAU;AAAA,EACnB;AAEA,MAAI,YAAY,QAAQ;AACpB,QAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,KAAK,KAAK,EAAG,QAAO;AAC/D,QAAI;AACA,YAAM,KAAK,IAAI,SAAS,SAAS,UAAU,KAAK,IAAI;AACpD,gBAAU,GAAG,KAAK,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;AAAA,IACtD,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,UAAQ,KAAK,IAAI;AAAA,IACb,KAAK;AACD,aAAO,YAAY,KAAK;AAAA,IAC5B,KAAK;AACD,aAAO,YAAY,KAAK;AAAA,IAC5B,KAAK;AACD,aAAO,OAAO,OAAO,IAAI,OAAO,KAAK,KAAK;AAAA,IAC9C,KAAK;AACD,aAAO,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAC/C,KAAK;AACD,aAAO,OAAO,OAAO,IAAI,OAAO,KAAK,KAAK;AAAA,IAC9C,KAAK;AACD,aAAO,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAC/C,KAAK;AACD,aACI,OAAO,OAAO,KAAK,OAAO,KAAK,GAAG,KAClC,OAAO,OAAO,KAAK,OAAO,KAAK,GAAG;AAAA,IAE1C,KAAK;AACD,aAAO,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,OAAO,SAAS,OAAO;AAAA,IACrE,KAAK;AACD,aAAO,MAAM,QAAQ,KAAK,MAAM,KAAK,CAAC,KAAK,OAAO,SAAS,OAAO;AAAA,IACtE,KAAK;AACD,aAAO,CAAC,CAAC;AAAA,IACb,KAAK;AACD,aAAO,CAAC;AAAA,IACZ,KAAK;AACD,aAAO,OAAO,YAAY,YACtB,OAAO,KAAK,YAAY,WACtB,IAAI,OAAO,KAAK,UAAS,UAAK,UAAL,YAAc,EAAE,EAAE,KAAK,OAAO,IACvD;AAAA,IACV;AACI,aAAO;AAAA,EACf;AACJ;AAEO,SAAS,sBACZ,iBACA,WACA,qBACsB;AAvE1B;AAwEI,QAAM,MAA8B,CAAC;AAErC,aAAW,OAAO,iBAAiB;AAC/B,UAAM,QAAQ,UAAU,IAAI,GAAG;AAC/B,QAAI,GAAC,oCAAO,eAAP,mBAAmB,QAAQ;AAEhC,UAAM,QAAQ,oBAAoB,GAAG;AAErC,eAAW,QAAQ,MAAM,YAAY;AACjC,YAAM,KAAK,4BAA4B,MAAM,KAAK;AAClD,UAAI,CAAC,IAAI;AACL,YAAI,KAAK;AAAA,UACL,SAAS;AAAA,UACT,SAAS,KAAK,WAAW,GAAG,MAAM,KAAK;AAAA,UACvC;AAAA,QACJ,CAAC;AACD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;;;AF3EA,IAAMS,eAAc;AAsEb,SAAS,eAAmC;AAzFnD;AA0FI,QAAM,MAAM,oBAAoB;AAChC,QAAM,QAAQ,IAAI,MAAM;AAExB,QAAM,aAAaC;AAAA,IACf,CAAC,WAAsC;AACnC,UAAI,WAAW,MAAM;AAAA,IACzB;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAGA,QAAM,WAAWC,QAA4B,IAAI;AACjD,EAAAC,WAAU,MAAM;AACZ,QAAI,CAAC,MAAO;AACZ,aAAS,UAAU,IAAI,YAAY,UAAU,EAAE,QAAQ,SAAS;AAAA,EACpE,GAAG,CAAC,KAAK,KAAK,CAAC;AAKf,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,CAAC;AACxC,EAAAD,WAAU,MAAM;AACZ,QAAI,CAAC,MAAO;AACZ,UAAM,MAAM,IAAI;AAChB,QAAI,EAAC,2BAAK,UAAU;AACpB,WAAO,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EACtD,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;AAMzB,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,CAAC;AAC1C,EAAAD,WAAU,MAAM;AACZ,WAAO,IAAI,QAAQ,UAAU,MAAM,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAChE,GAAG,CAAC,IAAI,OAAO,CAAC;AAKhB,QAAM,eAAoCE,SAAQ,MAAM;AAlI5D,QAAAC;AAmIQ,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,KAAyB,IAAI,aAAa;AAChD,QAAI,GAAG,SAAS,SAAU,QAAO;AAEjC,YAAOA,MAAA,GAAG,UAAH,OAAAA,MAAY;AAAA,EACvB,GAAG,CAAC,OAAO,IAAI,WAAW,OAAO,CAAC;AAElC,QAAM,cAAcD,SAAQ,MAAM;AA9ItC,QAAAC,KAAAC,KAAAC;AA+IQ,QAAI,CAAC,MAAO,QAAO;AACnB,YAAOA,OAAAD,OAAAD,MAAA,IAAI,cAAJ,gBAAAA,IAAe,eAAf,gBAAAC,IAAA,KAAAD,SAAA,OAAAE,MAAiC,IAAI;AAAA,EAChD,GAAG,CAAC,OAAO,IAAI,WAAW,IAAI,aAAa,OAAO,CAAC;AAQnD,QAAM,sBACFH,SAAQ,MAAM;AA1JtB,QAAAC,KAAAC,KAAAC;AA2JY,UAAM,UAAUA,OAAAD,OAAAD,MAAA,IAAI,SAAQ,aAAZ,gBAAAC,IAAA,KAAAD,SAAA,OAAAE,MAA4B,CAAC;AAK7C,WAAO;AAAA,EACX,GAAG,CAAC,IAAI,SAAS,QAAQ,CAAC;AAM9B,QAAM,4BAA4BH;AAAA,IAC9B,OAAO,CAAC;AAAA,IACR,CAAC;AAAA,EACL;AAKA,QAAM,kBAAiCA,SAAQ,MAAM;AA/KzD,QAAAC,KAAAC,KAAAC;AAgLQ,QAAI,CAAC,OAAO;AACR,aAAO;AAAA,QACH,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC,WAAW,EAAE,KAAK,WAAW,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,QACrD,QAAQ,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,QACnC,UAAU;AAAA,QACV,gBAAgB,EAAE,MAAM,WAAW,mBAAmB,KAAK;AAAA,QAC3D,UAAU,CAAC;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,YAAY,CAAC;AAAA,QACb,MAAM;AAAA,UACF,iBAAgBF,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AAAA,UAClC,SAAS;AAAA,YACL,KAAK;AAAA,YACL,aAAa,CAAC;AAAA,YACd,cAAc,CAAC;AAAA,YACf,QAAQ;AAAA,cACJ,YAAY,EAAE,MAAM,eAAe,KAAK,EAAE;AAAA,cAC1C,sBAAsB;AAAA,YAC1B;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,EAAE,SAAS,MAAM,UAAU,IAAI,IAAI,YAAY,iBAAiB;AACtE,UAAM,QAAuBC,MAAA,KAAK,SAAL,OAAAA,MAAa;AAC1C,UAAM,sBAAsB,QAAOC,MAAA,KAAK,wBAAL,OAAAA,MAA4B,CAAC,KAAK;AAGrE,WAAO;AAAA,MACH,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,QACI,aAAa,oCAAeR;AAAA,QAC5B;AAAA,QACA,cAAc,UAAU,gBAAgB;AAAA,QACxC;AAAA;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL;AAAA,QACI;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ,GAAG;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAKD,QAAM,iBAAiCK,SAAQ,MAAM;AA7OzD,QAAAC,KAAAC,KAAAC,KAAA;AA8OQ,UAAM,QAAwB;AAAA,MAC1B,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO;AAAA,MACP,kBAAkB,CAAC;AAAA,IACvB;AAEA,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,EAAE,KAAK,IAAI,IAAI,YAAY,gBAAgB;AACjD,UAAM,iBACAF,MAAA,KACG,kBADH,OAAAA,OAED,CAAC,MAAW,OAAO,uBAAG,IAAI;AAE/B,UAAM,WAAW,QAAOC,MAAA,gBAAgB,aAAhB,OAAAA,MAA4B,CAAC,KAAK;AAE1D,QAAI;AACJ,QAAI,WAAW;AAEf,UAAM,eAAeC,MAAA,gBAAgB,aAAhB,OAAAA,MAA4B,CAAC;AAGlD,UAAM,SAAU,KAAa;AAK7B,eAAW,MAAM,aAAa;AAC1B,YAAM,MAAM,iCAAS;AACrB,UAAI,CAAC,IAAK;AAEV,YAAM,IAAI,OAAO,cAAc,GAAG,CAAC;AACnC,UAAI,CAAC,OAAO,SAAS,CAAC,EAAG;AAEzB,UAAI,IAAI,UAAU;AACd,mBAAW;AACX,iBAAS;AAAA,MACb;AAAA,IACJ;AAEA,UAAM,OAAO,WAAW;AAExB,UAAM,YAAgD,CAAC;AACvD,QAAI,iBAAiB;AAErB,UAAM,SAAU,qBAAwB,cAAxB,YAAqC,CAAC;AACtD,eAAW,KAAK,OAAO;AACnB,YAAM,OAAO,OAAO,uBAAG,IAAI;AAC3B,UAAI,CAAC,OAAO,SAAS,IAAI,EAAG;AAE5B,UAAI,SAAS;AACb,YAAM,OAAO,QAAO,4BAAG,SAAH,YAAW,EAAE;AAEjC,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,mBAAS;AACT;AAAA,QACJ,KAAK;AACD,mBAAS,OAAO;AAChB;AAAA,QACJ,KAAK;AACD,mBAAS,QAAQ,OAAO;AACxB;AAAA,QACJ;AACI,mBAAS;AAAA,MACjB;AAEA,UAAI,OAAO,SAAS,MAAM,KAAK,WAAW,GAAG;AACzC,0BAAkB;AAClB,kBAAU,KAAK;AAAA,UACX,QAAQ,QAAO,4BAAG,WAAH,YAAa,EAAE;AAAA,UAC9B;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,WAAW;AAAA,MACX,UAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,MACX,OAAO,OAAO;AAAA,MACd,kBAAkB;AAAA,IACtB;AAAA,EACJ,GAAG,CAAC,OAAO,KAAK,eAAe,CAAC;AAEhC,QAAM,YAAYP;AAAA,IACd,CAAC,UAAkB;AAxU3B,UAAAK,KAAAC;AAyUY,UAAI,YAAY,WAAW;AAC3B,OAAAA,OAAAD,MAAA,IAAI,cAAJ,gBAAAA,IAAe,YAAf,gBAAAC,IAAA,KAAAD,KAAyB;AACzB,UAAI,aAAa,KAAK;AAAA,IAC1B;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAMA,QAAM,eAAeL;AAAA,IACjB,CAAC,SAAiB,aAAsB;AArVhD,UAAAK,KAAAC;AAsVY,YAAM,QAAQ,8BAAY;AAC1B,OAAAA,OAAAD,MAAA,IAAI,cAAJ,gBAAAA,IAAe,WAAf,gBAAAC,IAAA,KAAAD,KAAwB;AAAA,IAC5B;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAEA,QAAM,WAAWL;AAAA,IACb,CAAC,SAAiB,UAA6B;AAE3C,UAAI,QAAQ,IAAI,SAAS,KAAK;AAAA,IAClC;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAEA,QAAM,aAAaA;AAAA,IACf,CAAC,YAAoB;AArW7B,UAAAK,KAAAC;AAsWY,UAAI,QAAQ,IAAI,SAAS,MAAS;AAClC,OAAAA,OAAAD,MAAA,IAAI,cAAJ,gBAAAA,IAAe,WAAf,gBAAAC,IAAA,KAAAD,KAAwB;AAAA,IAC5B;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAEA,QAAM,QAAQL;AAAA,IACV,CAAC,SAAiC;AAC9B,UAAI,YAAY,OAAO;AACvB,UAAI,MAAM,IAAI;AAAA,IAClB;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAEA,QAAM,cAAcA;AAAA,IAChB,CAAC,MAAqB,SAAoC;AACtD,UAAI,YAAY,aAAa;AAC7B,UAAI,YAAY,MAAM,IAAI;AAAA,IAC9B;AAAA,IACA,CAAC,GAAG;AAAA,EACR;AAMA,QAAM,gBAAgBA,aAAY,MAAiC;AAhYvE,QAAAK,KAAAC,KAAAC,KAAA;AAiYQ,UAAM,EAAE,SAAS,WAAW,KAAK,IAAI,IAAI,YAAY,eAAe;AAEpE,UAAM,QAAQ,UAAU,WAAW;AACnC,UAAM,eAAe,UAAU,gBAAgB;AAC/C,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D;AAEA,UAAM,QAAuBF,MAAA,KAAK,SAAL,OAAAA,MAAa;AAC1C,UAAM,sBAAsB,QAAOC,MAAA,KAAK,wBAAL,OAAAA,MAA4B,CAAC,KAAK;AAErE,UAAM,YAAY,IAAI,QAAQ,OAAO;AACrC,UAAM,SAAS,UAAU;AAEzB,QAAI,CAAC,UAAU,MAAO;AAEtB,UAAM,mBACF,MAAAC,MAAA,QAAQ,kBAAR,gBAAAA,IAAA,cAAwB,OAAO,kBAA/B,YACA,QACK,SAAS,EACT,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EACxC,IAAI,CAAC,MAAM,EAAE,EAAE;AAExB,UAAM,YAAY,IAAI;AAAA,MAClB,QAAQ,SAAS,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;AAAA,IAC9D;AAEA,UAAM,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,QAAI,aAAa,SAAS,GAAG;AACzB,sBAAI,SAAQ,cAAZ;AAAA;AAAA,QACI,OAAO;AAAA,UACH,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QAC9D;AAAA;AAGJ;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,QACI,aAAa;AAAA,QACb,qBAAqB;AAAA,QACrB;AAAA,QACA;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL;AAAA,QACI;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,KAAK,yBAAyB,CAAC;AAEnC,QAAM,MAAMH,SAAQ,MAAM;AA9b9B,QAAAC;AA+bQ,QAAI,CAAC,MAAO,SAAOA,MAAA,SAAS,YAAT,OAAAA,MAAqB,CAAC;AACzC,WAAO,IAAI,YAAY,KAAK,EAAE,QAAQ,SAAS;AAAA,EACnD,GAAG,CAAC,KAAK,OAAO,OAAO,CAAC;AAExB,QAAM,UAAUD,SAAQ,MAAG;AAnc/B,QAAAC;AAmckC,YAAAA,MAAA,IAAI,YAAJ,OAAAA,MAAe,CAAC;AAAA,KAAG,CAAC,GAAG,CAAC;AAEtD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA,iBAAiB,gBAAgB;AAAA,IACjC,UAAU,gBAAgB;AAAA,IAC1B,YAAY,gBAAgB;AAAA,IAE5B;AAAA,IAEA,MAAK,qBAAgB,QAAhB,YAAuB;AAAA,IAC5B,MAAK,2BAAgB,QAAhB,YAAuB,gBAAgB,QAAvC,YAA8C;AAAA,IAEnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA,gBAAgB,IAAI;AAAA,IACpB,mBAAmB,IAAI;AAAA,EAC3B;AACJ;;;ADzIY,gBAAAG,YAAA;AA3UZ,SAAS,OAAO,OAAyB;AACrC,SAAO,MAAM;AACjB;AAEA,SAAS,UAAU,OAAwC;AAxB3D;AAyBI,QAAM,KAAK,WAAc,SAAd,mBAAoB;AAC/B,SAAO,OAAO,MAAM,YAAY,EAAE,KAAK,IAAK,IAAqB;AACrE;AAMA,SAAS,QAAQ,KAA8B,MAAuB;AAClE,QAAM,QAAQ,KACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEnB,MAAI,MAAW;AACf,aAAW,KAAK,OAAO;AACnB,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,IAAI,CAAC;AAAA,EACf;AACA,SAAO;AACX;AAEA,SAAS,aAAa,KAAa,KAAuC;AACtE,QAAM,IAAI,IAAI,KAAK;AACnB,MAAI,CAAC,EAAG,QAAO;AAEf,MACK,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,KACnC,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GACtC;AACE,WAAO,EAAE,MAAM,GAAG,EAAE;AAAA,EACxB;AAEA,MAAI,MAAM,OAAQ,QAAO;AACzB,MAAI,MAAM,QAAS,QAAO;AAE1B,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,OAAO,MAAM,CAAC,KAAK,MAAM,GAAI,QAAO;AAEzC,SAAO,QAAQ,KAAK,CAAC;AACzB;AAEA,SAAS,aAAa,SAAiB,KAAsC;AACzE,QAAM,OAAO,QAAQ,KAAK;AAE1B,QAAM,aAAa,KAAK,QAAQ,IAAI;AACpC,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAE/B,QAAM,UACF,cAAc,IACR,EAAE,KAAK,YAAY,IAAI,KAAc,IACrC,SAAS,IACP,EAAE,KAAK,OAAO,IAAI,KAAc,IAChC;AAEZ,QAAM,OAAO,UAAU,KAAK,MAAM,GAAG,QAAQ,GAAG,EAAE,KAAK,IAAI;AAC3D,QAAM,QAAQ,UAAU,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAE7D,QAAM,UAAU,QAAQ,KAAK,IAAI;AAEjC,QAAM,WAAW,CAAC,MAAe,CAAC,CAAC;AACnC,QAAM,YAAY,CAAC,MAAe,MAAM,QAAQ,MAAM;AAEtD,QAAM,kBACF,mCAAS,QAAO,OACV,UAAU,OAAO,KACjB,mCAAS,QAAO,OACd,CAAC,SAAS,OAAO,IACjB;AAEZ,QAAM,SAAS,iBAAiB,aAAa,OAAO,GAAG,IAAI;AAE3D,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,MACI,OAAO,WAAW,YAClB,OAAO,WAAW,YAClB,OAAO,WAAW,WACpB;AACE,WAAO,OAAO,MAAM;AAAA,EACxB;AAEA,MAAI;AACA,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC,QAAQ;AACJ,WAAO,OAAO,MAAM;AAAA,EACxB;AACJ;AAEA,SAAS,eAAeC,MAAa,KAAsC;AACvE,SAAOA,KAAI;AAAA,IAAQ;AAAA,IAAe,CAAC,IAAI,SACnC,aAAa,OAAO,IAAI,GAAG,GAAG;AAAA,EAClC;AACJ;AAEA,SAAS,aAAgB,OAAU,KAAiC;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO,eAAe,OAAO,GAAG;AAC/D,MAAI,MAAM,QAAQ,KAAK;AACnB,WAAO,MAAM,IAAI,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AAEhD,MAAI,SAAS,OAAO,UAAU,UAAU;AACpC,UAAM,MAAW,CAAC;AAClB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAY,GAAG;AAC/C,UAAI,CAAC,IAAI,aAAa,GAAG,GAAG;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAgBO,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,YAAY;AAChB,GAAsB;AA5JtB;AA6JI,QAAM,EAAE,SAAS,IAAI,UAAU;AAC/B,QAAM,OAAO,aAAa;AAE1B,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,UAAU,UAAU,KAAK;AAE/B,QAAM,aAAgD;AAAA,IAClD,MAAM,uBAAuB,UAAU,MAAM,OAAO;AAAA,IACpD,CAAC,MAAM,UAAU,OAAO;AAAA,EAC5B;AAEA,MAAI,CAAC,YAAY;AAEb,YAAQ,KAAK,+BAA+B,EAAE,MAAM,SAAS,MAAM,CAAC;AACpE,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,WAAW;AAC7B,QAAM,WAAW,gBAAW,YAAX,YAAsB,CAAC;AACxC,QAAM,aAAa,gBAAW,iBAAX,YAA2B,CAAC;AAK/C,QAAM,eAAeC,SAAQ,MAAM;AArLvC,QAAAC;AAsLQ,WAAO,EAAE,GAAG,WAAW,IAAIA,MAAA,MAAM,aAAN,OAAAA,MAAkB,CAAC,EAAG;AAAA,EACrD,GAAG,CAAC,WAAW,MAAM,QAAQ,CAAC;AAE9B,QAAM,aAAY,aAAQ,cAAR,YAAqB;AACvC,QAAM,cAAa,aAAQ,eAAR,YAAsB;AACzC,QAAM,aAAY,aAAQ,cAAR,YAAqB;AAEvC,QAAMC,iBACF,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS;AAG3D,QAAM,iBAAiB,MAAM,WAAW,QAAQ,CAACA;AAIjD,QAAM,KAAK,SAAS;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,UAAU,CAAC,CAAC,MAAM;AAAA,IAClB,SAAS,MAAM;AAAA,IACf,eAAc,WAAM,aAAN,mBAAgB;AAAA,IAC9B,UAAU,CAAC,CAAC;AAAA,EAChB,CAAC;AAGD,QAAM,YAAkB,eAAQ,MAAM;AA9M1C,QAAAD;AA+MQ,QAAI,CAACC,eAAe,QAAO,oBAAI,IAAY;AAC3C,WAAO,IAAI,MAAKD,MAAA,MAAM,YAAN,OAAAA,MAAiB,CAAC,GAAG,IAAI,CAAC,MAAmB,EAAE,EAAE,CAAC;AAAA,EACtE,GAAG,CAACC,gBAAe,MAAM,OAAO,CAAC;AAGjC,QAAM,kBAAwB,cAAiB,CAAC,CAAC;AACjD,EAAM,iBAAU,MAAM;AAClB,oBAAgB,UAAU,CAAC;AAAA,EAC/B,GAAG,CAAC,MAAM,EAAE,CAAC;AAEb,QAAM,aAAmB;AAAA,IACrB,OAAO,EAAE,OAAO,OAAO,KAAK,IAAI;AAAA,IAChC,CAAC,OAAO,KAAK,GAAG;AAAA,EACpB;AAEA,QAAM,eAAqB;AAAA,IACvB,CAAC,SAAkB;AA/N3B,UAAAD,KAAAE,KAAAC,KAAAC,KAAAC;AAgOY,YAAM,gBAAiB,6BAAc;AAGrC,YAAM,UACFF,OAAAD,OAAAF,MAAA,QAAQ,aAAR,gBAAAA,IAAA,cAAmB,MAAM,eAAe,gBAAxC,OAAAE,MACA,kBADA,OAAAC,MAEA;AAGJ,SAAG,SAAS,MAAM;AAGlB,UAAIF,gBAAe;AACf,YAAI,CAAC,QAAQ,oBAAoB;AAC7B,gBAAM,IAAI;AAAA,YACN,0BAA0B,MAAM,EAAE,MAAM,MAAM,IAAI;AAAA,UACtD;AAAA,QACJ;AAEA,cAAM,SAAS,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAEA,cAAM,UAAU,MAAM;AAAA,UAClB,IAAI;AAAA,aACC,0BAAU,CAAC,GACP,IAAI,MAAM,EACV,OAAO,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC;AAAA,UACzC;AAAA,QACJ;AAEA,cAAM,OAAO,gBAAgB;AAC7B,wBAAgB,UAAU;AAE1B,cAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,cAAM,UAAU,IAAI,IAAI,OAAO;AAG/B,mBAAW,MAAM,SAAS;AACtB,cAAI,CAAC,QAAQ,IAAI,EAAE,EAAG,MAAK,aAAa,MAAM,IAAI,EAAE;AAAA,QACxD;AAGA,mBAAW,MAAM,MAAM;AACnB,cAAI,CAAC,QAAQ,IAAI,EAAE,EAAG,MAAK,aAAa,MAAM,IAAI,EAAE;AAAA,QACxD;AAEA;AAAA,MACJ;AAEA,UAAI,gBAAgB;AAChB,cAAM,YACFI,OAAAD,MAAA,QAAQ,aAAR,gBAAAA,IAAA,cAAmB,QAAQ,gBAA3B,OAAAC,MAA0C,QAAQ,MAAM;AAC5D,YAAI,SAAU,MAAK,aAAa,MAAM,EAAE;AAAA,YACnC,MAAK,WAAW,MAAM,EAAE;AAAA,MACjC;AAAA,IACJ;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACAJ;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,cAAoB,eAAiC,MAAM;AAzSrE,QAAAD,KAAAE;AA0SQ,UAAM,eAAeA,OAAAF,MAAA,KAAa,SAAb,gBAAAA,IAAmB,QAAnB,OAAAE,MAA0B,CAAC;AAChD,UAAM,MACF,gBAAgB,OAAO,iBAAiB,WAClC,EAAE,GAAI,aAAqB,GAAI,aAAqB,IACnD;AAEX,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,GAAG;AAAA,MACV,OAAO,GAAG;AAAA,IACd;AAAA,EACJ,GAAG,CAAC,cAAc,OAAO,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAElD,QAAM,wBAA8B,eAAQ,MAAM;AAC9C,QAAI,CAAC,gBAAiB,QAAO;AAC7B,WAAO,aAAa,cAAqB,WAAW;AAAA,EACxD,GAAG,CAAC,cAAc,aAAa,eAAe,CAAC;AAE/C,QAAM,sBAA4B,eAAQ,MAAM;AAC5C,QAAI,CAAC;AACD,aAAQ,kCAAc,CAAC;AAC3B,WAAO,aAAc,kCAAc,CAAC,GAAW,WAAW;AAAA,EAC9D,GAAG,CAAC,YAAY,aAAa,eAAe,CAAC;AAE7C,QAAM,cACF,8CAAS,2BAAT,iCAAkC,EAAE,OAAO,OAAO,KAAK,IAAI,OAA3D,YAAiE,CAAC;AAEtE,QAAM,YAAqC;AAAA,IACvC,IAAI,MAAM;AAAA,IACV;AAAA,IACA,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG;AAAA,IAC7B,UAAU,MAAM;AAAA;AAAA,IAGhB,UAAU,MAAM;AAAA,IAEhB,GAAI,kCAAc,CAAC;AAAA;AAAA,IAEnB,OAAO,GAAG;AAAA,IAEV,GAAI,wDAAyB,CAAC;AAAA,IAC9B,GAAI,oDAAuB,CAAC;AAAA,EAChC;AAGA,YAAU,SAAS,KAAK,QAAG,UAAH,YAAY;AACpC,YAAU,UAAU,IAAI;AACxB,YAAU,SAAS,IAAI,GAAG;AAE1B,SACI,gBAAAL,KAAC,SAAI,KAAK,GAAG,KAAY,WACrB,0BAAAA,KAAC,aAAW,GAAG,WAAW,GAC9B;AAER;;;AIjWA,SAAS,kBAAkB;;;ACEpB,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA,EAIpB,cAAc;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EAEA,qBAAqB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAAA,IACN,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,IACf;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,OAAO,OAAO,MAAM;AAAA,MACjD;AAAA,IACJ;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ,CAAC;AAAA,MAET,OAAO;AAAA,QACH,iBAAiB;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QAEA,kBAAkB;AAAA,UACd,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,QACR;AAAA,QAEA,eAAe;AAAA,UACX,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO,CAAC,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,IAAI,CAAC;AAAA,QAC5D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AAAA,IACX,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ,CAAC;AAAA,MACb;AAAA,IACJ;AAAA,IAEA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,UAAU;AAAA,IACN,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,cAAc;AAAA,IACV,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,MACH,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,KAAK;AAAA,MAC9C,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,KAAK;AAAA,MAC/C,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,KAAK;AAAA,IAClD;AAAA,EACJ;AAAA,EAEA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,MACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACrD,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,MACnD,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACrD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACjD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,IACrD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AAAA,IACL,IAAI;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IACA,IAAI;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IACA,IAAI;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IACA,IAAI;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IACA,IAAI;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,EACJ;AACJ;;;ADjQO,IAAM,iBAAkC;AAAA,EAC3C,WAAW;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,EACd;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA;AAAA,IAGZ,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA;AAAA,IAG9B,GAAG,SAAS;AAAA,EAChB;AACJ;;;AE3EA,SAAS,cAAAS,mBAAkB;AAIpB,IAAM,qBAAsC;AAAA,EAC/C,WAAWC;AAAA,EACX,cAAc;AAAA,IACV,SAAS;AAAA,EACb;AAAA,EACA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IAEZ,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,qBAAqB,SAAS;AAAA,IAE9B,oBAAoB;AAAA,MAChB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,EACJ;AACJ;;;AC9CA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,kBAAmC;AAAA,EAC5C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUb;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IAEZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA;AAAA;AAAA;AAAA,IAM9B,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA,IAIA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aACI;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,UACJ,MAAM;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,OAAO;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,MAAM;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,MAAM;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aACI;AAAA,UACR;AAAA;AAAA,QAEJ;AAAA,QACA,OAAO,CAAC,QAAQ,SAAS,QAAQ,MAAM;AAAA,MAC3C;AAAA,IACJ;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACX;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACX;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,IAEA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA;AAAA,IAMA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,oBAAoB;AAAA,MAChB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,kBAAkB;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA,EAIJ;AACJ;;;AC9JA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,wBAAyC;AAAA,EAClD,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,EACb;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAMlB,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aACI;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA;AAAA,UAEJ,OAAO;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,OAAO;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,IAGA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,eAAe;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACzD;AAAA,IACJ;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,cAAc,OAAO,aAAa;AAAA,QAC3D,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,QACvD,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,EACJ;AACJ;;;ACvKA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA;AAAA,IAGN,aAAa;AAAA,IACb,cAAc;AAAA,EAClB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IACZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA;AAAA,IAG9B,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,MAC3D;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACX;AAAA,QACA,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA;AAAA,IAGA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IAEA,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA;AAAA,IAGA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACzD;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACjKA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,qBAAsC;AAAA,EAC/C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,cAAc;AAAA,IACd,YAAY;AAAA,EAChB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IACZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA;AAAA,IAG9B,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IACjB;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,eAAe;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,QACJ,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,QACJ;AAAA,QAEA,YAAY;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,UACJ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,YACb,SAAS;AAAA,YACT,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,QAEA,UAAU;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,UACJ,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,QAEA,WAAW;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,QACR;AAAA,QAEA,SAAS;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aACI;AAAA,UACJ,OAAO;AAAA,YACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,YACnD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,UACrD;AAAA,QACJ;AAAA,MACJ;AAAA,MACA,OAAO,CAAC,WAAW,aAAa,YAAY,UAAU,YAAY;AAAA,IACtE;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACvJA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,EACpB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IAEf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,eAAe,OAAO,cAAc;AAAA,QAC7D,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,QACjD,EAAE,MAAM,UAAU,OAAO,OAAO,OAAO,MAAM;AAAA,MACjD;AAAA,IACJ;AAAA,IAEA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,IAE9B,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,QACjD,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,EACJ;AACJ;;;AC1FA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA;AAAA,IAGf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,kBAAkB;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACzCA,SAAS,cAAAC,mBAAkB;AAIpB,IAAM,uBAAwC;AAAA,EACjD,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IAEV,cAAc;AAAA,IACd,qBAAqB;AAAA,EACzB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA;AAAA,IAGlB,GAAG,SAAS;AAAA;AAAA,IAGZ,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,GAAG,SAAS;AAAA,IAEZ,mBAAmB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,uBAAuB;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,EAClC;AACJ;;;ACnGA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,wBAAyC;AAAA,EAClD,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IAET,cAAc;AAAA,IACd,qBAAqB;AAAA,EACzB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA;AAAA,IAGlB,GAAG,SAAS;AAAA;AAAA,IAGZ,GAAG,SAAS;AAAA;AAAA,IAGZ,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,eAAe;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA;AAAA,IAGA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,EAClC;AACJ;;;ACzDA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IAET,cAAc;AAAA,IACd,qBAAqB;AAAA,EACzB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA;AAAA,IAGlB,GAAG,SAAS;AAAA;AAAA,IAGZ,GAAG,SAAS;AAAA;AAAA,IAGZ,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,EAClC;AACJ;;;ACzCA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,kBAAmC;AAAA,EAC5C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAMlB,GAAG,SAAS;AAAA;AAAA,IAGZ,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,EAGJ;AACJ;;;ACjCA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,qBAAsC;AAAA,EAC/C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IAET,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACA,SAAS,CAET;AAAA,EAEA,IAAI;AAAA,IACA,MAAM,SAAS;AAAA,IAEf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,eAAe,OAAO,cAAc;AAAA,QAC7D,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA;AAAA,IAGA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA,IAEA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACb;AAAA,IAEA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,UACJ,OAAO;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,OAAO;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,aAAa;AAAA,YACT,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aACI;AAAA,UACR;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,IAGA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ;AACJ;;;AC5JA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,kBAAmC;AAAA,EAC5C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,WAAW;AAAA,EACf;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IACZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA;AAAA,IAI9B,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,sBAAsB;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,EACJ;AACJ;;;AClIA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,kBAAmC;AAAA,EAC5C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,aAAa;AAAA;AAAA,IAGb,cAAc;AAAA,IACd,qBAAqB;AAAA,EACzB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IAEZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,IAE9B,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,kBAAkB;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACb;AAAA,EACJ;AACJ;;;ACjDA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,iBAAkC;AAAA,EAC3C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA;AAAA,IAGX,cAAc;AAAA,IACd,qBAAqB;AAAA,EACzB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,GAAG,SAAS;AAAA,IACZ,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,IAE9B,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,eAAe,OAAO,WAAW;AAAA,QAC1D,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,cAAc,OAAO,YAAY;AAAA,QAC1D,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA,IAGA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,kBAAkB;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ;AACJ;;;AC7GA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,qBAAsC;AAAA,EAC/C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IAET,KAAK;AAAA,IACL,KAAK;AAAA;AAAA;AAAA;AAAA,IAML,WAAW;AAAA;AAAA,IAGX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,EAChB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IAEf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,eAAe,OAAO,cAAc;AAAA,QAC7D,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,KAAK;AAAA,MACD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA;AAAA,IAGA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ;AACJ;;;ACtHA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA,IAET,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,oBAAoB;AAAA;AAAA,IAGpB,QAAQ;AAAA;AAAA,IAGR,SAAS;AAAA,IAET,gBAAgB;AAAA,EACpB;AAAA,EAEA,IAAI;AAAA;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAElB,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,QACvD,EAAE,MAAM,UAAU,OAAO,OAAO,OAAO,MAAM;AAAA,MACjD;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,MAC3D;AAAA,IACJ;AAAA,IAEA,oBAAoB;AAAA,MAChB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,MAC3D;AAAA,IACJ;AAAA,IAEA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,MACnD;AAAA,IACJ;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ;AACJ;;;AC7FA,SAAS,cAAAC,oBAAkB;AAK3B,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA,EAIb,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,MACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,MACnD,EAAE,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EAEA,kBAAkB;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACb;AAAA;AAAA,EAGA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,MACH,EAAE,MAAM,UAAU,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7C,EAAE,MAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAAA,IACnD;AAAA,EACJ;AAAA,EAEA,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,mBAAmB;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,gBAAgB;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,cAAc;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,IACJ,SAAS;AAAA,EACb;AAAA,EAEA,WAAW;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA;AAAA,EAIA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,MACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACrD,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,IACvD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAS;AAAA,EACvB,qBAAqB,SAAS;AAAA,EAC9B,MAAM,SAAS;AAAA,EACf,SAAS,SAAS;AAAA,EAClB,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,MACJ,IAAI,SAAS,QAAQ;AAAA,MACrB,IAAI,SAAS,QAAQ;AAAA,MACrB,IAAI,SAAS,QAAQ;AAAA,MACrB,IAAI,SAAS,QAAQ;AAAA,MACrB,IAAI,SAAS,QAAQ;AAAA,IACzB;AAAA,EACJ;AACJ;AAEO,IAAM,mBAAoC;AAAA,EAC7C,WAAWC;AAAA,EACX,cAAc,EAAE,SAAS,SAAS;AAAA,EAClC,IAAI;AACR;;;AC7MA,SAAS,cAAAC,oBAAkB;AAIpB,IAAM,iBAAkC;AAAA,EAC3C,WAAWC;AAAA,EAEX,cAAc;AAAA,IACV,SAAS;AAAA;AAAA;AAAA,IAGT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,QAAQ;AAAA;AAAA,EAEZ;AAAA,EAEA,IAAI;AAAA,IACA,MAAM,SAAS;AAAA;AAAA,IAGf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,QACrD,EAAE,MAAM,UAAU,OAAO,eAAe,OAAO,cAAc;AAAA,QAC7D,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,MACrD;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IAEA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,SAAS;AAAA,IACb;AAAA,IAEA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,MACJ,OAAO;AAAA,QACH,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,QACnD,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,UAAU;AAAA,MACzD;AAAA,IACJ;AAAA,IAEA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA;AAAA,IAGA,WAAW;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,iBAAiB;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACjB;AAAA,IAEA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA,IAEA,OAAO;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACI;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ;AACJ;;;ACrGA,IAAM,eAAmC;AAAA;AAAA,EAErC,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EAEA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA,EAGA,gBAAgB;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,mBAAmB;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,sBAAsB;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,mBAAmB;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,cAAc;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,QACJ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACH,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,OAAO,CAAC,SAAS,SAAS,SAAS;AAAA,IACvC;AAAA,EACJ;AAAA,EAEA,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EAEA,UAAU;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA;AAAA,EAGA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EAEA,WAAW;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACI;AAAA,EACR;AACJ;AAEA,SAAS,iBAAiB,MAAwC;AA9IlE;AA+II,SAAO;AAAA,IACH,GAAG;AAAA,IACH,SAAS;AAAA,MACL,SAAS,GAAQ;AACb,eAAO,EAAE;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,uBAAuB,EAAE,OAAO,MAAM,GAAG;AAvJrD,YAAAC,KAAA;AAwJgB,cAAM,uBAAuB;AAAA,UACzB,MAAM;AAAA,UACN,SACI;AAAA,UACJ,OAAO;AAAA,QACX;AAEA,cAAM,oBACF;AAEJ,cAAM,YAAY,CAAC,QAAU;AAlK7C,cAAAA;AAkKiD;AAAA,YAC7B,OAAO,IAAI;AAAA,YACX,SAAS,IAAI;AAAA,YACb,WAAW,GAAG,iBAAiB,KAAIA,MAAA,qBAAqB,IAAI,QAA6C,MAAtE,OAAAA,MAA2E,qBAAqB,IAAI;AAAA,UAC3I;AAAA;AAEA,cAAM,gBAAgB,CAClB,QACA,WACC;AACD,gBAAM,oBACF,OAAO,OAAO,UAAU,UACxB,OAAO,OAAO,YAAY,OAAO;AACrC,gBAAM,wBACF,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,OAAO;AACzB,gBAAM,iBACF,CAAC,CAAC,OAAO,cACT,OAAO,OAAO,UAAU,MAAM,OAAO;AAEzC,iBACI,qBACA,yBACA;AAAA,QAER;AAEA,cAAM,WAAUA,MAAA,MAAM,YAAN,OAAAA,MAAiB,CAAC;AAElC,cAAM,eAAe,QAAQ;AAAA,UAAO,CAAC,WACjC,cAAc,OAAO,MAAM;AAAA,QAC/B;AAEA,eAAO;AAAA,UACH,OAAO,MAAM;AAAA,UACb,MAAM,aAAa,IAAI,SAAS;AAAA,UAChC,UAAU,MAAM;AAAA,UAEhB,KAAI,WAAM,YAAN,mBAAe,UACb;AAAA,YACI,SAAS,MAAM,QAAQ,IAAI,CAAC,SAAS;AAEjC,oBAAM,gBAAgB,QAAQ;AAAA,gBAC1B,CAAC,WAAW,cAAc,MAAM,MAAM;AAAA,cAC1C;AAEA,qBAAO;AAAA,gBACH,GAAG;AAAA,gBACH,MAAM,cAAc,IAAI,SAAS;AAAA,cACrC;AAAA,YACJ,CAAC;AAAA,UACL,IACA,CAAC;AAAA,QACX;AAAA,MACJ;AAAA,MACA,mBAAmB,MAAM,UAAU,KAAK;AAzNpD,YAAAA,KAAA;AA0NgB,gBAAS,YAAAA,MAAA,6BAAc,WAAd,gBAAAA,IAAsB,oBAAtB,YAAyC,CAAC,MAA1C,mBAA8C;AAAA,UACnD,CAAC,SAAc,KAAK;AAAA;AAAA,MAE5B;AAAA,MAEA,SAAS,QAAQ,KAAK;AAClB,eAAO,QAAQ,MAAM;AAAA,MACzB;AAAA,IACJ;AAAA,IACA,IAAI;AAAA,MACA,GAAG;AAAA,MACH,IAAI,UAAK,OAAL,YAAW,CAAC;AAAA,IACpB;AAAA,EACJ;AACJ;AAEA,SAAS,UAAU,MAA+B;AA1OlD;AA2OI,QAAM,KAAK,UAAK,iBAAL,mBAA2B;AACtC,MAAI,CAAC,KAAK,OAAO,MAAM,UAAU;AAC7B,UAAM,IAAI;AAAA,MACN,wDAAwD,OAAO,CAAC,CAAC;AAAA,IACrE;AAAA,EACJ;AACA,SAAO;AACX;AAMO,SAAS,gBAAgB,UAA0B;AACtD,QAAM,UAA6B;AAAA,IAC/B;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,WAAS;AAAA,IACL,QAAQ,IAAI,CAAC,eAAe;AACxB,YAAM,kBAAkB,iBAAiB,UAAU;AACnD,YAAM,UAAU,UAAU,eAAe;AAEzC,aAAO;AAAA,QACH,MAAM;AAAA,QACN,YAAY;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;AC3RA,OAAOC,YAAW;;;ACAlB,OAAOC,YAAW;AAgYV,gBAAAC,YAAA;AAxSR,IAAM,wBACFC,OAAM,cAAiD,IAAI;AAExD,SAAS,uBAAuB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAgC;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAIA,OAAM;AAAA,IAClC,4CAAmB,CAAC;AAAA,EACxB;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,OAAM,SAAS,KAAK;AAEhE,QAAM,CAAC,cAAc,eAAe,IAAIA,OAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,OAAM,SAAS,KAAK;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,OAAM,SAAS,KAAK;AAElE,QAAM,CAAC,SAAS,UAAU,IAAIA,OAAM,SAAS,CAAC;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,OAAM,SAElD,gBAAgB;AAClB,QAAM,CAAC,WAAW,YAAY,IAAIA,OAAM,SAAiB,UAAU;AAEnE,EAAAA,OAAM,UAAU,MAAM;AAClB,gBAAY,4CAAmB,CAAC,CAAC;AAAA,EACrC,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,0BAA0BA,OAAM;AAAA,IAClC,MAAM,4CAAmB,CAAC;AAAA,IAC1B,CAAC,eAAe;AAAA,EACpB;AAEA,QAAM,2BAA2BA,OAAM;AAAA,IACnC,MAAG;AAnIX;AAmIc,iEAAoB,oBAApB,YAAuC,CAAC;AAAA;AAAA,IAC9C,CAAC,kBAAkB,eAAe;AAAA,EACtC;AAEA,QAAM,YAAYA,OAAM,OAA8B,IAAI;AAE1D,QAAM,cAAcA,OAAM;AAAA,IACtB,CAAC,SAMK;AAhJd;AAiJY,YAAM,gBAAe,eAAU,YAAV,mBAAmB;AAExC,gBAAU,UAAU,qBAAqB;AAAA,QACrC,YAAW,8CAAM,cAAN,YAAmB,iBAAnB,YAAmC,cAAnC,YAAgD,CAAC;AAAA,QAC5D,QAAO,kCAAM,UAAN,YAAe;AAAA,QACtB,WAAU,kCAAM,aAAN,YAAkB;AAAA,QAC5B,WAAU,kCAAM,aAAN,YAAkB;AAAA,QAC5B,WAAU,kCAAM,aAAN,YAAkB;AAAA,MAChC,CAAC;AAED,iBAAW,CAAC,MAAM,IAAI,CAAC;AAAA,IAC3B;AAAA,IACA,CAAC,WAAW,OAAO,UAAU,0BAA0B,QAAQ;AAAA,EACnE;AAEA,MAAI,CAAC,UAAU,SAAS;AACpB,cAAU,UAAU,qBAAqB;AAAA,MACrC,WAAW,gCAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,EAAAA,OAAM,UAAU,MAAM;AAClB,gBAAY;AAAA,MACR,WAAW,gCAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACJ,CAAC;AAAA,EACL,GAAG,CAAC,WAAW,OAAO,UAAU,0BAA0B,WAAW,CAAC;AAEtE,QAAM,SAAS,UAAU;AAEzB,QAAM,OAAOA,OAAM,YAAY,MAAM;AACjC,eAAW,CAAC,MAAM,IAAI,CAAC;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,OAAM,YAAY,MAAM;AAC9C,SAAK;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,QAAQA,OAAM,YAAY,MAAM;AAClC,WAAO,MAAM;AACb,sBAAkB;AAAA,EACtB,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAE9B,QAAM,MAAMA,OAAM;AAAA,IACd,CAAC,SAAS,WAAW,YAAY;AAC7B,YAAM,OAAO,OAAO,IAAI,SAAS,WAAW,OAAO;AACnD,wBAAkB;AAClB,aAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC9B;AAEA,QAAM,UAAUA,OAAM;AAAA,IAClB,CAAC,SAAS,YAAY,YAAY;AAC9B,YAAM,OAAO,OAAO,QAAQ,SAAS,YAAY,OAAO;AACxD,wBAAkB;AAClB,aAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC9B;AAEA,QAAMC,UAASD,OAAM;AAAA,IACjB,CAAC,SAAS,cAAc;AACpB,YAAM,OAAO,OAAO,OAAO,SAAS,SAAS;AAC7C,wBAAkB;AAClB,aAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC9B;AAEA,QAAM,UAAUA,OAAM;AAAA,IAClB,CAAC,SAAS,YAAY,YAAY;AAC9B,YAAM,OAAO,OAAO,QAAQ,SAAS,YAAY,OAAO;AACxD,wBAAkB;AAClB,aAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC9B;AAEA,QAAM,QAAQA,OAAM;AAAA,IAChB,CAAC,YAAY;AACT,YAAM,OAAO,OAAO,MAAM,OAAO;AACjC,wBAAkB;AAClB,aAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,iBAAiB;AAAA,EAC9B;AAEA,QAAM,eAAeA,OAAM;AAAA,IACvB,OAAO,SAA2B;AAC9B,wBAAkB,IAAI;AACtB,UAAI;AACA,cAAM,WAAW,mBACX,MAAM,iBAAiB,IAAI,IAC3B;AAEN,cAAM,gBAAgB,8BAAY;AAClC,oBAAY,aAAa;AAEzB,oBAAY;AAAA,UACR,UAAU;AAAA,UACV,WAAW,OAAO,MAAM;AAAA,QAC5B,CAAC;AAED,eAAO;AAAA,MACX,UAAE;AACE,0BAAkB,KAAK;AAAA,MAC3B;AAAA,IACJ;AAAA,IACA,CAAC,kBAAkB,aAAa,MAAM;AAAA,EAC1C;AAEA,QAAM,gBAAgBA,OAAM,YAAY,YAAY;AAChD,UAAM,OAAO,OAAO,MAAM;AAE1B,oBAAgB,IAAI;AACpB,QAAI;AACA,YAAM,WAAW,SAAS,MAAM,OAAO,IAAI,IAAI;AAC/C,UAAI,UAAU;AACV,oBAAY,EAAE,WAAW,SAAS,CAAC;AAAA,MACvC;AACA,aAAO;AAAA,IACX,UAAE;AACE,sBAAgB,KAAK;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,QAAQ,QAAQ,WAAW,CAAC;AAEhC,QAAME,qBAAoBF,OAAM,YAAY,YAAY;AACpD,UAAM,OAAO,OAAO,MAAM;AAE1B,wBAAoB,IAAI;AACxB,QAAI;AACA,UAAI,YAAY;AACZ,cAAM,WAAW,IAAI;AAAA,MACzB;AAAA,IACJ,UAAE;AACE,0BAAoB,KAAK;AAAA,IAC7B;AAAA,EACJ,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,QAAM,cAAcA,OAAM,YAAY,YAAY;AAC9C,uBAAmB,IAAI;AACvB,QAAI;AACA,aAAO,MAAM;AACb,wBAAkB;AAElB,UAAI,SAAS;AACT,cAAM,QAAQ;AAAA,MAClB;AAAA,IACJ,UAAE;AACE,yBAAmB,KAAK;AAAA,IAC5B;AAAA,EACJ,GAAG,CAAC,QAAQ,mBAAmB,OAAO,CAAC;AAEvC,QAAM,QAAQA,OAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,CAAC,QAAQ,OAAO,CAAC;AACnE,QAAM,QAAQA,OAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEnE,QAAM,MAAMA,OAAM;AAAA,IACd,OAAO;AAAA,MACH;AAAA,MACA;AAAA,MAEA,cAAc;AAAA,MACd;AAAA,MAEA,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAElB;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA,mBAAAE;AAAA,MACA;AAAA,MAEA;AAAA,MAEA,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MAEjB;AAAA,MACA;AAAA,MACA,QAAAD;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAD;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,SACI,gBAAAF,KAAC,sBAAsB,UAAtB,EAA+B,OAAO,KAClC,UACL;AAER;AAEO,SAAS,2BAA2B;AACvC,QAAM,MAAMC,OAAM,WAAW,qBAAqB;AAClD,MAAI,CAAC,KAAK;AACN,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;;;AD1YO,SAAS,oBAAoB;AAChC,SAAO,yBAAyB;AACpC;AAEO,SAAS,iCAAiC;AAC7C,QAAM,EAAE,iBAAiB,KAAK,QAAQ,IAAI,yBAAyB;AAEnE,SAAOG,OAAM,QAAQ,MAAM;AACvB,QAAI,oBAAoB,UAAa,oBAAoB;AACrD,aAAO,CAAC;AACZ,WAAO,IAAI,eAAe;AAAA,EAC9B,GAAG,CAAC,iBAAiB,KAAK,OAAO,CAAC;AACtC;AAEO,SAAS,wBAAwB;AACpC,QAAM,EAAE,iBAAiB,QAAQ,IAAI,yBAAyB;AAE9D,SAAOA,OAAM,QAAQ,MAAM;AACvB,WAAO,OAAO,OAAO,4CAAmB,CAAC,CAAC;AAAA,EAM9C,GAAG,CAAC,iBAAiB,OAAO,CAAC;AACjC;AAEO,SAAS,yBAAyB;AACrC,QAAM,EAAE,kBAAkB,QAAQ,IAAI,yBAAyB;AAE/D,SAAOA,OAAM,QAAQ,MAAM;AACvB,WAAO,OAAO,OAAO,8CAAoB,CAAC,CAAC;AAAA,EAM/C,GAAG,CAAC,kBAAkB,OAAO,CAAC;AAClC;;;AEoBY,gBAAAC,MA2CoB,QAAAC,aA3CpB;AA5BL,SAAS,eAAe;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAU;AACN,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAA,KAAC,uBAAoB,WAAsB;AAAA;AAAA,EAC/C;AAER;AAEA,SAAS,oBAAoB,EAAE,UAAU,GAA2B;AAChE,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAAE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,kBAAkB;AAEtB,SACI,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEb,0BAAAC,MAAC,SAAI,WAAU,yCACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,SAAS;AAAA,YACT,YAAYE;AAAA,YACZ,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ;AAAA;AAAA,QACZ;AAAA,QAEA,gBAAAD,MAAC,SAAI,WAAU,uDACX;AAAA,0BAAAD,KAAC,0BAAuB;AAAA,UAExB,gBAAAC,MAAC,SAAI,WAAU,+BACX;AAAA,4BAAAD,KAAC,aAAQ,WAAU,mGACf,0BAAAC,MAAC,SAAI,WAAU,oDACX;AAAA,8BAAAA,MAAC,SACG;AAAA,gCAAAD,KAAC,QAAG,WAAU,0DACT,8BAAoB,SACf,YAAY,OAAO,eAAe,CAAC,KACnC,uBACV;AAAA,gBACA,gBAAAA,KAAC,OAAE,WAAU,iDAAgD,iEAG7D;AAAA,iBACJ;AAAA,cAEA,gBAAAC,MAAC,SAAI,WAAU,cACX;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,QAAQ,cAAc;AAAA,oBACtB,SAAS,MACL,aAAa,eAAe;AAAA,oBAEnC;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,QAAQ,cAAc;AAAA,oBACtB,SAAS,MAAM,aAAa,UAAU;AAAA,oBACzC;AAAA;AAAA,gBAED;AAAA,iBACJ;AAAA,eACJ,GACJ;AAAA,YAEC,cAAc,kBACX,gBAAAA,KAAC,8BAA2B,IAE5B,gBAAAA,KAAC,yBAAsB;AAAA,aAE/B;AAAA,UAEA,gBAAAA,KAAC,wBAAqB;AAAA,WAC1B;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;AAEA,SAAS,UAAU;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACJ,GAIG;AACC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,SACM,2BACA;AAAA,MACV,EAAE,KAAK,GAAG;AAAA,MAET;AAAA;AAAA,EACL;AAER;;;AC7KA,OAAOG,YAAW;AAwCN,gBAAAC,MAiCoB,QAAAC,aAjCpB;AArBL,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAChB,GAAU;AACN,QAAM,CAAC,WAAW,YAAY,IAAIF,OAAM,SAAS,CAAC;AAElD,QAAM,QAAQ,MAAM;AACpB,QAAM,eAAe,KAAK,KAAK,SAAS,SAAS;AACjD,QAAM,WAAW;AAEjB,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,SAAS,IAAI,QAAQ;AACtE,QAAM,MAAM,KAAK,IAAI,OAAO,QAAQ,eAAe,WAAW,CAAC;AAE/D,QAAM,UAAU,MAAM,MAAM,OAAO,GAAG;AAEtC,MAAI,UAAU,GAAG;AACb,WACI,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,OAAO,EAAE,OAAO;AAAA,QAEf;AAAA;AAAA,IACL;AAAA,EAER;AAEA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,MAChB,UAAU,CAAC,MAAM,aAAa,EAAE,cAAc,SAAS;AAAA,MAEvD,0BAAAA,KAAC,SAAI,WAAU,YAAW,OAAO,EAAE,QAAQ,QAAQ,UAAU,GACxD,kBAAQ,IAAI,CAAC,MAAM,MAAM;AAxD1C;AAyDoB,cAAM,QAAQ,QAAQ;AACtB,cAAM,MAAM,OAAO,KAAK,EAAE;AAC1B,cAAM,UAAU,SAAS,IAAI,GAAG;AAEhC,eACI,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEG,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,YAC/B,WAAU;AAAA,YACV,OAAO;AAAA,cACH,KAAK,QAAQ;AAAA,cACb,QAAQ;AAAA,YACZ;AAAA,YAEA;AAAA,8BAAAA,MAAC,SAAI,WAAU,WACX;AAAA,gCAAAA,MAAC,SAAI,WAAU,iEAAgE;AAAA;AAAA,kBACzE,OAAO,KAAK,EAAE;AAAA,kBAAE;AAAA,kBAAG;AAAA,mBACpB,UAAK,SAAL,YAAa;AAAA,mBAClB;AAAA,gBACA,gBAAAA,MAAC,SAAI,WAAU,mDACV;AAAA,6BAAK,aAAL,YAAiB;AAAA,kBACjB,OAAO,KAAK,SAAS,WAChB,cAAW,KAAK,IAAI,KACpB;AAAA,mBACV;AAAA,iBACJ;AAAA,cAEA,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL;AAAA,kBACA,UAAQ;AAAA,kBACR,WAAU;AAAA;AAAA,cACd;AAAA;AAAA;AAAA,UA3BK;AAAA,QA4BT;AAAA,MAER,CAAC,GACL;AAAA;AAAA,EACJ;AAER;;;ACjGA,OAAOE,YAAW;AAeF,gBAAAC,MASI,QAAAC,aATJ;AAZT,SAAS,uBAAuB;AAHvC;AAII,QAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,kBAAkB;AAC/D,QAAM,WAAW,sBAAsB;AAEvC,QAAM,UAAUC,OAAM;AAAA,IAClB,MAAM,SAAS,KAAK,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,OAAO,eAAe,CAAC;AAAA,IACnE,CAAC,UAAU,eAAe;AAAA,EAC9B;AAEA,SACI,gBAAAD,MAAC,WAAM,WAAU,+BACb;AAAA,oBAAAA,MAAC,aAAQ,WAAU,mGACf;AAAA,sBAAAD,KAAC,QAAG,WAAU,0DAAyD,kCAEvE;AAAA,MAEC,CAAC,UACE,gBAAAA,KAAC,OAAE,WAAU,iDAAgD,kCAE7D,IAEA,gBAAAC,MAAC,SAAI,WAAU,0BACX;AAAA,wBAAAD,KAAC,UAAO,OAAM,MAAK,OAAO,OAAO,QAAQ,EAAE,GAAG;AAAA,QAC9C,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,QAAO,aAAQ,SAAR,YAAgB;AAAA;AAAA,QAC3B;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,QAAO,aAAQ,aAAR,YAAoB;AAAA;AAAA,QAC/B;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,OACI,OAAO,QAAQ,SAAS,WAClB,OAAO,QAAQ,IAAI,IACnB;AAAA;AAAA,QAEd;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,OAAO,MAAM,UAAU,QAAQ;AAAA;AAAA,QACnC;AAAA,SACJ;AAAA,OAER;AAAA,IAEA,gBAAAC,MAAC,aAAQ,WAAU,mGACf;AAAA,sBAAAD,KAAC,QAAG,WAAU,0DAAyD,2BAEvE;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,0BACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,OACI,SAAS,uBACH,YACA;AAAA;AAAA,QAEd;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,SACI,cAAS,eAAT,mBAAqB,UAAS,eACxB,iBACA,cAAS,eAAT,mBAAqB,UAAS,eAC5B,eAAe,SAAS,WAAW,GAAG,SACtC,cAAS,eAAT,mBAAqB,UACnB,uBACA,uBAAuB,SAAS,WAAW,GAAG,SAC9C,cAAS,eAAT,mBAAqB,UACnB,gBACA,gBAAgB,SAAS,WAAW,GAAG,OACvC;AAAA;AAAA,QAEpB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,QAAO,cAAS,sBAAT,YAA8B;AAAA;AAAA,QACzC;AAAA,QACA,gBAAAA,KAAC,UAAO,OAAM,QAAO,QAAO,cAAS,SAAT,YAAiB,UAAU;AAAA,SAC3D;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,aAAQ,WAAU,mGACf;AAAA,sBAAAD,KAAC,QAAG,WAAU,0DAAyD,6BAEvE;AAAA,MAEA,gBAAAA,KAAC,SAAI,WAAU,uEACV,eAAK,UAAU,MAAM,SAAS,MAAM,CAAC,GAC1C;AAAA,OACJ;AAAA,KACJ;AAER;AAEA,SAAS,OAAO,EAAE,OAAO,MAAM,GAAqC;AAChE,SACI,gBAAAC,MAAC,SAAI,WAAU,0CACX;AAAA,oBAAAD,KAAC,UAAK,WAAU,oCAAoC,iBAAM;AAAA,IAC1D,gBAAAA,KAAC,UAAK,WAAU,+CACX,iBACL;AAAA,KACJ;AAER;;;ACzFY,SACI,OAAAG,MADJ,QAAAC,aAAA;AAVL,SAAS,qBAAqB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AACb,GAAU;AACN,SACI,gBAAAA,MAAC,SAAI,WAAU,sKACX;AAAA,oBAAAA,MAAC,SACG;AAAA,sBAAAD,KAAC,QAAG,WAAU,0DAAyD,6BAEvE;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,iDAAgD,8FAG7D;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,wBACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAU;AAAA,UAET,sBAAY,iBAAiB;AAAA;AAAA,MAClC;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAU;AAAA,UAET,uBAAa,kBAAkB;AAAA;AAAA,MACpC;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAU;AAAA,UAET,mBAAS,cAAc;AAAA;AAAA,MAC5B;AAAA,OACJ;AAAA,KACJ;AAER;;;AC3DA,OAAOE,YAAW;AAoDF,SACI,OAAAC,OADJ,QAAAC,aAAA;AAhDT,SAAS,wBAAwB;AAJxC;AAKI,QAAM,EAAE,UAAU,cAAc,eAAe,IAC3C,yBAAyB;AAE7B,QAAM,CAAC,OAAO,QAAQ,IAAIC,OAAM,SAA2B,QAAQ;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAS,KAAK;AAE9C,EAAAA,OAAM,UAAU,MAAM;AAClB,aAAS,QAAQ;AACjB,aAAS,KAAK;AACd,aAAS,IAAI;AAAA,EACjB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,UACF,KAAK,UAAU,wBAAS,CAAC,CAAC,MAAM,KAAK,UAAU,8BAAY,CAAC,CAAC;AAEjE,iBAAe,aAAa;AACxB,aAAS,IAAI;AACb,aAAS,KAAK;AAEd,QAAI;AACA,YAAM,aAAa,KAAK;AACxB,eAAS,IAAI;AAAA,IACjB,SAAS,KAAK;AACV;AAAA,QACI,eAAe,QACT,IAAI,UACJ;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAc,MAAkB;AACrC,aAAS,CAAC,UAAU;AAAA,MAChB,GAAG;AAAA,MACH,YAAY;AAAA,IAChB,EAAE;AAAA,EACN;AAEA,QAAM,cAAyB,WAAM,eAAN,YAAoB;AAAA,IAC/C,MAAM;AAAA,IACN,KAAK;AAAA,EACT;AAEA,SACI,gBAAAD,MAAC,aAAQ,WAAU,mGACf;AAAA,oBAAAA,MAAC,SAAI,WAAU,+CACX;AAAA,sBAAAA,MAAC,SACG;AAAA,wBAAAD,MAAC,QAAG,WAAU,0DAAyD,+BAEvE;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,iDAAgD,uFAG7D;AAAA,SACJ;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,WAAW;AAAA,UACtB,WAAW;AAAA,YACP;AAAA,YACA,CAAC,WAAW,iBACN,qFACA;AAAA,UACV,EAAE,KAAK,GAAG;AAAA,UAET,2BAAiB,cAAc;AAAA;AAAA,MACpC;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,aACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UAEL,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,SAAS,MACL,SAAS,CAAC,UAAU;AAAA,gBAChB,GAAG;AAAA,gBACH,sBACI,EAAC,6BAAM;AAAA,cACf,EAAE;AAAA,cAEN,WAAW;AAAA,gBACP;AAAA,gBACA,MAAM,uBACA,kHACA;AAAA,cACV,EAAE,KAAK,GAAG;AAAA,cAEV;AAAA,gCAAAD,MAAC,UACI,gBAAM,uBACD,YACA,YACV;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAW;AAAA,sBACP;AAAA,sBACA,MAAM,uBACA,iBACA;AAAA,oBACV,EAAE,KAAK,GAAG;AAAA;AAAA,gBACd;AAAA;AAAA;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UAEL,0BAAAC,MAAC,SAAI,WAAU,oCACX;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,OAAO,WAAW;AAAA,gBAClB,UAAU,CAAC,MAAM;AACb,wBAAM,OAAO,EAAE,OACV;AAEL,sBAAI,SAAS,cAAc;AACvB,kCAAc,EAAE,MAAM,aAAa,CAAC;AACpC;AAAA,kBACJ;AAEA,wBAAM,aACF,WAAW,SAAS,eACd,IACA,WAAW;AAErB,sBAAI,SAAS,eAAe;AACxB,kCAAc;AAAA,sBACV,MAAM;AAAA,sBACN,KAAK;AAAA,oBACT,CAAC;AACD;AAAA,kBACJ;AAEA,sBAAI,SAAS,cAAc;AACvB,kCAAc;AAAA,sBACV,MAAM;AAAA,sBACN,KAAK;AAAA,oBACT,CAAC;AACD;AAAA,kBACJ;AAEA,gCAAc;AAAA,oBACV,MAAM;AAAA,oBACN,KAAK;AAAA,kBACT,CAAC;AAAA,gBACL;AAAA,gBACA,WAAU;AAAA,gBAEV;AAAA,kCAAAD,MAAC,YAAO,OAAM,cAAa,wBAAU;AAAA,kBACrC,gBAAAA,MAAC,YAAO,OAAM,eAAc,yBAAW;AAAA,kBACvC,gBAAAA,MAAC,YAAO,OAAM,cAAa,wBAAU;AAAA,kBACrC,gBAAAA,MAAC,YAAO,OAAM,sBAAqB,gCAEnC;AAAA;AAAA;AAAA,YACJ;AAAA,YAEC,WAAW,SAAS,gBACjB,gBAAAC,MAAC,SAAI,WAAU,2BACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,OAAO,WAAW;AAAA,kBAClB,UAAU,CAAC,MAAM;AACb,0BAAM,MAAM,OAAO,EAAE,OAAO,SAAS,CAAC;AAEtC,kCAAc,EAAE,GAAG,YAAY,IAAI,CAAC;AAAA,kBACxC;AAAA,kBACA,WAAU;AAAA;AAAA,cACd;AAAA,cACA,gBAAAA,MAAC,UAAK,WAAU,4CAA2C,eAE3D;AAAA,eACJ;AAAA,aAER;AAAA;AAAA,MACJ;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UAEL,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACG,QAAO,WAAM,sBAAN,YAA2B;AAAA,cAClC,UAAU,CAAC,MACP,SAAS,CAAC,UAAU;AAAA,gBAChB,GAAG;AAAA,gBACH,mBAAmB,EAAE,OAAO;AAAA,cAGhC,EAAE;AAAA,cAEN,WAAU;AAAA,cAEV;AAAA,gCAAAD,MAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,gBACjC,gBAAAA,MAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA;AAAA;AAAA,UACrC;AAAA;AAAA,MACJ;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UAEL,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACG,QAAO,WAAM,SAAN,YAAc;AAAA,cACrB,UAAU,CAAC,MACP,SAAS,CAAC,UAAU;AAAA,gBAChB,GAAG;AAAA,gBACH,MAAM,EAAE,OAAO;AAAA,cACnB,EAAE;AAAA,cAEN,WAAU;AAAA,cAEV;AAAA,gCAAAD,MAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,gBAC7B,gBAAAA,MAAC,YAAO,OAAM,OAAM,iBAAG;AAAA;AAAA;AAAA,UAC3B;AAAA;AAAA,MACJ;AAAA,OACJ;AAAA,IAEC,SAAS,CAAC,QACP,gBAAAA,MAAC,SAAI,WAAU,0JAAyJ,6BAExK,IACA;AAAA,IAEH,QACG,gBAAAA,MAAC,SAAI,WAAU,8IACV,iBACL,IACA;AAAA,KACR;AAER;AAEA,SAAS,WAAW;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACJ,GAIG;AACC,SACI,gBAAAC,MAAC,SAAI,WAAU,iKACX;AAAA,oBAAAA,MAAC,SAAI,WAAU,YACX;AAAA,sBAAAD,MAAC,SAAI,WAAU,wDACV,iBACL;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,iDACV,gBACL;AAAA,OACJ;AAAA,IACA,gBAAAA,MAAC,SAAK,UAAS;AAAA,KACnB;AAER;;;AC1QA,SAAgB,WAAAG,UAAS,YAAAC,iBAAgB;AA0B7B,SACI,OAAAC,OADJ,QAAAC,aAAA;AAvBL,SAAS,yBAAyB;AACrC,QAAM,EAAE,iBAAiB,oBAAoB,IAAI,IAAI,kBAAkB;AACvE,QAAM,WAAW,sBAAsB;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AAErC,QAAM,WAAWC,SAAQ,MAAM;AAC3B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,CAAC,EAAG,QAAO;AAEf,WAAO,SAAS;AAAA,MACZ,CAAC,YAAS;AAbtB;AAcgB,sBAAO,QAAQ,EAAE,EAAE,SAAS,CAAC,KAC7B,QAAO,aAAQ,SAAR,YAAgB,EAAE,EACpB,YAAY,EACZ,SAAS,CAAC,KACf,QAAO,aAAQ,aAAR,YAAoB,EAAE,EACxB,YAAY,EACZ,SAAS,CAAC;AAAA;AAAA,IACvB;AAAA,EACJ,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SACI,gBAAAF,MAAC,WAAM,WAAU,qHACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,qDACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,0DAAyD,8BAEvE;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,iDAAgD,uEAE7D;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,oCACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACd;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,uCACV,mBAAS,IAAI,CAAC,YAAY;AA5C/C;AA6CwB,cAAM,SACF,OAAO,QAAQ,EAAE,MAAM,OAAO,eAAe;AACjD,cAAM,QAAQ,IAAI,QAAQ,EAAE,EAAE;AAE9B,eACI,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEG,MAAK;AAAA,YACL,SAAS,MAAM,mBAAmB,QAAQ,EAAE;AAAA,YAC5C,WAAW;AAAA,cACP;AAAA,cACA,SACM,mDACA;AAAA,YACV,EAAE,KAAK,GAAG;AAAA,YAEV,0BAAAC,MAAC,SAAI,WAAU,0CACX;AAAA,8BAAAA,MAAC,SAAI,WAAU,WACX;AAAA,gCAAAA,MAAC,SAAI,WAAU,mEAAkE;AAAA;AAAA,kBAC3E,OAAO,QAAQ,EAAE;AAAA,kBAAE;AAAA,kBAAG;AAAA,mBACvB,aAAQ,SAAR,YAAgB;AAAA,mBACrB;AAAA,gBACA,gBAAAA,MAAC,SAAI,WAAU,iDACV;AAAA,gCAAQ,aAAR,YAAoB;AAAA,kBACpB,OAAO,QAAQ,SAAS,WACnB,cAAW,QAAQ,IAAI,KACvB;AAAA,mBACV;AAAA,iBACJ;AAAA,cAEA,gBAAAA,MAAC,UAAK,WAAU,6IACX;AAAA;AAAA,gBAAM;AAAA,iBACX;AAAA,eACJ;AAAA;AAAA,UA3BK,OAAO,QAAQ,EAAE;AAAA,QA4B1B;AAAA,MAER,CAAC,GACL;AAAA,OACJ;AAAA,KACJ;AAER;;;ACtFA,OAAOG,aAAW;;;ACAlB,OAAOC,aAAW;AAoGF,SACI,OAAAC,OADJ,QAAAC,aAAA;AAxFT,SAAS,4BAA4B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAU;AACN,QAAM,EAAE,UAAU,QAAQ,IAAI,kBAAkB;AAChD,QAAM,mBAAmB,uBAAuB;AAEhD,QAAM,CAAC,OAAO,QAAQ,IAAIC,QAAM,SAAS,EAAE;AAC3C,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,QAAM,SAAS,IAAI;AACvE,QAAM,CAAC,UAAU,WAAW,IAAIA,QAAM,SAAsB,oBAAI,IAAI,CAAC;AACrE,QAAM,CAAC,YAAY,aAAa,IAAIA,QAAM,SAAS,KAAK;AAExD,EAAAA,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,MAAM;AACP,eAAS,EAAE;AACX,4BAAsB,IAAI;AAC1B,kBAAY,oBAAI,IAAI,CAAC;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAaA,QAAM,QAAQ,MAAM;AACnC,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,CAAC,mBAAoB,QAAO;AAChC,WAAO,IAAI,IAAI,SAAS,OAAO,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;AAAA,EAC5D,GAAG,CAAC,SAAS,oBAAoB,QAAQ,CAAC;AAE1C,QAAM,QAAQA,QAAM,QAAQ,MAAM;AAC9B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AAEnC,WAAO,iBAAiB,OAAO,CAAC,YAAY;AA3CpD;AA4CY,UACI,cAAc,UACd,OAAO,QAAQ,EAAE,MAAM,OAAO,SAAS,GACzC;AACE,eAAO;AAAA,MACX;AAEA,UAAI,cAAc,CAAC,WAAW,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAG;AACnD,eAAO;AAAA,MACX;AAEA,UAAI,CAAC,EAAG,QAAO;AAEf,aACI,OAAO,QAAQ,EAAE,EAAE,SAAS,CAAC,KAC7B,QAAO,aAAQ,SAAR,YAAgB,EAAE,EACpB,YAAY,EACZ,SAAS,CAAC,KACf,QAAO,aAAQ,aAAR,YAAoB,EAAE,EACxB,YAAY,EACZ,SAAS,CAAC;AAAA,IAEvB,CAAC;AAAA,EACL,GAAG,CAAC,kBAAkB,YAAY,OAAO,SAAS,CAAC;AAEnD,WAAS,OAAO,IAAkB;AAC9B,gBAAY,CAAC,SAAS;AAClB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,MAAM,OAAO,EAAE;AACrB,UAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,UAC7B,MAAK,IAAI,GAAG;AACjB,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,iBAAe,YAAY;AACvB,QAAI,CAAC,WAAW,SAAS,SAAS,EAAG;AAErC,kBAAc,IAAI;AAClB,QAAI;AACA,YAAM,MAAM,MACP,OAAO,CAAC,SAAS,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,EAC9C,IAAI,CAAC,SAAS,KAAK,EAAE;AAE1B,cAAQ,SAAS,GAAG;AACpB,cAAQ;AAAA,IACZ,UAAE;AACE,oBAAc,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,MAAI,CAAC,QAAQ,CAAC,QAAS,QAAO;AAE9B,SACI,gBAAAF,MAAC,SAAI,WAAU,uEACX,0BAAAC,MAAC,SAAI,WAAU,4IACX;AAAA,oBAAAA,MAAC,SAAI,WAAU,qDACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,4DAA2D,mCAEzE;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,iDAAgD,yEAG7D;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,2BACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACd;AAAA,MAEA,gBAAAC,MAAC,WAAM,WAAU,2EACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC,MACP,sBAAsB,EAAE,OAAO,OAAO;AAAA,YAE1C,WAAU;AAAA;AAAA,QACd;AAAA,QAAE;AAAA,SAEN;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,WAAU;AAAA;AAAA,MACd;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,uFACX;AAAA,sBAAAA,MAAC,SAAI,WAAU,4CACV;AAAA,iBAAS;AAAA,QAAK;AAAA,SACnB;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,cACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YACb;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,SAAS,SAAS,KAAK;AAAA,YACjC,WAAU;AAAA,YAET,uBAAa,cAAc;AAAA;AAAA,QAChC;AAAA,SACJ;AAAA,OACJ;AAAA,KACJ,GACJ;AAER;;;ACpKA,OAAOG,aAAW;AAuOF,SACI,OAAAC,OADJ,QAAAC,aAAA;AAjNT,SAAS,8BAA8B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACJ,GAAU;AACN,QAAM,EAAE,iBAAiB,cAAc,SAAS,IAAI,kBAAkB;AACtE,QAAM,gBAAgB,+BAA+B;AAErD,QAAM,CAAC,OAAO,QAAQ,IAAIC,QAAM,SAA4B,QAAQ;AACpE,QAAM,CAAC,QAAQ,SAAS,IAAIA,QAAM,SAAS,EAAE;AAE7C,QAAM,OAAOA,QAAM,QAA0B,MAAM;AAC/C,QAAI,SAAU,QAAO;AACrB,QAAI,aAAc,QAAO;AACzB,WAAO;AAAA,EACX,GAAG,CAAC,UAAU,YAAY,CAAC;AAE3B,EAAAA,QAAM,UAAU,MAAM;AAClB,QAAI,MAAM;AACN,eAAS,QAAQ;AACjB,gBAAU,EAAE;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,YAAYA,QAAM,QAAQ,MAAM;AAClC,WAAO,cAAc,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ;AAAA,EACzD,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,cAAcA,QAAM,QAAsB,MAAM;AAlD1D;AAmDQ,QAAI,oBAAoB,UAAa,oBAAoB,MAAM;AAC3D,aAAO,CAAC;AAAA,IACZ;AAEA,QAAI,SAAS,eAAc,qCAAU,aAAY;AAC7C,YAAM,MAAoB,CAAC;AAE3B,iBAAW,CAAC,IAAI,UAAU,KAAK,OAAO;AAAA,QAClC,SAAS;AAAA,MACb,GAAG;AACC,cAAM,kBAAkB,kCAAc,CAAC,GAAG;AAAA,UACtC,CAAC,cACG,OAAO,SAAS,MAAM,OAAO,eAAe;AAAA,QACpD;AAEA,YAAI,CAAC,eAAgB;AAErB,cAAM,OAAO,gBAAgB,cAAc,EAAE;AAE7C,YAAI,KAAK;AAAA,UACL;AAAA,UACA,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,WAAW;AAAA,QACf,CAAC;AAAA,MACL;AAGA,YAAM,eAAc,cAAS,cAAT,mBAAoB;AAExC,UAAI,KAAK,CAAC,GAAG,MAAM;AACf,YACI,eACA,EAAE,OAAO,eACT,EAAE,OAAO,aACX;AACE,iBAAO;AAAA,QACX;AACA,YACI,eACA,EAAE,OAAO,eACT,EAAE,OAAO,aACX;AACE,iBAAO;AAAA,QACX;AACA,eAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,MACxC,CAAC;AAED,YAAM,OAAO,oBAAI,IAAY;AAC7B,aAAO,IAAI,OAAO,CAAC,SAAS;AACxB,YAAI,KAAK,IAAI,KAAK,EAAE,EAAG,QAAO;AAC9B,aAAK,IAAI,KAAK,EAAE;AAChB,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,QAAI,SAAS,WAAW,cAAc;AAClC,YAAM,MAAoB,CAAC;AAE3B,iBAAW,QAAO,kBAAa,YAAb,YAAwB,CAAC,GAAG;AAC1C,aAAI,2BAAK,gBAAe,WAAa,2BAAK,gBAAe,MAAM;AAC3D;AAAA,QACJ;AAEA,YAAI,OAAO,IAAI,UAAU,MAAM,OAAO,eAAe,GAAG;AACpD;AAAA,QACJ;AAEA,YAAI,KAAK;AAAA,UACL,IAAI,IAAI;AAAA,UACR,MAAM;AAAA,UACN,QACI,eAAI,UAAJ,YACC,IAA2B,UAD5B,YAEA,IAAI;AAAA,UACR,WAAW,IAAI;AAAA,QACnB,CAAC;AAAA,MACL;AAEA,iBAAW,UAAS,kBAAa,WAAb,YAAuB,CAAC,GAAG;AAC3C,aACI,+BAAO,gBAAe,WACtB,+BAAO,gBAAe,QACtB,OAAO,MAAM,UAAU,MAAM,OAAO,eAAe,GACrD;AACE,cAAI,KAAK;AAAA,YACL,IAAI,MAAM;AAAA,YACV,MAAM;AAAA,YACN,QACI,iBAAM,UAAN,YACC,MAA6B,UAD9B,YAEA,MAAM;AAAA,YACV,WAAW,MAAM;AAAA,UACrB,CAAC;AAAA,QACL;AAEA,mBAAW,WAAU,WAAM,YAAN,YAAiB,CAAC,GAAG;AACtC,eACI,iCAAQ,gBAAe,WACvB,iCAAQ,gBAAe,MACzB;AACE;AAAA,UACJ;AAEA,cAAI,OAAO,OAAO,UAAU,MAAM,OAAO,eAAe,GAAG;AACvD;AAAA,UACJ;AAEA,cAAI,KAAK;AAAA,YACL,IAAI,OAAO;AAAA,YACX,MAAM;AAAA,YACN,QACI,kBAAO,UAAP,YACC,OAA8B,UAD/B,YAEA;AAAA,eACK,YAA+B,UAA/B,YACG,OAAO;AAAA,YACf;AAAA,YACJ,WAAW,OAAO;AAAA,UACtB,CAAC;AAAA,QACL;AAAA,MACJ;AAEA,YAAM,OAAO,oBAAI,IAAY;AAC7B,aAAO,IAAI,OAAO,CAAC,SAAS;AACxB,YAAI,KAAK,IAAI,KAAK,EAAE,EAAG,QAAO;AAC9B,aAAK,IAAI,KAAK,EAAE;AAChB,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,WAAO,CAAC;AAAA,EACZ,GAAG,CAAC,MAAM,UAAU,cAAc,eAAe,CAAC;AAElD,EAAAA,QAAM,UAAU,MAAM;AAClB,QAAI,aAAa,UAAU,UAAU;AACjC,eAAS,MAAM;AAAA,IACnB;AAAA,EACJ,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB,EAAAA,QAAM,UAAU,MAAM;AAClB,QAAI,UAAU,UAAU,QAAQ;AAC5B,YAAM,SAAS,YAAY,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AAC5D,UAAI,CAAC,OAAQ,WAAU,EAAE;AAAA,IAC7B;AAAA,EACJ,GAAG,CAAC,OAAO,QAAQ,WAAW,CAAC;AAE/B,WAAS,iBAAiB;AAtM9B;AAuMQ,QAAI,oBAAoB,UAAa,oBAAoB,KAAM;AAE/D,QAAI,UAAU,UAAU;AACpB;AAAA,QACI;AAAA,UACI,OAAO;AAAA,UACP,SAAS;AAAA,QACb;AAAA,QACA;AAAA,MACJ;AACA;AAAA,IACJ;AAEA,QAAI,CAAC,OAAQ;AAEb,UAAM,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACpD;AAAA,MACI;AAAA,QACI,OAAO;AAAA,QACP;AAAA,MACJ;AAAA,OACA,kCAAM,cAAN,YAAmB;AAAA,IACvB;AAAA,EACJ;AAEA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,oBAAoB,YAAY,WAAW;AAEjD,SACI,gBAAAF,MAAC,SAAI,WAAU,uEACX,0BAAAC,MAAC,SAAI,WAAU,gHACX;AAAA,oBAAAA,MAAC,SAAI,WAAU,qDACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,4DAA2D,8BAEzE;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,iDAAgD,iFAG7D;AAAA,OACJ;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,iBACX;AAAA,sBAAAA,MAAC,SAAI,WAAU,aACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,wDAAuD,mBAEtE;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,cACV;AAAA,WAAC,aACE,gBAAAA,MAAC,WAAM,WAAU,oGACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,SAAS,UAAU;AAAA,gBACnB,UAAU,MAAM,SAAS,QAAQ;AAAA,gBACjC,WAAU;AAAA;AAAA,YACd;AAAA,YACA,gBAAAC,MAAC,SACG;AAAA,8BAAAD,MAAC,SAAI,WAAU,wDAAuD,oBAEtE;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,iDAAgD,mEAG/D;AAAA,eACJ;AAAA,aACJ;AAAA,UAGJ,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,WAAW;AAAA,gBACP;AAAA,gBACA,oBACM,uEACA;AAAA,cACV,EAAE,KAAK,GAAG;AAAA,cAEV;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAS,UAAU;AAAA,oBACnB,UAAU,MAAM,SAAS,MAAM;AAAA,oBAC/B,UAAU;AAAA,oBACV,WAAU;AAAA;AAAA,gBACd;AAAA,gBACA,gBAAAC,MAAC,SACG;AAAA,kCAAAD,MAAC,SAAI,WAAU,wDAAuD,kBAEtE;AAAA,kBACA,gBAAAA,MAAC,SAAI,WAAU,iDACV,mBAAS,aACJ,iFACA,SAAS,UACP,sFACA,kFACZ;AAAA,mBACJ;AAAA;AAAA;AAAA,UACJ;AAAA,WACJ;AAAA,SACJ;AAAA,MAEC,UAAU,UACP,gBAAAC,MAAC,SAAI,WAAU,aACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,wDAAuD,qBAEtE;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,YACzC,WAAU;AAAA,YAEV;AAAA,8BAAAD,MAAC,YAAO,OAAM,IAAG,+BAAY;AAAA,cAC5B,YAAY,IAAI,CAAC,SACd,gBAAAC,MAAC,YAAqB,OAAO,KAAK,IAAI;AAAA;AAAA,gBAChC,KAAK;AAAA,gBAAK;AAAA,gBAAG,KAAK;AAAA,gBAAM;AAAA,gBACzB,OAAO,KAAK,SAAS;AAAA,mBAFb,KAAK,EAGlB,CACH;AAAA;AAAA;AAAA,QACL;AAAA,QAEC,oBACG,gBAAAD,MAAC,SAAI,WAAU,4CACV,mBAAS,aACJ,kEACA,SAAS,UACP,+DACA,2EACZ,IACA;AAAA,SACR;AAAA,OAER;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,yFACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UACb;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UACI,oBAAoB,UACnB,UAAU,UAAU,CAAC;AAAA,UAE1B,WAAU;AAAA,UACb;AAAA;AAAA,MAED;AAAA,OACJ;AAAA,KACJ,GACJ;AAER;AAEA,SAAS,gBACL,OACA,QAC4D;AAzWhE;AA0WI,MAAI,CAAC,OAAO;AACR,WAAO,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,EACzC;AAEA,QAAM,OAAM,WAAM,YAAN,mBAAe,KAAK,CAAC,MAAM,EAAE,OAAO;AAChD,MAAI,KAAK;AACL,WAAO;AAAA,MACH,MAAM;AAAA,MACN,QAAO,eAAI,UAAJ,YAAc,IAA2B,UAAzC,YAAkD,IAAI;AAAA,IACjE;AAAA,EACJ;AAEA,QAAM,SAAQ,WAAM,WAAN,mBAAc,KAAK,CAAC,MAAM,EAAE,OAAO;AACjD,MAAI,OAAO;AACP,WAAO;AAAA,MACH,MAAM;AAAA,MACN,QACI,iBAAM,UAAN,YAAgB,MAA6B,UAA7C,YAAsD,MAAM;AAAA,IACpE;AAAA,EACJ;AAEA,aAAW,cAAa,WAAM,WAAN,YAAgB,CAAC,GAAG;AACxC,UAAM,UAAS,eAAU,YAAV,mBAAmB,KAAK,CAAC,MAAM,EAAE,OAAO;AACvD,QAAI,QAAQ;AACR,aAAO;AAAA,QACH,MAAM;AAAA,QACN,QACI,kBAAO,UAAP,YACC,OAA8B,UAD/B,YAEA,QAAQ,YAA+B,UAA/B,YAAwC,OAAO,EAAE;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,EAAE,MAAM,QAAQ,OAAO,OAAO;AACzC;;;AFlVgB,SAQR,UARQ,OAAAG,OAWI,QAAAC,cAXJ;AA7CT,SAAS,6BAA6B;AACzC,QAAM,EAAE,iBAAiB,QAAAC,SAAQ,OAAO,MAAM,IAAI,kBAAkB;AAEpE,QAAM,gBAAgB,+BAA+B;AACrD,QAAM,mBAAmB,uBAAuB;AAEhD,QAAM,CAAC,qBAAqB,sBAAsB,IAAIC,QAAM,SAAS,KAAK;AAC1E,QAAM,CAAC,kBAAkB,mBAAmB,IACxCA,QAAM,SAAkC,IAAI;AAChD,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,QAAM,SAExD,MAAS;AAEX,QAAM,CAAC,wBAAwB,yBAAyB,IACpDA,QAAM,SAAS,KAAK;AAExB,QAAM,cAAcA,QAAM;AAAA,IACtB,CAAC,iBAAyD;AACtD,UAAI,aAAa,UAAU,UAAU;AACjC,eAAO;AAAA,UACH,OAAO;AAAA,UACP,SAAS,aAAa;AAAA,QAC1B;AAAA,MACJ;AAEA,aAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,aAAa;AAAA,MACzB;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EACL;AAEA,QAAM,sBAAsBA,QAAM;AAAA,IAC9B,CAAC,SAA2B,cAA6B;AACrD,0BAAoB,OAAO;AAC3B,4BAAsB,SAAS;AAC/B,6BAAuB,IAAI;AAAA,IAC/B;AAAA,IACA,CAAC;AAAA,EACL;AAEA,MAAI,oBAAoB,UAAa,oBAAoB,MAAM;AAC3D,WACI,gBAAAH,MAAC,aAAQ,WAAU,mGACf,0BAAAA,MAAC,SAAI,WAAU,sHAAqH,wDAEpI,GACJ;AAAA,EAER;AAEA,SACI,gBAAAC,OAAA,YACI;AAAA,oBAAAA,OAAC,aAAQ,WAAU,mGACf;AAAA,sBAAAA,OAAC,SAAI,WAAU,+CACX;AAAA,wBAAAA,OAAC,SACG;AAAA,0BAAAD,MAAC,QAAG,WAAU,0DAAyD,kCAEvE;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,iDAAgD,oFAG7D;AAAA,WACJ;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS,MAAM,0BAA0B,IAAI;AAAA,YAC7C,WAAU;AAAA,YACb;AAAA;AAAA,QAED;AAAA,SACJ;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,aACV,wBAAc,WAAW,IACtB,gBAAAA,MAAC,SAAI,WAAU,sHAAqH,4DAEpI,IAEA,cAAc,IAAI,CAAC,KAAK,UAAU;AA/F1D;AAgG4B,cAAM,UAAU,YAAY,GAAG;AAC/B,cAAM,aAAa,IAAI;AAEvB,eACI,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEG,WAAU;AAAA,YAEV;AAAA,8BAAAA,OAAC,SAAI,WAAU,oDACX;AAAA,gCAAAA,OAAC,SACG;AAAA,kCAAAD,MAAC,SAAI,WAAU,0DACV,cAAI,UAAU,WACT,wBACA,aAAU,IAAI,OAAO,IAC/B;AAAA,kBACA,gBAAAC,OAAC,SAAI,WAAU,iDAAgD;AAAA;AAAA,oBACjD,OAAO,IAAI,OAAO;AAAA,qBAChC;AAAA,mBACJ;AAAA,gBAEA,gBAAAA,OAAC,UAAK,WAAU,6IACX;AAAA,sBAAI;AAAA,kBACJ,IAAI,UACC,SAAM,IAAI,OAAO,KACjB;AAAA,mBACV;AAAA,iBACJ;AAAA,cAEA,gBAAAD,MAAC,SAAI,WAAU,6BACV,qBAAW,WAAW,IACnB,gBAAAA,MAAC,UAAK,WAAU,4CAA2C,uCAE3D,IAEA,WAAW,IAAI,CAAC,cAAc;AAlI1E,oBAAAI;AAmIgD,sBAAM,UAAU,MAAM,SAAS;AAAA,kBAC3B;AAAA,gBACJ,CAAC;AACD,sBAAM,WACF,QAAQ,SAAS,CAAC;AACtB,sBAAM,OAAO,WACP,sGACA;AAEN,sBAAM,UACF,iBAAiB;AAAA,kBACb,CAAC,MACG,OAAO,EAAE,EAAE,MACX,OAAO,SAAS;AAAA,gBACxB;AAEJ,uBACI,gBAAAH;AAAA,kBAAC;AAAA;AAAA,oBAEG,WAAW,sEAAsE,IAAI;AAAA,oBAErF;AAAA,sCAAAD,MAAC,UACI,oBACK,IAAI,OAAO,QAAQ,EAAE,CAAC,UAAMI,MAAA,QAAQ,SAAR,OAAAA,MAAgB,SAAS,KACrD,IAAI,OAAO,SAAS,CAAC,IAC/B;AAAA,sBACC,WACG,gBAAAJ,MAAC,UAAK,WAAU,iEACX,mBAAS,QAAQ;AAAA,wBACd;AAAA,sBACJ,GACJ,IAEA,gBAAAA,MAAC,UAAK,WAAU,iEAAgE,mBAEhF;AAAA,sBAEJ,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,MAAK;AAAA,0BACL,SAAS,MACLE;AAAA,4BACI;AAAA,4BACA;AAAA,0BACJ;AAAA,0BAEJ,WAAU;AAAA,0BACb;AAAA;AAAA,sBAED;AAAA;AAAA;AAAA,kBA9BK,OAAO,SAAS;AAAA,gBA+BzB;AAAA,cAER,CAAC,GAET;AAAA,cAEA,gBAAAD,OAAC,SAAI,WAAU,mBACX;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,SAAS,MACL;AAAA,sBACI;AAAA,sBACA,IAAI;AAAA,oBACR;AAAA,oBAEJ,WAAU;AAAA,oBACb;AAAA;AAAA,gBAED;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,SAAS,MAAM,MAAM,OAAO;AAAA,oBAC5B,WAAU;AAAA,oBACb;AAAA;AAAA,gBAED;AAAA,iBACJ;AAAA;AAAA;AAAA,UA1GK,GAAG,IAAI,KAAK,IAAI,QAAO,SAAI,YAAJ,YAAe,QAAQ,CAAC,IAAI,KAAK;AAAA,QA2GjE;AAAA,MAER,CAAC,GAET;AAAA,OACJ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,SAAS,MAAM,0BAA0B,KAAK;AAAA,QAC9C,UAAU,CAAC,SAAS,cAAc;AAC9B,oCAA0B,KAAK;AAC/B,8BAAoB,SAAS,SAAS;AAAA,QAC1C;AAAA;AAAA,IACJ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,SAAS,MAAM,uBAAuB,KAAK;AAAA,QAC3C,SAAS;AAAA,QACT,WAAW;AAAA;AAAA,IACf;AAAA,KACJ;AAER;","names":["_a","_b","cloneDeep","isButton","isServiceIdRef","cloneDeep","_a","out","role","cap","_a","_b","results","toId","_a","_b","node","_c","_d","isButton","getNode","passesRate","uniq","_a","clamp","isFiniteNumber","getCap","_a","_b","rejected","allowed","options","remove","bindIdsToArray","_a","_b","_a","clone","_b","_c","_d","_e","_f","_g","_a","cloneDeep","_a","f","isOptionBased","isButton","cloneDeep","_a","toId","_a","_b","filterServicesForVisibleGroup","_a","_a","_b","toId","cloneDeep","filterServicesForVisibleGroup","_a","field","createContext","useContext","useMemo","jsx","Ctx","createContext","useMemo","useContext","React","useMemo","useCallback","useEffect","useMemo","useRef","useState","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useContext","OrderFlowProvider","useRef","useState","useCallback","useMemo","useEffect","ROOT_TAG_ID","useCallback","useRef","useEffect","useState","useMemo","_a","_b","_c","jsx","str","useMemo","_a","isOptionBased","_b","_c","_d","_e","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","_a","React","React","jsx","React","remove","validateFallbacks","React","jsx","jsxs","validateFallbacks","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","useMemo","useState","jsx","jsxs","useState","useMemo","React","React","jsx","jsxs","React","React","jsx","jsxs","React","jsx","jsxs","remove","React","_a"]}
1
+ {"version":3,"sources":["../../src/react/canvas/events.ts","../../src/utils/retry-queue.ts","../../src/react/canvas/comments.ts","../../src/react/canvas/editor.ts","../../src/core/normalise.ts","../../src/core/validate/shared.ts","../../src/core/node-map.ts","../../src/core/visibility.ts","../../src/core/validate/steps/visibility.ts","../../src/core/validate/steps/structure.ts","../../src/core/validate/steps/identity.ts","../../src/core/validate/steps/option-maps.ts","../../src/core/validate/steps/service-vs-input.ts","../../src/core/validate/steps/utility.ts","../../src/utils/index.ts","../../src/utils/util.ts","../../src/core/validate/steps/rates.ts","../../src/core/validate/steps/constraints.ts","../../src/core/validate/steps/custom.ts","../../src/core/validate/steps/global-utility-guard.ts","../../src/core/validate/steps/unbound.ts","../../src/core/validate/steps/fallbacks.ts","../../src/core/validate/policies/collect-service-items.ts","../../src/core/validate/policies/ops.ts","../../src/core/validate/policies/apply-policies.ts","../../src/core/governance.ts","../../src/core/builder.ts","../../src/core/rate-coherence.ts","../../src/core/validate/index.ts","../../src/core/fallback.ts","../../src/core/tag-relations.ts","../../src/core/policy.ts","../../src/core/service-filter.ts","../../src/utils/prune-fallbacks.ts","../../src/utils/build-order-snapshot.ts","../../src/core/fallback-editor.ts","../../src/react/canvas/editor/editor-ids.ts","../../src/react/canvas/editor/editor-duplicate.ts","../../src/react/canvas/editor/editor-notices.ts","../../src/react/canvas/editor/editor-nodes.ts","../../src/react/canvas/editor/editor-utils.ts","../../src/react/canvas/editor/editor-constraints.ts","../../src/react/canvas/editor/editor-field-rules.ts","../../src/react/canvas/editor/editor-relations.ts","../../src/react/canvas/editor/editor-service-filter.ts","../../src/react/canvas/editor/editor-placement.ts","../../src/react/canvas/editor/editor-catalog.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/inputs/form-context.tsx","../../src/react/inputs/registry.ts","../../src/react/inputs/provider.tsx","../../src/react/inputs/wrapper.tsx","../../src/react/hooks/use-order-flow.ts","../../src/react/hooks/order-flow-provider.tsx","../../src/react/hooks/evalute-field-validation.ts","../../src/react/inputs/entries/text.tsx","../../src/react/inputs/entries/shared.ts","../../src/react/inputs/entries/textarea.tsx","../../src/react/inputs/entries/phone.tsx","../../src/react/inputs/entries/toggle-group.tsx","../../src/react/inputs/entries/number.tsx","../../src/react/inputs/entries/password.tsx","../../src/react/inputs/entries/slider.tsx","../../src/react/inputs/entries/toggle.tsx","../../src/react/inputs/entries/treeselect.tsx","../../src/react/inputs/entries/multiselect.tsx","../../src/react/inputs/entries/select.tsx","../../src/react/inputs/entries/radio.tsx","../../src/react/inputs/entries/checkbox.tsx","../../src/react/inputs/entries/chips.tsx","../../src/react/inputs/entries/color.tsx","../../src/react/inputs/entries/date.tsx","../../src/react/inputs/entries/keyvalue.tsx","../../src/react/inputs/entries/editor.tsx","../../src/react/inputs/entries/lister.tsx","../../src/react/inputs/entries/file.tsx","../../src/react/inputs/entries/index.ts","../../src/react/fallback-editor/useFallbackEditor.ts","../../src/react/fallback-editor/FallbackEditorProvider.tsx","../../src/react/fallback-editor/FallbackEditor.tsx","../../src/react/fallback-editor/VirtualServiceList.tsx","../../src/react/fallback-editor/FallbackDetailsPanel.tsx","../../src/react/fallback-editor/FallbackEditorHeader.tsx","../../src/react/fallback-editor/FallbackSettingsPanel.tsx","../../src/react/fallback-editor/FallbackServiceSidebar.tsx","../../src/react/fallback-editor/FallbackRegistrationsPanel.tsx","../../src/react/fallback-editor/FallbackAddCandidatesDialog.tsx","../../src/react/fallback-editor/FallbackAddRegistrationDialog.tsx"],"sourcesContent":["// Lightweight, typed event bus\r\nexport type EventMap = Record<string, unknown>;\r\n\r\nexport class EventBus<E extends EventMap> {\r\n private listeners = new Map<keyof E, Set<(p: any) => void>>();\r\n\r\n on<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const set = this.listeners.get(event) ?? new Set();\r\n set.add(handler as any);\r\n this.listeners.set(event, set);\r\n return () => {\r\n set.delete(handler as any);\r\n };\r\n }\r\n\r\n once<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const off = this.on(event, (p) => {\r\n off();\r\n handler(p);\r\n });\r\n return off;\r\n }\r\n\r\n emit<K extends keyof E>(event: K, payload: E[K]): void {\r\n const set = this.listeners.get(event);\r\n if (!set || set.size === 0) return;\r\n for (const h of Array.from(set)) try {\r\n (h as any)(payload);\r\n } catch { /* swallow */\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}","// noinspection JSIgnoredPromiseFromCall\r\n\r\nexport type RetryStatus = 'scheduled' | 'retrying' | 'succeeded' | 'failed' | 'cancelled';\r\n\r\nexport type RetryOptions = {\r\n enabled?: boolean; // default true\r\n maxAttempts?: number; // default 5\r\n baseDelayMs?: number; // default 800\r\n maxDelayMs?: number; // default 20_000\r\n jitter?: boolean; // default true\r\n /** Run the first attempt immediately (no initial delay) */\r\n immediateFirst?: boolean;\r\n};\r\n\r\nexport type RetryJob = {\r\n /** Stable id for de-duplication (e.g., \"comments:create_thread:loc_abc\") */\r\n id: string;\r\n /** Called on each attempt; return true to signal success, false/throw to retry */\r\n perform: (attempt: number) => Promise<boolean>;\r\n onStatus?: (status: RetryStatus, meta?: { attempt: number; nextDelayMs?: number; error?: unknown }) => void;\r\n};\r\n\r\nexport class RetryQueue {\r\n private readonly opts: Required<RetryOptions>;\r\n private jobs = new Map<string, { job: RetryJob; attempt: number; timer?: any; cancelled?: boolean }>();\r\n private paused = false;\r\n\r\n constructor(opts: RetryOptions = {}) {\r\n this.opts = {\r\n enabled: opts.enabled ?? true,\r\n maxAttempts: opts.maxAttempts ?? 5,\r\n baseDelayMs: opts.baseDelayMs ?? 800,\r\n maxDelayMs: opts.maxDelayMs ?? 20_000,\r\n jitter: opts.jitter ?? true,\r\n immediateFirst: opts.immediateFirst ?? false,\r\n };\r\n }\r\n\r\n pause() {\r\n this.paused = true;\r\n }\r\n\r\n resume() {\r\n this.paused = false;\r\n this.flush();\r\n }\r\n\r\n /** Enqueue or no-op if a job with same id already exists */\r\n enqueue(job: RetryJob): boolean {\r\n if (!this.opts.enabled) return false;\r\n if (this.jobs.has(job.id)) return false;\r\n this.jobs.set(job.id, {job, attempt: 0});\r\n job.onStatus?.('scheduled', {attempt: 0});\r\n this.kick(job.id);\r\n return true;\r\n }\r\n\r\n /** Force retry now (resets backoff); returns false if not found */\r\n triggerNow(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.timer = undefined;\r\n this.kick(id, true);\r\n return true;\r\n }\r\n\r\n cancel(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n return true;\r\n }\r\n\r\n pendingIds(): string[] {\r\n return Array.from(this.jobs.keys());\r\n }\r\n\r\n size(): number {\r\n return this.jobs.size;\r\n }\r\n\r\n isQueued(id: string): boolean {\r\n return this.jobs.has(id);\r\n }\r\n\r\n drain(): void {\r\n for (const [id, rec] of this.jobs.entries()) {\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n }\r\n }\r\n\r\n private flush() {\r\n for (const id of this.jobs.keys()) this.kick(id);\r\n }\r\n\r\n private delayFor(attempt: number): number {\r\n const {baseDelayMs, maxDelayMs, jitter} = this.opts;\r\n const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, Math.max(0, attempt - 1)));\r\n if (!jitter) return exp;\r\n const r = Math.random() * 0.4 + 0.8; // 0.8x .. 1.2x\r\n return Math.min(maxDelayMs, Math.floor(exp * r));\r\n }\r\n\r\n private async kick(id: string, immediate = false) {\r\n const rec = this.jobs.get(id);\r\n if (!rec || rec.cancelled) return;\r\n\r\n if (this.paused && !immediate) return;\r\n\r\n const attempt = rec.attempt + 1;\r\n const run = async () => {\r\n if (rec.cancelled) return;\r\n rec.job.onStatus?.('retrying', {attempt});\r\n try {\r\n const ok = await rec.job.perform(attempt);\r\n if (ok) {\r\n rec.job.onStatus?.('succeeded', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n } catch (err) {\r\n // fallthrough to schedule next\r\n rec.job.onStatus?.('failed', {attempt, error: err});\r\n }\r\n\r\n if (attempt >= this.opts.maxAttempts) {\r\n rec.job.onStatus?.('failed', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n\r\n rec.attempt = attempt;\r\n const delay = this.delayFor(attempt);\r\n rec.job.onStatus?.('scheduled', {attempt, nextDelayMs: delay});\r\n rec.timer = setTimeout(() => this.kick(id), delay);\r\n };\r\n\r\n if (immediate) await run();\r\n else {\r\n // First attempt: respect immediateFirst option; otherwise, schedule immediately\r\n const delay = this.opts.immediateFirst && attempt === 1 ? 0 : this.delayFor(attempt);\r\n\r\n if (delay) {\r\n rec.job.onStatus?.('scheduled', {attempt: 0, nextDelayMs: delay});\r\n rec.timer = setTimeout(run, delay);\r\n } else {\r\n void run();\r\n }\r\n }\r\n }\r\n}","// src/react/canvas/comments.ts\nimport type { EventBus } from \"@/react\";\nimport type { CanvasEvents } from \"@/schema/canvas-types\";\nimport type {\n CommentsBackend,\n BackendError,\n BackendScope,\n} from \"../workspace/context/backend\";\nimport {\n RetryQueue,\n type RetryOptions as RetryOpts,\n} from \"../../utils/retry-queue\";\nimport {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nlet __seq = 0;\nconst newLocalId = (p = \"loc\"): string =>\n `${p}_${Date.now().toString(36)}_${(++__seq).toString(36)}`;\n\ntype SyncState = \"pending\" | \"synced\" | \"error\";\ntype SyncThread = CommentThread & { _sync?: SyncState };\n\ntype CommentsDeps = {\n backend?: CommentsBackend<CommentThread, CommentMessage, CommentAnchor>;\n getScope?: () => BackendScope | undefined;\n retry?: RetryOpts;\n};\n\nexport class CommentsAPI {\n private threads = new Map<ThreadId, SyncThread>();\n private bus: EventBus<CanvasEvents>;\n private deps: CommentsDeps;\n private retry: RetryQueue;\n\n constructor(bus: EventBus<CanvasEvents>, deps: CommentsDeps = {}) {\n this.bus = bus;\n this.deps = deps;\n this.retry = new RetryQueue(deps.retry);\n }\n\n private scope(): BackendScope | undefined {\n return this.deps.getScope?.();\n }\n\n private emitSync(\n op: CanvasEvents[\"comment:sync\"][\"op\"],\n threadId: string,\n messageId: string | undefined,\n status: CanvasEvents[\"comment:sync\"][\"status\"],\n meta: {\n attempt: number;\n nextDelayMs?: number;\n error?: BackendError | unknown;\n },\n ): void {\n this.bus.emit(\"comment:sync\", {\n op,\n threadId,\n messageId,\n status,\n attempt: meta.attempt,\n nextDelayMs: meta.nextDelayMs,\n error: meta.error,\n });\n }\n\n /* ─── Persistence bridge ───────────────────────────── */\n\n async loadAll(): Promise<void> {\n if (!this.deps.backend) return;\n\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend.listThreads(scope);\n\n if (!res.ok) {\n this.bus.emit(\"error\", {\n message: res.error.message,\n code: res.error.code,\n meta: res.error.meta,\n });\n return;\n }\n\n this.threads.clear();\n for (const th of res.value) {\n this.threads.set(th.id, { ...(th as CommentThread), _sync: \"synced\" });\n }\n\n // signal refresh (kept as-is)\n this.bus.emit(\"comment:thread:update\", { thread: undefined as any });\n }\n\n /* ─── Query ─────────────────────────────────────────── */\n\n list(): CommentThread[] {\n return Array.from(this.threads.values())\n .sort((a, b) => a.createdAt - b.createdAt)\n .map((t) => t as CommentThread);\n }\n\n get(id: ThreadId): CommentThread | undefined {\n return this.threads.get(id) as CommentThread | undefined;\n }\n\n /* ─── Mutations (optimistic if backend present) ─────── */\n\n async create(\n anchor: CommentAnchor,\n initialBody: string,\n meta?: Record<string, unknown>,\n ): Promise<ThreadId> {\n const now = Date.now();\n const localId = newLocalId(\"t\");\n const msgId = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const local: SyncThread = {\n id: localId,\n anchor,\n resolved: false,\n createdAt: now,\n updatedAt: now,\n messages: [{ id: msgId, body: initialBody, createdAt: now }],\n meta,\n _sync: hasBackend ? \"pending\" : \"synced\",\n };\n\n this.threads.set(localId, local);\n this.bus.emit(\"comment:thread:create\", { thread: local as any });\n\n if (!this.deps.backend) return localId;\n\n const performOnce = async (): Promise<ThreadId> => {\n const scope = this.scope();\n if (!scope) return localId;\n\n const res = await this.deps.backend!.createThread(scope, {\n anchor,\n body: initialBody,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n // Swap local→server on success (kept behavior)\n this.threads.delete(localId);\n\n const serverTh: SyncThread = {\n ...(res.value as CommentThread),\n _sync: \"synced\",\n };\n\n this.threads.set(serverTh.id, serverTh);\n this.bus.emit(\"comment:thread:update\", { thread: serverTh as any });\n\n return serverTh.id;\n };\n\n try {\n const serverId = await performOnce();\n return serverId;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:create_thread:${branchKey}:${localId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"create_thread\",\n localId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n local._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Create failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: local as any });\n\n return localId;\n }\n }\n\n async reply(\n threadId: ThreadId,\n body: string,\n meta?: Record<string, unknown>,\n ): Promise<CommentId> {\n const th = this.ensure(threadId);\n const now = Date.now();\n const localMid = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const localMsg: CommentMessage = {\n id: localMid,\n body,\n createdAt: now,\n meta,\n };\n\n th.messages.push(localMsg);\n th.updatedAt = now;\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:message:create\", {\n threadId,\n message: localMsg as any,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return localMid;\n\n const performOnce = async (): Promise<CommentId> => {\n const scope = this.scope();\n if (!scope) return localMid;\n\n const res = await this.deps.backend!.addMessage(scope, {\n threadId: th.id,\n body,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n const serverMsg = res.value as CommentMessage;\n const idx = th.messages.findIndex((m) => m.id === localMid);\n if (idx >= 0) th.messages[idx] = serverMsg;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return serverMsg.id;\n };\n\n try {\n const serverMid = await performOnce();\n return serverMid;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:add_message:${branchKey}:${threadId}:${localMid}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"add_message\",\n threadId,\n localMid,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Reply failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return localMid;\n }\n }\n\n async editMessage(\n threadId: ThreadId,\n messageId: CommentId,\n body: string,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const orig = th.messages.find((m) => m.id === messageId);\n if (!orig) return;\n\n const previous = { ...orig };\n orig.body = body;\n orig.editedAt = Date.now();\n th.updatedAt = orig.editedAt;\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.editMessage(scope, {\n threadId: th.id,\n messageId,\n body,\n });\n\n if (!res.ok) throw res.error;\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = res.value as CommentMessage;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:edit_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"edit_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = previous;\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Edit failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteMessage(\n threadId: ThreadId,\n messageId: CommentId,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const backup = [...th.messages];\n\n th.messages = th.messages.filter((m) => m.id !== messageId);\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteMessage(scope, {\n threadId: th.id,\n messageId,\n });\n\n if (!res.ok) throw res.error;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.messages = backup;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async move(threadId: ThreadId, anchor: CommentAnchor): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.anchor;\n\n th.anchor = anchor;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:move\", { thread: th as any });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.moveThread(scope, {\n threadId: th.id,\n anchor,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:move_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"move_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.anchor = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Move failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async resolve(threadId: ThreadId, value = true): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.resolved;\n\n th.resolved = value;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:resolve\", { thread: th as any, resolved: value });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.resolveThread(scope, {\n threadId: th.id,\n resolved: value,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:resolve_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"resolve_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.resolved = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Resolve failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteThread(threadId: ThreadId): Promise<void> {\n const prev = this.threads.get(threadId);\n if (!prev) return;\n\n this.threads.delete(threadId);\n this.bus.emit(\"comment:thread:delete\", { threadId });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteThread(scope, { threadId });\n if (!res.ok) throw res.error;\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n // rollback deletion so user can retry\n this.threads.set(threadId, prev);\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete thread failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: prev as any });\n }\n }\n\n // Optional helpers for UI controls\n retryJob(jobId: string): boolean {\n return this.retry.triggerNow(jobId);\n }\n\n cancelJob(jobId: string): boolean {\n return this.retry.cancel(jobId);\n }\n\n pendingJobs(): string[] {\n return this.retry.pendingIds();\n }\n\n /* ─── internal ────────────────────────────────────────── */\n private ensure(threadId: ThreadId): SyncThread {\n const th = this.threads.get(threadId);\n if (!th) throw new Error(`Comment thread not found: ${threadId}`);\n return th;\n }\n}","import { cloneDeep } from \"lodash-es\";\nimport { Builder, normalise } from \"@/core\";\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n Command,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n FieldValidationRule,\n RatePolicy,\n ServiceIdRef,\n ServiceCatalogState,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport type { PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DuplicateOptions,\n EditorModuleContext,\n FieldRef,\n NodeRef,\n OptionRef,\n QuantityRule,\n ServiceCheck,\n TagRef,\n WireKind,\n} from \"./editor/editor-types\";\nimport { duplicate } from \"./editor/editor-duplicate\";\nimport { addNotice, removeNotice, updateNotice } from \"./editor/editor-notices\";\nimport {\n addField,\n addOption,\n addTag,\n editLabel,\n editName,\n getNode,\n reLabel,\n remove,\n removeField,\n removeOption,\n removeTag,\n setFieldName,\n setService,\n updateField,\n updateOption,\n updateTag,\n} from \"./editor/editor-nodes\";\nimport {\n clearConstraint,\n clearConstraintOverride,\n setConstraint,\n} from \"./editor/editor-constraints\";\nimport {\n clearFieldQuantityRule,\n clearFieldValidation,\n getFieldQuantityRule,\n getFieldValidation,\n setFieldQuantityRule,\n setFieldValidation,\n} from \"./editor/editor-field-rules\";\nimport {\n connect,\n disconnect,\n exclude,\n include,\n} from \"./editor/editor-relations\";\nimport { filterServicesForVisibleGroup } from \"./editor/editor-service-filter\";\nimport { genId, uniqueId, uniqueOptionId } from \"./editor/editor-ids\";\nimport { placeNode, placeOption } from \"./editor/editor-placement\";\nimport {\n addCatalogGroup,\n addSmartCatalogGroup,\n assignServicesToCatalogGroup,\n createEmptyCatalog,\n moveCatalogNode as moveCatalogNodeState,\n removeCatalogNode as removeCatalogNodeState,\n resolveSmartCatalogGroup,\n setActiveCatalogNode as setActiveCatalogNodeState,\n setCatalogExpanded,\n setCatalogViewMode,\n setSelectedCatalogService,\n toggleCatalogExpanded,\n toggleCatalogPinned,\n updateCatalogNode as updateCatalogNodeState,\n} from \"./editor/editor-catalog\";\n\nconst MAX_LIMIT = 100;\n\nexport type { TagRef, FieldRef, OptionRef, NodeRef, DuplicateOptions };\n\nexport class Editor {\n private readonly builder: Builder;\n private readonly api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1;\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n private catalog?: ServiceCatalogState;\n\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n ...opts,\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\n\n isOptionId(id: string) {\n return this.builder.isOptionId(id);\n }\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label);\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\");\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n return duplicate(this.moduleCtx(), ref, opts);\n }\n\n reLabel(id: string, nextLabel: string): void {\n return reLabel(this.moduleCtx(), id, nextLabel);\n }\n\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n return setFieldName(this.moduleCtx(), fieldId, nextName);\n }\n\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n return placeNode(this.moduleCtx(), id, opts);\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n return placeOption(this.moduleCtx(), optionId, opts);\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n return addOption(this.moduleCtx(), fieldId, input);\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n return updateOption(this.moduleCtx(), optionId, patch);\n }\n\n removeOption(optionId: string) {\n return removeOption(this.moduleCtx(), optionId);\n }\n\n editLabel(id: string, label: string): void {\n return editLabel(this.moduleCtx(), id, label);\n }\n\n editName(fieldId: string, name: string | undefined) {\n return editName(this.moduleCtx(), fieldId, name);\n }\n\n setService(\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n ): void {\n return setService(this.moduleCtx(), id, input);\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n return addTag(this.moduleCtx(), partial);\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n return updateTag(this.moduleCtx(), id, patch);\n }\n\n removeTag(id: string) {\n return removeTag(this.moduleCtx(), id);\n }\n\n addNotice(input: Omit<ServicePropsNotice, \"id\"> & { id?: string }): string {\n return addNotice(this.moduleCtx(), input);\n }\n\n updateNotice(id: string, patch: Partial<ServicePropsNotice>): void {\n return updateNotice(this.moduleCtx(), id, patch);\n }\n\n removeNotice(id: string): void {\n return removeNotice(this.moduleCtx(), id);\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n return addField(this.moduleCtx(), partial);\n }\n\n updateField(id: string, patch: Partial<Field>) {\n return updateField(this.moduleCtx(), id, patch);\n }\n\n removeField(id: string) {\n return removeField(this.moduleCtx(), id);\n }\n\n remove(id: string) {\n return remove(this.moduleCtx(), id);\n }\n\n getNode(id: string) {\n return getNode(this.moduleCtx(), id);\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n return getFieldQuantityRule(this.moduleCtx(), id);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n return setFieldQuantityRule(this.moduleCtx(), id, rule);\n }\n\n clearFieldQuantityRule(id: string): void {\n return clearFieldQuantityRule(this.moduleCtx(), id);\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n return include(this.moduleCtx(), receiverId, idOrIds);\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n return exclude(this.moduleCtx(), receiverId, idOrIds);\n }\n\n connect(kind: WireKind, fromId: string, toId: string): void {\n return connect(this.moduleCtx(), kind, fromId, toId);\n }\n\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n return disconnect(this.moduleCtx(), kind, fromId, toId);\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n return setConstraint(this.moduleCtx(), tagId, flag, value);\n }\n\n clearConstraintOverride(tagId: string, flag: string) {\n return clearConstraintOverride(this.moduleCtx(), tagId, flag);\n }\n\n clearConstraint(tagId: string, flag: string) {\n return clearConstraint(this.moduleCtx(), tagId, flag);\n }\n\n getFieldValidation(id: string): FieldValidationRule[] | undefined {\n return getFieldValidation(this.moduleCtx(), id);\n }\n\n setFieldValidation(id: string, rules: unknown): void {\n return setFieldValidation(this.moduleCtx(), id, rules);\n }\n\n clearFieldValidation(id: string): void {\n return clearFieldValidation(this.moduleCtx(), id);\n }\n\n getCatalog(): ServiceCatalogState | undefined {\n return cloneDeep(this.catalog);\n }\n\n setCatalog(next?: ServiceCatalogState): void {\n this.replaceCatalog(next, \"catalog:set\");\n }\n\n clearCatalog(): void {\n this.replaceCatalog(undefined, \"catalog:clear\");\n }\n\n ensureCatalog(): ServiceCatalogState {\n const next = this.catalog\n ? cloneDeep(this.catalog)\n : createEmptyCatalog();\n this.catalog = cloneDeep(next);\n return next;\n }\n\n createCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: CatalogServiceId[];\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-group\");\n return next.activeNodeId!;\n }\n\n createSmartCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addSmartCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-smart-group\");\n return next.activeNodeId!;\n }\n\n updateCatalogNode(\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n ): void {\n this.replaceCatalog(\n updateCatalogNodeState(this.catalog, id, patch),\n \"catalog:update-node\",\n );\n }\n\n removeCatalogNode(id: CatalogId, opts?: { cascade?: boolean }): void {\n this.replaceCatalog(\n removeCatalogNodeState(this.catalog, id, opts),\n \"catalog:remove-node\",\n );\n }\n\n moveCatalogNode(\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n ): void {\n this.replaceCatalog(\n moveCatalogNodeState(this.catalog, nodeId, opts),\n \"catalog:move-node\",\n );\n }\n\n assignServicesToCatalogGroup(\n nodeId: CatalogId,\n serviceIds: CatalogServiceId[],\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n ): void {\n this.replaceCatalog(\n assignServicesToCatalogGroup(\n this.catalog,\n nodeId,\n serviceIds,\n mode,\n ),\n \"catalog:assign-services\",\n );\n }\n\n setActiveCatalogNode(id?: CatalogId): void {\n const next = setActiveCatalogNodeState(this.catalog, id);\n this.catalog = cloneDeep(next);\n\n this.emit(\n \"catalog:active-change\" as any,\n {\n activeNodeId: id,\n } as any,\n );\n\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n reason: \"catalog:set-active\",\n } as any,\n );\n }\n\n setCatalogViewMode(mode: ServiceCatalogState[\"viewMode\"]): void {\n this.replaceCatalog(\n setCatalogViewMode(this.catalog, mode),\n \"catalog:set-view-mode\",\n );\n }\n\n setSelectedCatalogService(serviceId?: CatalogServiceId): void {\n this.replaceCatalog(\n setSelectedCatalogService(this.catalog, serviceId),\n \"catalog:set-selected-service\",\n );\n }\n\n toggleCatalogExpanded(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogExpanded(this.catalog, id),\n \"catalog:toggle-expanded\",\n );\n }\n\n setCatalogExpanded(id: CatalogId, expanded: boolean): void {\n this.replaceCatalog(\n setCatalogExpanded(this.catalog, id, expanded),\n \"catalog:set-expanded\",\n );\n }\n\n toggleCatalogPinned(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogPinned(this.catalog, id),\n \"catalog:toggle-pinned\",\n );\n }\n\n resolveSmartCatalogGroup(\n nodeId: CatalogId,\n candidates: CatalogServiceId[],\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n ): CatalogServiceId[] {\n const next = resolveSmartCatalogGroup(\n this.catalog,\n nodeId,\n candidates,\n matchers,\n );\n\n this.replaceCatalog(next, \"catalog:resolve-smart-group\");\n\n const node = next?.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n return node?.resolvedServiceIds?.slice() ?? [];\n }\n\n private replaceCatalog(\n next: ServiceCatalogState | undefined,\n reason = \"catalog:set\",\n ) {\n this.catalog = cloneDeep(next);\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n snapshot: this.makeSnapshot(reason),\n reason,\n } as any,\n );\n }\n private replaceProps(next: ServiceProps): void {\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return;\n const snap = this.makeSnapshot(command);\n this.pushHistory(snap);\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach) {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"validate\",\n command,\n snapshot: snap,\n });\n } else {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"mutation\",\n command,\n snapshot: snap,\n });\n }\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n snapshot: snap,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n catalog: cloneDeep(this.catalog),\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection) {\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n }\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: s.props, reason, snapshot: s });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n this.api.emit(event as any, payload as any);\n }\n\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n ratePolicy?: RatePolicy;\n fallbackSettings?: FallbackSettings;\n /** Backward-compatible alias */\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n return filterServicesForVisibleGroup(this.moduleCtx(), candidates, ctx);\n }\n\n private moduleCtx(): EditorModuleContext {\n return {\n builder: this.builder,\n api: this.api,\n opts: this.opts,\n getProps: () => this.builder.getProps(),\n isTagId: (id) => this.isTagId(id),\n isFieldId: (id) => this.isFieldId(id),\n isOptionId: (id) => this.isOptionId(id),\n transact: (label, fn) => this.transact(label, fn),\n exec: (cmd) => this.exec(cmd),\n undo: () => this.undo(),\n patchProps: (mut) => this.patchProps(mut),\n replaceProps: (next) => this.replaceProps(next),\n emit: (event, payload) => this.emit(event, payload),\n makeSnapshot: (why) => this.makeSnapshot(why),\n loadSnapshot: (s, reason) => this.loadSnapshot(s, reason),\n getNode: (id) => getNode(this.moduleCtx(), id),\n uniqueId: (base) => uniqueId(this.moduleCtx(), base),\n uniqueOptionId: (fieldId, base) =>\n uniqueOptionId(this.moduleCtx(), fieldId, base),\n genId: (prefix) => genId(this.moduleCtx(), prefix as any),\n setLastPolicyDiagnostics: (value) => {\n this._lastPolicyDiagnostics = value;\n },\n };\n }\n}\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n FieldValidationRule,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\n\nexport type NormaliseOptions = {\n /** default pricing role for fields/options when missing */\n defaultPricingRole?: PricingRole; // default: 'base',\n constraints?: string[];\n};\n\nexport function normalise(\n input: unknown,\n opts: NormaliseOptions = {},\n): ServiceProps {\n const defRole: PricingRole = opts.defaultPricingRole ?? \"base\";\n const constraints = opts.constraints ?? [\"refill\", \"cancel\", \"dripfeed\"];\n const obj = toObject(input);\n\n // ── Canonical top-level keys only\n const rawFilters = Array.isArray((obj as any).filters)\n ? (obj as any).filters\n : [];\n const rawFields = Array.isArray((obj as any).fields)\n ? (obj as any).fields\n : [];\n\n const includes_for_buttons = toStringArrayMap(\n (obj as any).includes_for_buttons,\n );\n const excludes_for_buttons = toStringArrayMap(\n (obj as any).excludes_for_buttons,\n );\n const notices = toNoticeArray((obj as any).notices);\n\n // Tags & fields\n let filters: Tag[] = rawFilters.map((t: any) => coerceTag(t, constraints));\n const fields: Field[] = rawFields.map((f: any) => coerceField(f, defRole));\n\n // ── Ensure a root tag exists (id: 't:root')\n if (!filters.some((t) => t.id === \"t:root\")) {\n filters = [{ id: \"t:root\", label: \"Root\" }, ...filters];\n }\n\n // Canonical fallbacks only\n const fallbacks = coerceFallbacks((obj as any).fallbacks);\n\n const out: ServiceProps = {\n filters,\n fields,\n order_for_tags: (obj as any).order_for_tags,\n ...(isNonEmpty(includes_for_buttons) && { includes_for_buttons }),\n ...(isNonEmpty(excludes_for_buttons) && { excludes_for_buttons }),\n ...(fallbacks &&\n (isNonEmpty(fallbacks.nodes) || isNonEmpty(fallbacks.global)) && {\n fallbacks,\n }),\n ...(notices.length > 0 && { notices }),\n schema_version:\n typeof (obj as any).schema_version === \"string\"\n ? (obj as any).schema_version\n : \"1.0\",\n };\n\n propagateConstraints(out, constraints);\n return out;\n}\n\n/* ───────────────────────── Constraint propagation ───────────────────────── */\n\n/**\n * Propagate constraint flags down the tag tree:\n * - Any flag defined on an ancestor overrides the child's local value.\n * - Writes back the effective value to each tag.constraints.\n * - Records provenance in tag.constraints_origin[flag] = <originTagId>.\n * - Records child overrides in tag.constraints_overrides[flag] = { from, to, origin }.\n *\n * IMPORTANT: Children inherit the **effective** value from their parent,\n * not the parent's raw local. This ensures overridden values keep propagating.\n */\nfunction propagateConstraints(props: ServiceProps, flagKeys: string[]): void {\n const tags = Array.isArray(props.filters) ? props.filters : [];\n if (!tags.length) return;\n\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, Tag[]>();\n\n for (const t of tags) {\n const pid = t.bind_id;\n if (!pid || !byId.has(pid)) continue;\n if (!children.has(pid)) children.set(pid, []);\n children.get(pid)!.push(t);\n }\n\n const roots = tags.filter((t) => !t.bind_id || !byId.has(t.bind_id));\n const starts = roots.length ? roots : tags;\n\n type Inherited = Partial<Record<string, { val: boolean; origin: string }>>;\n const visited = new Set<string>();\n\n const visit = (tag: Tag, inherited: Inherited) => {\n if (visited.has(tag.id)) return;\n visited.add(tag.id);\n\n // If the tag already has overrides, it means it was already normalised once.\n // We should use the 'from' value as our local baseline for this pass\n // so that we don't lose the original local intent.\n const local = cloneDeep(tag.constraints ?? {});\n if (tag.constraints_overrides) {\n for (const [k, over] of Object.entries(tag.constraints_overrides)) {\n if (over) local[k] = over.from;\n }\n }\n\n const next: Partial<Record<string, boolean>> = {};\n const origin: Partial<Record<string, string>> = {};\n const overrides: NonNullable<Tag[\"constraints_overrides\"]> = {};\n\n for (const k of flagKeys) {\n const inh = inherited[k];\n const prev = local[k];\n\n if (inh) {\n if (prev === undefined || prev === inh.val) {\n next[k] = inh.val;\n origin[k] = inh.origin;\n } else {\n next[k] = inh.val;\n origin[k] = inh.origin;\n overrides[k] = {\n from: prev as boolean,\n to: inh.val,\n origin: inh.origin,\n };\n }\n } else if (prev !== undefined) {\n next[k] = prev as boolean;\n origin[k] = tag.id;\n }\n }\n\n tag.constraints = Object.keys(next).length ? next : undefined;\n tag.constraints_origin = Object.keys(origin).length ? origin : undefined;\n tag.constraints_overrides = Object.keys(overrides).length ? overrides : undefined;\n\n const passDown: Inherited = { ...inherited };\n for (const k of flagKeys) {\n if (next[k] !== undefined && origin[k] !== undefined) {\n passDown[k] = { val: next[k] as boolean, origin: origin[k]! };\n }\n }\n for (const c of children.get(tag.id) ?? []) visit(c, passDown);\n };\n\n for (const r of starts) visit(r, {});\n}\n\n/* ───────────────────────────── coercers ───────────────────────────── */\n\nfunction coerceTag(src: any, flagKeys: string[]): Tag {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const bind_id = str(src.bind_id) || (id == \"t:root\" ? undefined : \"t:root\");\n const service_id = toServiceIdOrUndefined(src.service_id);\n\n const includes = toStringArray(src.includes);\n const excludes = toStringArray(src.excludes);\n\n let constraints: Record<string, boolean> | undefined = undefined;\n if (src.constraints && typeof src.constraints === \"object\") {\n constraints = {};\n for (const k of flagKeys) {\n const v = (src.constraints as any)[k];\n if (v !== undefined) {\n constraints[k] = bool(v)!;\n }\n }\n if (Object.keys(constraints).length === 0) {\n constraints = undefined;\n }\n }\n\n const constraints_overrides =\n src.constraints_overrides && typeof src.constraints_overrides === \"object\"\n ? (src.constraints_overrides as Tag[\"constraints_overrides\"])\n : undefined;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const tag: Tag = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(bind_id && { bind_id }),\n ...(service_id !== undefined && { service_id }),\n ...(constraints && { constraints }),\n ...(constraints_overrides && { constraints_overrides }),\n ...(includes.length && { includes: dedupe(includes) }),\n ...(excludes.length && { excludes: dedupe(excludes) }),\n ...(meta && { meta }),\n };\n return tag;\n}\nfunction coerceField(src: any, defRole: PricingRole): Field {\n if (!src || typeof src !== \"object\") src = {};\n\n const bind_id = normaliseBindId(src.bind_id);\n const type = str(src.type) || \"text\";\n const id = str(src.id);\n const name = typeof src.name === \"string\" ? src.name : undefined;\n\n // BaseFieldUI (trimmed)\n const label = str(src.label) || \"\";\n const required = !!src.required;\n\n // host-defined UI schema + defaults (pass-through if objects)\n const ui =\n src.ui && typeof src.ui === \"object\"\n ? (src.ui as Record<string, unknown>)\n : undefined;\n const defaults =\n src.defaults && typeof src.defaults === \"object\"\n ? (src.defaults as Record<string, unknown>)\n : undefined;\n\n // field-level role (used as default for options)\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : defRole;\n\n // options\n const srcHasOptions = Array.isArray(src.options) && src.options.length > 0;\n const options = srcHasOptions\n ? (src.options as any[]).map((o) => coerceOption(o, pricing_role))\n : undefined;\n\n // custom component (only for type === 'custom')\n const component =\n type === \"custom\" ? str(src.component) || undefined : undefined;\n\n // meta (pass-through)\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? { ...(src.meta as any) }\n : undefined;\n\n // button rule:\n // - option-based fields are always buttons\n // - otherwise, respect explicit boolean true\n const button: boolean = srcHasOptions ? true : src.button === true;\n const validation = normalizeFieldValidation(src.validation);\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toServiceIdOrUndefined(src.service_id);\n const field_service_id =\n button &&\n pricing_role !== \"utility\" &&\n field_service_id_raw !== undefined\n ? field_service_id_raw\n : undefined;\n\n const field: Field = {\n id,\n type,\n ...(bind_id !== undefined && { bind_id }),\n ...(name && { name }),\n ...(options && options.length && { options }),\n ...(component && { component }),\n pricing_role,\n label,\n required,\n ...(ui && { ui: ui as any }),\n ...(defaults && { defaults }),\n ...(meta && { meta }),\n ...(validation && { validation }),\n ...(button ? { button } : {}),\n ...(field_service_id !== undefined && { service_id: field_service_id }),\n };\n\n return field;\n}\n\nfunction coerceOption(src: any, inheritRole: PricingRole): FieldOption {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const service_id = toServiceIdOrUndefined(src.service_id);\n const value =\n typeof src.value === \"string\" || typeof src.value === \"number\"\n ? (src.value as string | number)\n : undefined;\n\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : inheritRole;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const option: FieldOption = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(value !== undefined && { value }),\n ...(service_id !== undefined && { service_id }),\n pricing_role,\n ...(meta && { meta }),\n };\n return option;\n}\n\n/* ───────────────────────── fallbacks (canonical only) ───────────────────────── */\n\nfunction coerceFallbacks(src: any): ServiceFallback | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n\n const out: ServiceFallback = {};\n const g = (src as any).global;\n const n = (src as any).nodes;\n\n if (g && typeof g === \"object\") {\n const rg: Record<string, ServiceIdRef[]> = {};\n for (const [k, v] of Object.entries(g)) {\n const key = String(k);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rg[key] = clean;\n }\n if (Object.keys(rg).length) out.global = rg;\n }\n\n if (n && typeof n === \"object\") {\n const rn: Record<string, ServiceIdRef[]> = {};\n for (const [nodeId, v] of Object.entries(n)) {\n const key = String(nodeId);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rn[key] = clean;\n }\n if (Object.keys(rn).length) out.nodes = rn;\n }\n\n return out.nodes || out.global ? out : undefined;\n}\n\n/* ───────────────────────── utilities ───────────────────────── */\n\nfunction toObject(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\")\n return input as Record<string, unknown>;\n throw new TypeError(\"normalise(): expected an object payload\");\n}\n\nfunction normaliseBindId(bind: unknown): string | string[] | undefined {\n if (typeof bind === \"string\" && bind.trim()) return bind.trim();\n if (Array.isArray(bind)) {\n const arr = dedupe(bind.map((b) => String(b).trim()).filter(Boolean));\n if (arr.length === 0) return undefined;\n if (arr.length === 1) return arr[0];\n return arr;\n }\n return undefined;\n}\n\nfunction toStringArrayMap(src: any): Record<string, string[]> | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!k) continue;\n const arr = toStringArray(v);\n if (arr.length) out[k] = dedupe(arr);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction toStringArray(v: any): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x)).filter((s) => !!s && s.trim().length > 0);\n}\n\nfunction toNoticeArray(v: any): ServicePropsNotice[] {\n if (!Array.isArray(v)) return [];\n return v\n .filter((item) => item && typeof item === \"object\")\n .map((item) => cloneDeep(item as ServicePropsNotice));\n}\n\nfunction toServiceIdOrUndefined(v: any): ServiceIdRef | undefined {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? v : undefined;\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n}\n\nfunction str(v: any): string | undefined {\n if (typeof v === \"string\" && v.trim().length > 0) return v.trim();\n return undefined;\n}\n\nfunction bool(v: any): boolean | undefined {\n if (v === undefined) return undefined;\n return !!v;\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nfunction isNonEmpty<T extends Record<string, any> | undefined>(\n obj: T,\n): obj is NonNullable<T> {\n return !!obj && Object.keys(obj).length > 0;\n}\n\nfunction toServiceIdArray(v: any): ServiceIdRef[] {\n if (!Array.isArray(v)) return [];\n return v\n .map((x) =>\n typeof x === \"number\" || typeof x === \"string\" ? x : String(x),\n )\n .filter(\n (x) => x !== \"\" && x !== null && x !== undefined,\n ) as ServiceIdRef[];\n}\n\n\nfunction normalizeFieldValidationRule(\n input: unknown,\n): FieldValidationRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n\n const op = v.op;\n if (\n op !== \"eq\" &&\n op !== \"neq\" &&\n op !== \"gt\" &&\n op !== \"gte\" &&\n op !== \"lt\" &&\n op !== \"lte\" &&\n op !== \"between\" &&\n op !== \"in\" &&\n op !== \"nin\" &&\n op !== \"truthy\" &&\n op !== \"falsy\" &&\n op !== \"match\"\n ) {\n return undefined;\n }\n\n const valueBy =\n v.valueBy === \"value\" || v.valueBy === \"length\" || v.valueBy === \"eval\"\n ? v.valueBy\n : undefined;\n\n const out: FieldValidationRule = {\n op,\n ...(valueBy ? { valueBy } : {}),\n };\n\n if (\"value\" in v) out.value = v.value;\n if (typeof v.min === \"number\" && Number.isFinite(v.min)) out.min = v.min;\n if (typeof v.max === \"number\" && Number.isFinite(v.max)) out.max = v.max;\n if (Array.isArray(v.values)) out.values = [...v.values];\n if (typeof v.pattern === \"string\" && v.pattern.trim()) out.pattern = v.pattern;\n if (typeof v.flags === \"string\") out.flags = v.flags;\n if (typeof v.message === \"string\" && v.message.trim()) out.message = v.message;\n\n if (valueBy === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n\n return out;\n}\n\nexport function normalizeFieldValidation(\n input: unknown,\n): FieldValidationRule[] | undefined {\n if (Array.isArray(input)) {\n const rules = input\n .map(normalizeFieldValidationRule)\n .filter(Boolean) as FieldValidationRule[];\n return rules.length ? rules : undefined;\n }\n\n const one = normalizeFieldValidationRule(input);\n return one ? [one] : undefined;\n}\n","// src/core/validate/shared.ts\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\nimport { NodeMap } from \"@/core/node-map\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly nodeMap: NodeMap;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n selectedKeys: Set<string>;\n\n readonly tags: Tag[];\n readonly fields: Field[];\n invalidRateFieldIds: Set<string>;\n\n readonly tagById: Map<string, Tag>;\n readonly fieldById: Map<string, Field>;\n\n fieldsVisibleUnder: (tagId: string) => Field[];\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function isServiceIdRef(v: unknown): v is import(\"@/schema\").ServiceIdRef {\n return (\n (typeof v === \"string\" && v.trim().length > 0) ||\n (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isServiceIdRef(o.service_id));\n}\n\nexport function isBoundTo(f: Field, tagId: string): boolean {\n const b: string | string[] | undefined = f.bind_id;\n if (!b) return false;\n return Array.isArray(b) ? b.includes(tagId) : b === tagId;\n}\n\nexport function getByPath(obj: unknown, path: string | undefined): unknown {\n if (!path) return undefined;\n\n const parts: string[] = path.split(\".\");\n let cur: any = obj;\n\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n\n return cur;\n}\n\nexport type WhereClause = NonNullable<\n NonNullable<import(\"@/schema/validation\").DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nexport function jsonStable(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nexport function eqValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n return jsonStable(a) === jsonStable(b);\n}\n\nexport function includesValue(\n arr: readonly unknown[],\n needle: unknown,\n): boolean {\n for (const v of arr) {\n if (eqValue(v, needle)) return true;\n }\n return false;\n}\n\nexport function matchesWhere(\n svc: Record<string, unknown>,\n where: readonly WhereClause[] | undefined,\n): boolean {\n if (!where || where.length === 0) return true;\n\n const root: Record<string, unknown> = { service: svc };\n\n for (const clause of where) {\n const path: string = clause.path;\n const op: string = clause.op ?? \"eq\";\n const value: unknown = clause.value;\n\n const cur: unknown = getByPath(root, path);\n\n if (op === \"exists\") {\n if (cur === undefined || cur === null) return false;\n continue;\n }\n if (op === \"truthy\") {\n if (!cur) return false;\n continue;\n }\n if (op === \"falsy\") {\n if (cur) return false;\n continue;\n }\n\n if (op === \"in\" || op === \"nin\") {\n const list: unknown[] = Array.isArray(value) ? value : [];\n const hit: boolean = includesValue(list, cur);\n if (op === \"in\" && !hit) return false;\n if (op === \"nin\" && hit) return false;\n continue;\n }\n\n if (op === \"neq\") {\n if (eqValue(cur, value)) return false;\n continue;\n }\n\n if (op === \"sw\") {\n const s: string = String(cur ?? \"\");\n const prefix: string = String(value ?? \"\");\n if (!s.startsWith(prefix)) return false;\n continue;\n }\n\n // default \"eq\"\n if (!eqValue(cur, value)) return false;\n }\n\n return true;\n}\n\nexport function serviceFlagState(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean | undefined {\n const flags: unknown = (svc as any).flags;\n const entry: unknown =\n flags && typeof flags === \"object\" ? (flags as any)[flagId] : undefined;\n\n const enabled: unknown =\n entry && typeof entry === \"object\" ? (entry as any).enabled : undefined;\n\n if (enabled === true) return true;\n if (enabled === false) return false;\n\n return undefined;\n}\n\nexport function isServiceFlagEnabled(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean {\n return serviceFlagState(svc, flagId) === true;\n}\n\n// src/core/validate/error.ts\nexport function withAffected(\n details: Record<string, unknown> | undefined,\n ids: string[] | undefined,\n): Record<string, unknown> | undefined {\n if (!ids || ids.length <= 1) return details;\n return { ...(details ?? {}), affectedIds: ids };\n}\n","// src/core/node-map.ts\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\";\n\nexport type NodeRef =\n | { kind: \"tag\"; id: string; node: Tag }\n | { kind: \"field\"; id: string; node: Field }\n | {\n kind: \"option\";\n id: string;\n node: FieldOption;\n fieldId: string; // parent field id\n };\n\nexport type NodeMap = Map<string, NodeRef>;\n\n/**\n * Build a node map keyed by *actual ids* (no prefix assumptions).\n * Rule: ids are unique across tags/fields/options.\n *\n * If you ever violate uniqueness, the first wins by default; we can hard-throw if you want.\n */\nexport function buildNodeMap(props: ServiceProps): NodeMap {\n const map: NodeMap = new Map();\n\n for (const t of props.filters ?? []) {\n if (!map.has(t.id)) map.set(t.id, { kind: \"tag\", id: t.id, node: t });\n }\n\n for (const f of props.fields ?? []) {\n if (!map.has(f.id)) map.set(f.id, { kind: \"field\", id: f.id, node: f });\n\n for (const o of f.options ?? []) {\n if (!map.has(o.id))\n map.set(o.id, {\n kind: \"option\",\n id: o.id,\n node: o,\n fieldId: f.id,\n });\n }\n }\n\n return map;\n}\n\n/**\n * Resolve a trigger id into either:\n * - a direct node id (tag/field/option)\n * - or a composite \"fieldId::optionId\" trigger (used for maps)\n *\n * IMPORTANT:\n * - We do NOT strip any prefixes like \"o:\".\n * - \"o:on\" is a perfectly valid *option id* if your data uses it.\n */\nexport type TriggerRef =\n | {\n kind: \"composite\";\n triggerKey: string;\n fieldId: string;\n optionId: string;\n }\n | { kind: NodeKind; triggerKey: string; id: string; fieldId?: string };\n\nexport function resolveTrigger(\n trigger: string,\n nodeMap: NodeMap,\n): TriggerRef | undefined {\n // Composite: fieldId::optionId (maps key by composite)\n const idx = trigger.indexOf(\"::\");\n if (idx !== -1) {\n const fieldId = trigger.slice(0, idx);\n const optionId = trigger.slice(idx + 2);\n return { kind: \"composite\", triggerKey: trigger, fieldId, optionId };\n }\n\n // Direct node id (tag/field/option)\n const direct = nodeMap.get(trigger);\n if (!direct) return undefined;\n\n if (direct.kind === \"option\") {\n return {\n kind: \"option\",\n triggerKey: trigger,\n id: direct.id,\n fieldId: direct.fieldId,\n };\n }\n\n return { kind: direct.kind, triggerKey: trigger, id: direct.id };\n}\n","// src/core/visibility.ts\r\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\r\nimport { buildNodeMap, type NodeMap, resolveTrigger } from \"./node-map\";\r\n\r\nexport type VisibilityOptions = {\r\n selectedKeys?: Set<string>;\r\n};\r\n\r\n/**\r\n * Single source of truth: selection-aware + lineage-aware visible field ids under a tag.\r\n * Returns ordered IDs.\r\n */\r\nexport function visibleFieldIdsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): string[] {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n if (!tag) return [];\r\n\r\n // Build node map (id => {kind,node,...})\r\n const nodeMap: NodeMap = buildNodeMap(props);\r\n\r\n // ---- lineage with depth: self=0, parent=1, grandparent=2 ...\r\n const lineageDepth = new Map<string, number>();\r\n {\r\n const guard = new Set<string>();\r\n let cur: Tag | undefined = tag;\r\n let d = 0;\r\n while (cur && !guard.has(cur.id)) {\r\n lineageDepth.set(cur.id, d++);\r\n guard.add(cur.id);\r\n const parentId: string | undefined = cur.bind_id;\r\n cur = parentId ? tagById.get(parentId) : undefined;\r\n }\r\n }\r\n\r\n const isTagInLineage = (id: string) => lineageDepth.has(id);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n\r\n const ownerDepthForField = (f: Field): number | undefined => {\r\n const b = f.bind_id;\r\n if (!b) return undefined;\r\n\r\n if (typeof b === \"string\") return lineageDepth.get(b);\r\n\r\n let best: number | undefined = undefined;\r\n for (const id of b) {\r\n const d = lineageDepth.get(id);\r\n if (d == null) continue;\r\n if (best == null || d < best) best = d;\r\n }\r\n return best;\r\n };\r\n\r\n const ownerDepthForTriggerKey = (\r\n triggerKey: string,\r\n ): number | undefined => {\r\n const t = resolveTrigger(triggerKey, nodeMap);\r\n if (!t) return undefined;\r\n\r\n // Composite trigger: fieldId::optionId\r\n if (t.kind === \"composite\") {\r\n const f = fieldById.get(t.fieldId);\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Field trigger (button field id)\r\n if (t.kind === \"field\") {\r\n const f = fieldById.get(t.id);\r\n if (!f || f.button !== true) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Option trigger (option id)\r\n if (t.kind === \"option\") {\r\n const f = t.fieldId ? fieldById.get(t.fieldId) : undefined;\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Tag trigger not used as a “button trigger”\r\n return undefined;\r\n };\r\n\r\n // ---- current tag includes/excludes (NOT inherited)\r\n const tagInclude = new Set(tag.includes ?? []);\r\n const tagExclude = new Set(tag.excludes ?? []);\r\n\r\n // ---- selection triggers (buttons + options)\r\n const selected = opts.selectedKeys ?? new Set<string>();\r\n const incMap = props.includes_for_buttons ?? {};\r\n const excMap = props.excludes_for_buttons ?? {};\r\n\r\n // Only apply triggers that belong to (self ∪ ancestors).\r\n // Preserve insertion order from the Set.\r\n const relevantTriggersInOrder: string[] = [];\r\n for (const key of selected) {\r\n const d = ownerDepthForTriggerKey(key);\r\n if (d == null) continue;\r\n relevantTriggersInOrder.push(key);\r\n }\r\n\r\n // ---- base candidates: bound fields inherited + current tag includes\r\n const visible = new Set<string>();\r\n\r\n const isBoundToLineage = (f: Field): boolean => {\r\n const b = f.bind_id;\r\n if (!b) return false;\r\n if (typeof b === \"string\") return isTagInLineage(b);\r\n for (const id of b) if (isTagInLineage(id)) return true;\r\n return false;\r\n };\r\n\r\n for (const f of fields) {\r\n if (isBoundToLineage(f)) visible.add(f.id);\r\n if (tagInclude.has(f.id)) visible.add(f.id);\r\n }\r\n\r\n // apply current tag excludes\r\n for (const id of tagExclude) visible.delete(id);\r\n\r\n // ---- button decisions with precedence:\r\n // closest depth wins; if same depth and conflict => exclude wins\r\n type ButtonDecision = { depth: number; kind: \"include\" | \"exclude\" };\r\n const decide = new Map<string, ButtonDecision>();\r\n\r\n const applyDecision = (fieldId: string, next: ButtonDecision) => {\r\n const prev = decide.get(fieldId);\r\n if (!prev) return void decide.set(fieldId, next);\r\n\r\n if (next.depth < prev.depth) return void decide.set(fieldId, next);\r\n if (next.depth > prev.depth) return;\r\n\r\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\r\n decide.set(fieldId, next);\r\n }\r\n };\r\n\r\n // determinism: revealed order (in trigger order)\r\n const revealedOrder: string[] = [];\r\n const revealedSeen = new Set<string>();\r\n\r\n for (const triggerKey of relevantTriggersInOrder) {\r\n const depth = ownerDepthForTriggerKey(triggerKey);\r\n if (depth == null) continue;\r\n\r\n for (const id of incMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"include\" });\r\n\r\n if (!revealedSeen.has(id)) {\r\n revealedSeen.add(id);\r\n revealedOrder.push(id);\r\n }\r\n }\r\n\r\n for (const id of excMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"exclude\" });\r\n }\r\n }\r\n\r\n // apply button decisions (buttons override tag state)\r\n for (const [fid, d] of decide) {\r\n if (d.kind === \"include\") visible.add(fid);\r\n else visible.delete(fid);\r\n }\r\n\r\n // natural order (props.fields order)\r\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\r\n\r\n // order_for_tags pins first (ordering only)\r\n const order = props.order_for_tags?.[tagId];\r\n if (order && order.length) {\r\n const ordered = order.filter((fid) => visible.has(fid));\r\n const orderedSet = new Set(ordered);\r\n const rest = base.filter((fid) => !orderedSet.has(fid));\r\n return [...ordered, ...rest];\r\n }\r\n\r\n // otherwise: revealed-first (only final-visible)\r\n return base;\r\n}\r\n\r\n/** Convenience: returns ordered Field[] instead of ids. */\r\nexport function visibleFieldsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): Field[] {\r\n const ids = visibleFieldIdsUnder(props, tagId, opts);\r\n const fieldById = new Map((props.fields ?? []).map((f) => [f.id, f]));\r\n return ids.map((id) => fieldById.get(id)).filter(Boolean) as Field[];\r\n}\r\n","// src/core/validate/steps/visibility.ts\n\nimport type { Field, Tag } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { visibleFieldsUnder } from \"@/core/visibility\";\n\n/**\n * v.selectedKeys is a Set<string> (per your note).\n * We keep the validator's \"fieldsVisibleUnder\" hook, but route all visibility\n * through the core visibility engine (single source of truth).\n */\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n return visibleFieldsUnder(v.props, tagId, {\n selectedKeys: v.selectedKeys,\n });\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Simulation-enabled validateVisibility */\n/* -------------------------------------------------------------------------- */\n\nexport type SimulateVisibilityOptions = {\n /**\n * When true, performs an in-depth selection simulation starting from root tag(s),\n * exploring states by selecting one selectable trigger at a time and re-validating.\n */\n simulate?: boolean;\n\n /**\n * Safety valve: max number of unique selection states validated.\n * Default: 500\n */\n maxStates?: number;\n\n /**\n * Safety valve: max depth of added selections from the base context.\n * Default: 6\n */\n maxDepth?: number;\n\n /**\n * If true, simulate starting from each root tag (tags without bind_id).\n * Otherwise, simulate only the first inferred root.\n */\n simulateAllRoots?: boolean;\n\n /**\n * If true, only simulate triggers that exist in includes_for_buttons/excludes_for_buttons\n * (massive branching reduction). Default: true.\n *\n * NOTE: Only enable this if selecting triggers has no other side effects besides\n * includes/excludes visibility effects.\n */\n onlyEffectfulTriggers?: boolean;\n};\n\nfunction stableKeyOfSelection(keys: Set<string>): string {\n return Array.from(keys).sort().join(\"|\");\n}\n\nfunction resolveRootTags(tags: Tag[]): Tag[] {\n const roots = tags.filter((t) => !(t as any).bind_id);\n return roots.length ? roots : tags.slice(0, 1);\n}\n\nfunction isEffectfulTrigger(v: ValidationCtx, trigger: string): boolean {\n const inc = v.props.includes_for_buttons ?? {};\n const exc = v.props.excludes_for_buttons ?? {};\n return (inc[trigger]?.length ?? 0) > 0 || (exc[trigger]?.length ?? 0) > 0;\n}\n\nfunction collectSelectableTriggersInContext(\n v: ValidationCtx,\n tagId: string,\n selectedKeys: Set<string>,\n onlyEffectful: boolean,\n): string[] {\n const visible = visibleFieldsUnder(v.props, tagId, {\n selectedKeys: selectedKeys,\n });\n\n const triggers: string[] = [];\n\n for (const f of visible) {\n // button-field trigger\n if ((f as any).button === true) {\n const t = f.id;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n\n // option triggers (canonical: \"fieldId::optionId\")\n for (const o of f.options ?? []) {\n const t = `${f.id}::${o.id}`;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n }\n\n // deterministic expansion order\n triggers.sort();\n return triggers;\n}\n\n/**\n * The actual visibility rules (your previous validateVisibility body),\n * extracted so we can run it once per simulated selection state.\n */\nfunction runVisibilityRulesOnce(v: ValidationCtx): void {\n // duplicate visible labels (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const seen: Map<string, string> = new Map<string, string>();\n\n for (const f of visible) {\n const label: string = (f.label ?? \"\").trim();\n if (!label) continue;\n\n if (seen.has(label)) {\n const otherId: string | undefined = seen.get(label);\n\n v.errors.push({\n code: \"duplicate_visible_label\",\n severity: \"error\",\n message: `Duplicate visible label \"${label}\" under tag \"${t.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { tagId: t.id, other: otherId, label },\n otherId ? [t.id, f.id, otherId] : [t.id, f.id],\n ),\n });\n } else {\n seen.set(label, f.id);\n }\n }\n }\n\n // Quantity marker rule: at most one marker per visible group (tag) (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const markers: string[] = [];\n\n for (const f of visible) {\n const q: unknown = (f.meta as any)?.quantity;\n if (q) markers.push(f.id);\n }\n\n if (markers.length > 1) {\n v.errors.push({\n code: \"quantity_multiple_markers\",\n severity: \"error\",\n message: `Multiple quantity markers found under tag \"${t.id}\". Only one is allowed per visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, markers }, [\n t.id,\n ...markers,\n ]),\n });\n }\n }\n\n // utility_without_base per visible tag group (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n\n let hasBase: boolean = false;\n let hasUtility: boolean = false;\n const utilityOptionIds: string[] = [];\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const role: string =\n o.pricing_role ?? (f as any).pricing_role ?? \"base\";\n\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") {\n hasUtility = true;\n utilityOptionIds.push(o.id);\n }\n }\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"error\",\n message: `Utility-priced options exist under tag \"${t.id}\" but no base-priced options were found in the same visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, utilityOptionIds }, [\n t.id,\n ...utilityOptionIds,\n ]),\n });\n }\n }\n}\n\n/**\n * De-dup only the errors added during simulation, so output stays stable.\n */\nfunction dedupeErrorsInPlace(v: ValidationCtx, startIndex: number): void {\n const seen = new Set<string>();\n\n const keyOfErr = (e: any) => {\n const tagId = e?.details?.tagId ?? e?.details?.affected?.tagId ?? \"\";\n const other = e?.details?.other ?? \"\";\n return `${e?.code ?? \"\"}::${e?.nodeId ?? \"\"}::${tagId}::${other}::${e?.message ?? \"\"}`;\n };\n\n const kept: any[] = [];\n for (let i = startIndex; i < v.errors.length; i++) {\n const e = v.errors[i];\n const k = keyOfErr(e);\n if (seen.has(k)) continue;\n seen.add(k);\n kept.push(e);\n }\n\n v.errors.splice(startIndex, v.errors.length - startIndex, ...kept);\n}\n\n/**\n * validateVisibility(v, { simulate: true }) will:\n * - Start from the root tag context\n * - Compute visible fields under that root given current selection\n * - Enumerate selectable triggers (button fields + option triggers)\n * - DFS: add one trigger, re-validate, then from that new context add any\n * newly-visible triggers, repeat… until depth/cap limits.\n */\nexport function validateVisibility(\n v: ValidationCtx,\n options: SimulateVisibilityOptions = {},\n): void {\n const simulate = options.simulate === true;\n\n if (!simulate) {\n runVisibilityRulesOnce(v);\n return;\n }\n\n const maxStates = Math.max(1, options.maxStates ?? 500);\n const maxDepth = Math.max(0, options.maxDepth ?? 6);\n const onlyEffectful = options.onlyEffectfulTriggers !== false; // default true\n\n const roots = resolveRootTags(v.tags);\n const rootTags = options.simulateAllRoots ? roots : roots.slice(0, 1);\n\n // snapshot original selection Set\n const originalSelected = new Set(v.selectedKeys ?? []);\n\n // we only dedupe what simulation adds\n const errorsStart = v.errors.length;\n\n // visited pruning by selection signature\n const visited = new Set<string>();\n\n type State = { rootTagId: string; selected: Set<string>; depth: number };\n const stack: State[] = [];\n\n // seed states (one per simulated root)\n for (const rt of rootTags) {\n stack.push({\n rootTagId: rt.id,\n selected: new Set(originalSelected),\n depth: 0,\n });\n }\n\n let validatedStates = 0;\n\n while (stack.length) {\n if (validatedStates >= maxStates) break;\n\n const state = stack.pop()!;\n const sig = stableKeyOfSelection(state.selected);\n\n if (visited.has(sig)) continue;\n visited.add(sig);\n\n // apply selection for this state\n v.selectedKeys = state.selected;\n\n // validate once under this selection context\n validatedStates++;\n runVisibilityRulesOnce(v);\n\n // stop expanding deeper\n if (state.depth >= maxDepth) continue;\n\n // expand next possible triggers based on current visible context\n const triggers = collectSelectableTriggersInContext(\n v,\n state.rootTagId,\n state.selected,\n onlyEffectful,\n );\n\n // DFS, deterministic: push reverse so earlier triggers explored first\n for (let i = triggers.length - 1; i >= 0; i--) {\n const trig = triggers[i]!;\n if (state.selected.has(trig)) continue;\n\n const next = new Set(state.selected);\n next.add(trig);\n\n stack.push({\n rootTagId: state.rootTagId,\n selected: next,\n depth: state.depth + 1,\n });\n }\n }\n\n // restore original selection\n v.selectedKeys = originalSelected;\n\n // dedupe errors from simulation tail\n dedupeErrorsInPlace(v, errorsStart);\n\n // If you want a diagnostic warning when capped, you can add it here.\n // Example (non-breaking): add a \"warning\" severity error.\n // if (validatedStates >= maxStates) { ... }\n}\n","// src/core/validate/steps/structure.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateStructure(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // root present\n if (!tags.some((t) => t.id === \"t:root\")) {\n v.errors.push({\n code: \"root_missing\",\n severity: \"error\",\n message: 'Missing required root tag with id \"root\".',\n });\n }\n\n // cycles in tag parentage\n const visiting: Set<string> = new Set<string>();\n const visited: Set<string> = new Set<string>();\n\n const hasCycleFrom = (id: string): boolean => {\n if (visiting.has(id)) return true;\n if (visited.has(id)) return false;\n\n visiting.add(id);\n\n const parent: string | undefined = v.tagById.get(id)?.bind_id;\n if (parent && v.tagById.has(parent) && hasCycleFrom(parent))\n return true;\n\n visiting.delete(id);\n visited.add(id);\n return false;\n };\n\n for (const t of tags) {\n if (hasCycleFrom(t.id)) {\n v.errors.push({\n code: \"cycle_in_tags\",\n severity: \"error\",\n message: `Cycle detected in tag parentage starting at tag \"${t.id}\".`,\n nodeId: t.id,\n details: { tagId: t.id },\n });\n break;\n }\n }\n\n // tag.bind_id must point to existing tag (if present)\n for (const t of tags) {\n if (t.bind_id && !v.tagById.has(t.bind_id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Tag \"${t.id}\" binds to missing parent tag \"${t.bind_id}\".`,\n nodeId: t.id,\n details: withAffected({ ref: t.bind_id }, [t.id]),\n });\n }\n }\n\n // field.bind_id must reference tags\n for (const f of fields) {\n const b = f.bind_id;\n\n if (Array.isArray(b)) {\n for (const id of b) {\n if (!v.tagById.has(id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${id}\".`,\n nodeId: f.id,\n details: withAffected({ ref: id }, [f.id]),\n });\n }\n }\n } else if (typeof b === \"string\") {\n if (!v.tagById.has(b)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${b}\".`,\n nodeId: f.id,\n details: withAffected({ ref: b }, [f.id]),\n });\n }\n }\n }\n\n void isFiniteNumber; // keeps parity if you had helper usage in the original file\n}\n","// src/core/validate/steps/identity.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption, withAffected } from \"../shared\";\n\nexport function validateIdentity(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // duplicate ids across tags + fields\n {\n const firstSeen: Map<string, string> = new Map<string, string>(); // id -> first kind (\"tag\"|\"field\")\n const seen: Set<string> = new Set<string>();\n\n for (const t of tags) {\n if (seen.has(t.id)) {\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${t.id}\" found (tag).`,\n nodeId: t.id,\n // we only know the id itself; no other id to point at\n });\n } else {\n seen.add(t.id);\n firstSeen.set(t.id, \"tag\");\n }\n }\n\n for (const f of fields) {\n if (seen.has(f.id)) {\n const kind: string = firstSeen.get(f.id) ?? \"tag/field\";\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${f.id}\" found (field) — already used by a ${kind}.`,\n nodeId: f.id,\n });\n } else {\n seen.add(f.id);\n firstSeen.set(f.id, \"field\");\n }\n }\n }\n\n // tag labels unique + required\n {\n const seen: Map<string, string> = new Map<string, string>(); // label -> tagId\n\n for (const t of tags) {\n if (!t.label || !t.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Tag \"${t.id}\" is missing a label.`,\n nodeId: t.id,\n details: { kind: \"tag\" },\n });\n continue;\n }\n\n const k: string = t.label;\n\n if (seen.has(k)) {\n const otherId: string | undefined = seen.get(k);\n v.errors.push({\n code: \"duplicate_tag_label\",\n severity: \"error\",\n message: `Duplicate tag label \"${k}\" found on tag \"${t.id}\".`,\n nodeId: t.id,\n details: withAffected(\n { other: otherId, label: k },\n otherId ? [t.id, otherId] : undefined,\n ),\n });\n } else {\n seen.set(k, t.id);\n }\n }\n }\n\n // field labels required; names unique among user-input fields\n {\n const seenNames: Map<string, string> = new Map<string, string>(); // name -> fieldId\n\n for (const f of fields) {\n if (!f.label || !f.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Field \"${f.id}\" is missing a label.`,\n nodeId: f.id,\n details: { kind: \"field\" },\n });\n }\n\n const isUserInput: boolean = !!f.name && !hasAnyServiceOption(f);\n\n if (isUserInput && f.name) {\n const k: string = f.name;\n\n if (seenNames.has(k)) {\n const otherId: string | undefined = seenNames.get(k);\n v.errors.push({\n code: \"duplicate_field_name\",\n severity: \"error\",\n message: `Duplicate field name \"${k}\" found on field \"${f.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { other: otherId, name: k },\n otherId ? [f.id, otherId] : undefined,\n ),\n });\n } else {\n seenNames.set(k, f.id);\n }\n }\n }\n }\n\n // option labels required\n for (const f of fields) {\n for (const o of f.options ?? []) {\n if (!o.label || !o.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Option \"${o.id}\" (field \"${f.id}\") is missing a label.`,\n nodeId: o.id,\n details: { kind: \"option\", fieldId: f.id },\n });\n }\n }\n }\n}\n","// src/core/validate/steps/option-maps.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\ntype ParsedFallback = { fieldId: string; optionId: string };\n\n/** Fallback parser for legacy \"fieldId::optionId\" keys */\nfunction parseFieldOptionKey(key: string): ParsedFallback | null {\n const idx = key.indexOf(\"::\");\n if (idx === -1) return null;\n\n const fieldId = key.slice(0, idx).trim();\n const optionId = key.slice(idx + 2).trim();\n\n if (!fieldId || !optionId) return null;\n return { fieldId, optionId };\n}\n\nfunction hasOption(v: ValidationCtx, fid: string, oid: string): boolean {\n const f = v.fieldById.get(fid);\n if (!f) return false;\n return !!(f.options ?? []).find((o) => o.id === oid);\n}\n\nexport function validateOptionMaps(v: ValidationCtx): void {\n const incMap: Record<string, string[]> = v.props.includes_for_buttons ?? {};\n const excMap: Record<string, string[]> = v.props.excludes_for_buttons ?? {};\n\n const badKeyMessage = (key: string): string =>\n `Invalid trigger-map key \"${key}\". Expected a known node id (option or button-field), or \"fieldId::optionId\" pointing to an existing option.`;\n\n /**\n * Valid trigger keys:\n * - nodeMap has key:\n * - kind:\"option\" => ok\n * - kind:\"field\" => ok only if field.button === true\n * - kind:\"tag\" => invalid\n * - else fallback: \"fieldId::optionId\" must point to an existing option under that field\n */\n const validateTriggerKey = (\n key: string,\n ): {\n ok: boolean;\n nodeId?: string; // for error anchoring\n affected?: string[]; // for withAffected\n } => {\n const ref = v.nodeMap.get(key);\n\n if (ref) {\n if (ref.kind === \"option\") {\n // option trigger id is ref.id (key), and we know its parent field\n return {\n ok: true,\n nodeId: ref.fieldId,\n affected: [ref.fieldId, ref.id],\n };\n }\n\n if (ref.kind === \"field\") {\n const isButton = (ref.node as any).button === true;\n if (!isButton)\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n return { ok: true, nodeId: ref.id, affected: [ref.id] };\n }\n\n // tags cannot be triggers\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n }\n\n // fallback: fieldId::optionId\n const p = parseFieldOptionKey(key);\n if (!p) return { ok: false };\n\n if (!hasOption(v, p.fieldId, p.optionId))\n return {\n ok: false,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n\n return {\n ok: true,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n };\n\n // bad_option_key (keeping the code name for compatibility)\n for (const k of Object.keys(incMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n for (const k of Object.keys(excMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n // option_include_exclude_conflict: SAME RAW KEY in both maps\n for (const k of Object.keys(incMap)) {\n if (!(k in excMap)) continue;\n\n const r = validateTriggerKey(k);\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Trigger-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n}\n","// src/core/validate/steps/service-vs-input.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption } from \"../shared\";\n\nexport function validateServiceVsUserInput(v: ValidationCtx): void {\n for (const f of v.fields) {\n const anySvc: boolean = hasAnyServiceOption(f);\n const hasName: boolean = !!(f.name && f.name.trim());\n\n if (f.type === \"custom\" && anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" cannot map service options.`,\n nodeId: f.id,\n details: { reason: \"custom_cannot_map_service\" },\n });\n }\n\n if (!hasName) {\n // treated as service-backed → require at least one service option\n if (!anySvc) {\n v.errors.push({\n code: \"service_field_missing_service_id\",\n severity: \"error\",\n message: `Service-backed field \"${f.id}\" has no \"name\" and must provide at least one option with a service_id.`,\n nodeId: f.id,\n });\n }\n } else {\n // user-input → options must not carry service_id\n if (anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `User-input field \"${f.id}\" has a name and must not include any options with service_id.`,\n nodeId: f.id,\n });\n }\n }\n }\n}\n","// src/core/validate/steps/utility.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, isServiceIdRef, withAffected } from \"../shared\";\n\nexport function validateUtilityMarkers(v: ValidationCtx): void {\n const ALLOWED_UTILITY_MODES: Set<string> = new Set<string>([\n \"flat\",\n \"per_quantity\",\n \"per_value\",\n \"percent\",\n ]);\n\n // option-level\n for (const f of v.fields) {\n const optsArr = Array.isArray(f.options) ? f.options : [];\n for (const o of optsArr) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n const hasService: boolean = isServiceIdRef(o.service_id);\n const util: unknown = (o.meta as any)?.utility;\n\n if (role === \"utility\" && hasService) {\n v.errors.push({\n code: \"utility_with_service_id\",\n severity: \"error\",\n message: `Utility-priced option \"${o.id}\" (field \"${f.id}\") must not reference a service_id.`,\n nodeId: o.id,\n details: withAffected(\n {\n fieldId: f.id,\n optionId: o.id,\n service_id: o.service_id,\n },\n [f.id, o.id],\n ),\n });\n }\n\n if (util) {\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") is missing a valid rate.`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id },\n [f.id, o.id],\n ),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id, mode },\n [f.id, o.id],\n ),\n });\n }\n }\n }\n }\n\n // field-level\n for (const f of v.fields) {\n const util: unknown = (f.meta as any)?.utility;\n if (!util) continue;\n\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" is missing a valid rate.`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id }, [f.id]),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id, mode }, [f.id]),\n });\n }\n }\n}\n","import { Field } from \"@/schema\";\n\n/**\n * Heuristic: multi-select if type hints ('multiselect'|'checkbox') or meta.multi === true.\n * Hosts can rely on meta.multi if using custom type strings.\n */\nexport function isMultiField(f: Field): boolean {\n const t = (f.type || \"\").toLowerCase();\n const metaMulti = !!f.meta?.multi;\n return t === \"multiselect\" || t === \"checkbox\" || metaMulti;\n}\n","import type {\n DgpServiceCapability,\n DgpServiceMap,\n ServiceIdRef,\n} from \"@/schema\";\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\n): boolean {\n const cap = getServiceCapability(svcMap, candidate);\n if (!cap) return false;\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\n\nexport function getServiceCapability(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef | undefined,\n): DgpServiceCapability | undefined {\n if (candidate === undefined || candidate === null) return undefined;\n\n const direct = (svcMap as any)[candidate] as DgpServiceCapability | undefined;\n if (direct) return direct;\n\n const byString = (svcMap as any)[String(candidate)] as\n | DgpServiceCapability\n | undefined;\n if (byString) return byString;\n\n if (typeof candidate === \"string\") {\n const maybeNumber = Number(candidate);\n if (Number.isFinite(maybeNumber)) {\n return (svcMap as any)[maybeNumber] as DgpServiceCapability | undefined;\n }\n }\n\n return undefined;\n}\n\nexport function normalizeRatePolicy(policy: RatePolicy | undefined): RatePolicy {\n if (!policy) return { kind: \"lte_primary\", pct: 5 };\n if (policy.kind === \"eq_primary\") return policy;\n const pct = Math.max(0, Number(policy.pct ?? 0));\n return { ...policy, pct };\n}\n\nexport function passesRatePolicy(\n policy: RatePolicy | undefined,\n primaryRate: number,\n candidateRate: number,\n): boolean {\n if (!Number.isFinite(primaryRate) || !Number.isFinite(candidateRate)) {\n return false;\n }\n\n const rp = normalizeRatePolicy(policy);\n switch (rp.kind) {\n case \"eq_primary\":\n return candidateRate === primaryRate;\n case \"lte_primary\": {\n const floor = primaryRate * (1 - rp.pct / 100);\n return candidateRate <= primaryRate && candidateRate >= floor;\n }\n case \"within_pct\":\n return candidateRate <= primaryRate * (1 + rp.pct / 100);\n case \"at_least_pct_lower\":\n return candidateRate <= primaryRate * (1 - rp.pct / 100);\n }\n}\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n primary: ServiceIdRef,\n policy: FallbackSettings,\n): boolean {\n const cand = getServiceCapability(svcMap, candidate);\n const prim = getServiceCapability(svcMap, primary);\n if (!cand || !prim) return false;\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n return passesRatePolicy(policy.ratePolicy, pRate, cRate);\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\nexport function validateRates(v: ValidationCtx): void {\n const ratePolicy = normalizeRatePolicy(v.options.ratePolicy);\n\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Array<{ optionId: string; serviceId: string; rate: number }> =\n [];\n\n for (const o of f.options ?? []) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role !== \"base\") continue;\n\n const sid: unknown = o.service_id;\n if (!isServiceIdRef(sid)) continue;\n\n const cap = getServiceCapability(v.serviceMap, sid);\n const rate = cap?.rate;\n if (typeof rate === \"number\" && Number.isFinite(rate)) {\n baseRates.push({\n optionId: o.id,\n serviceId: String(sid),\n rate,\n });\n }\n }\n\n if (baseRates.length <= 1) continue;\n\n const primary = baseRates.reduce((best, current) =>\n current.rate > best.rate ? current : best,\n );\n\n const offenders = baseRates.filter(\n (candidate) =>\n candidate.optionId !== primary.optionId &&\n !passesRatePolicy(ratePolicy, primary.rate, candidate.rate),\n );\n\n if (offenders.length > 0) {\n v.invalidRateFieldIds.add(f.id);\n const affectedIds: string[] = [\n f.id,\n ...baseRates.map((entry) => entry.optionId),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" violate rate policy \"${ratePolicy.kind}\".`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n primaryOptionId: primary.optionId,\n primaryRate: primary.rate,\n rates: baseRates.map((entry) => entry.rate),\n optionIds: baseRates.map((entry) => entry.optionId),\n offenderOptionIds: offenders.map((entry) => entry.optionId),\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/constraints.ts\nimport type { ValidationCtx } from \"../shared\";\nimport {\n isServiceIdRef,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\nimport { getServiceCapability } from \"@/utils/util\";\n\ntype ConstraintBag = Record<string, boolean | undefined>;\n\nfunction constraintKeysInChain(v: ValidationCtx, tagId: string): string[] {\n const keys: string[] = [];\n const seenKeys: Set<string> = new Set<string>();\n\n let cur: string | undefined = tagId;\n const seenTags: Set<string> = new Set<string>();\n\n while (cur && !seenTags.has(cur)) {\n seenTags.add(cur);\n\n const t = v.tagById.get(cur);\n const c: unknown = t?.constraints;\n\n if (c && typeof c === \"object\") {\n for (const k of Object.keys(c as any)) {\n if (!seenKeys.has(k)) {\n seenKeys.add(k);\n keys.push(k);\n }\n }\n }\n\n cur = t?.bind_id;\n }\n\n return keys;\n}\n\nfunction effectiveConstraints(v: ValidationCtx, tagId: string): ConstraintBag {\n const out: ConstraintBag = {};\n const keys: string[] = constraintKeysInChain(v, tagId);\n\n for (const key of keys) {\n let cur: string | undefined = tagId;\n const seen: Set<string> = new Set<string>();\n\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n\n const t = v.tagById.get(cur);\n const val: unknown = (t?.constraints as any)?.[key];\n\n if (val === true || val === false) {\n out[key] = val;\n break;\n }\n\n cur = t?.bind_id;\n }\n }\n\n return out;\n}\n\nexport function validateConstraints(v: ValidationCtx): void {\n // Enforce tag constraints on visible options' services\n for (const t of v.tags) {\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n const hasAnyRequired: boolean = Object.values(eff).some(\n (x) => x === true,\n );\n if (!hasAnyRequired) continue;\n\n const visible = v.fieldsVisibleUnder(t.id);\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, o.service_id);\n if (!svc || typeof svc !== \"object\") continue;\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Service option \"${o.id}\" under tag \"${t.id}\" does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: withAffected(\n {\n flag: k,\n serviceId: o.service_id,\n fieldId: f.id,\n optionId: o.id,\n },\n [t.id, f.id, o.id],\n ),\n });\n }\n }\n }\n }\n }\n\n // Unsupported constraint vs tag's mapped service capabilities\n for (const t of v.tags) {\n const sid: unknown = t.service_id;\n if (!isServiceIdRef(sid)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, sid);\n if (!svc || typeof svc !== \"object\") continue;\n\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Tag \"${t.id}\" maps to service \"${String(\n sid,\n )}\" which does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: { flag: k, serviceId: sid },\n });\n }\n }\n }\n\n // constraint_overridden diagnostics\n for (const t of v.tags) {\n const ov: unknown = t.constraints_overrides;\n if (!ov || typeof ov !== \"object\") continue;\n\n for (const k of Object.keys(ov as Record<string, unknown>)) {\n const row: any = (ov as any)[k];\n if (!row) continue;\n\n const from: boolean = row.from === true;\n const to: boolean = row.to === true;\n const origin: string = String(row.origin ?? \"\");\n\n v.errors.push({\n code: \"constraint_overridden\",\n severity: \"warning\",\n message: origin\n ? `Constraint \"${k}\" on tag \"${t.id}\" was overridden by ancestor \"${origin}\" (${String(from)} → ${String(\n to,\n )}).`\n : `Constraint \"${k}\" on tag \"${t.id}\" was overridden by an ancestor (${String(from)} → ${String(to)}).`,\n nodeId: t.id,\n details: withAffected(\n { flag: k, from, to, origin },\n origin ? [t.id, origin] : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/custom.ts\nimport type { ValidationCtx } from \"../shared\";\n\nexport function validateCustomFields(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (f.type !== \"custom\") continue;\n\n if (!f.component || !String(f.component).trim()) {\n v.errors.push({\n code: \"custom_component_missing\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" is missing a valid component reference.`,\n nodeId: f.id,\n });\n }\n }\n}\n","// src/core/validate/steps/global-utility-guard.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef } from \"../shared\";\n\nexport function validateGlobalUtilityGuard(v: ValidationCtx): void {\n if (!v.options.globalUtilityGuard) return;\n\n let hasUtility: boolean = false;\n let hasBase: boolean = false;\n\n for (const f of v.fields) {\n for (const o of f.options ?? []) {\n if (!isServiceIdRef(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") hasUtility = true;\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"warning\",\n message:\n \"Global utility guard: utility-priced options exist but no base-priced options were found.\",\n nodeId: \"global\",\n details: { scope: \"global\" },\n });\n }\n}\n","// src/core/validate/steps/unbound.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\nexport function validateUnboundFields(v: ValidationCtx): void {\n const boundFieldIds: Set<string> = new Set<string>();\n\n for (const f of v.fields) {\n if (f.bind_id) boundFieldIds.add(f.id);\n }\n\n const includedByTag: Set<string> = new Set<string>();\n for (const t of v.tags) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n }\n\n const includedByOption: Set<string> = new Set<string>();\n for (const arr of Object.values(v.props.includes_for_buttons ?? {})) {\n for (const id of arr ?? []) includedByOption.add(id);\n }\n\n for (const f of v.fields) {\n if (\n !boundFieldIds.has(f.id) &&\n !includedByTag.has(f.id) &&\n !includedByOption.has(f.id)\n ) {\n v.errors.push({\n code: \"field_unbound\",\n severity: \"error\",\n message: `Field \"${f.id}\" is unbound: it is not bound to any tag and not included by tags or option maps.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n bound: false,\n // exposing these helps editors explain \"why\"\n includedByTag: includedByTag.has(f.id),\n includedByOption: includedByOption.has(f.id),\n },\n [f.id],\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/fallbacks.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { collectFailedFallbacks } from \"@/core\";\n\nfunction codeForReason(\n reason: string,\n):\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\" {\n switch (reason) {\n case \"unknown_service\":\n return \"fallback_unknown_service\";\n case \"no_primary\":\n return \"fallback_no_primary\";\n case \"rate_violation\":\n return \"fallback_rate_violation\";\n case \"constraint_mismatch\":\n return \"fallback_constraint_mismatch\";\n case \"cycle\":\n return \"fallback_cycle\";\n default:\n return \"fallback_bad_node\";\n }\n}\n\nfunction messageFor(\n code:\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\",\n d: {\n nodeId?: string;\n primary?: unknown;\n candidate?: unknown;\n tagContext?: unknown;\n scope?: unknown;\n },\n): string {\n const n = d.nodeId ? `node \"${String(d.nodeId)}\"` : \"node\";\n switch (code) {\n case \"fallback_unknown_service\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" is unknown for ${n}.`;\n case \"fallback_no_primary\":\n return `Fallback rule has no primary service for ${n}.`;\n case \"fallback_rate_violation\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" violates the base-rate rules for ${n}.`;\n case \"fallback_constraint_mismatch\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" does not satisfy required constraints for ${n}.`;\n case \"fallback_cycle\":\n return `Fallback rules contain a cycle for ${n}.`;\n default:\n return `Fallback rule is invalid for ${n}.`;\n }\n}\n\nexport function validateFallbacks(v: ValidationCtx): void {\n const mode: string = v.options.fallbackSettings?.mode ?? \"strict\";\n if (!v.props.fallbacks) return;\n\n // collect non-fatal diagnostics first\n const diags = collectFailedFallbacks(v.props, v.options.serviceMap ?? {}, {\n ...v.options.fallbackSettings,\n mode: \"dev\",\n });\n\n if (mode !== \"strict\") return;\n\n for (const d of diags) {\n if (d.scope === \"global\") continue;\n\n const code = codeForReason(\n String((d as any).reason ?? \"fallback_bad_node\"),\n );\n\n const nodeId: string | undefined = (d as any).nodeId\n ? String((d as any).nodeId)\n : undefined;\n\n // Best-effort affected ids:\n // - Always include nodeId (if present)\n // - Include tagContext if it looks like a tag id (string)\n const tagContext: unknown = (d as any).tagContext;\n const affectedIds: string[] = [];\n if (nodeId) affectedIds.push(nodeId);\n if (\n typeof tagContext === \"string\" &&\n tagContext &&\n tagContext !== nodeId\n )\n affectedIds.push(tagContext);\n\n v.errors.push({\n code,\n severity: \"error\",\n message: messageFor(code, {\n nodeId,\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n }),\n nodeId,\n details: withAffected(\n {\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n}\n","// src/core/validate/policies/collect-service-items.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n IdType,\n} from \"@/schema/provider\";\nimport type { DynamicRule } from \"@/schema/validation\";\n\nimport { matchesWhere } from \"../shared\";\n\nexport type ServiceItem = Readonly<{\n /** Scope tag context (only meaningful for visible_group / tag-filtered global) */\n tagId?: string;\n\n /** Reference metadata (used for affectedIds + debugging) */\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n /** Canonical service id reference */\n serviceId: IdType;\n\n /** Pricing role context */\n role: \"base\" | \"utility\";\n\n /** Projection target (always present with at least { id }) */\n service: Record<string, unknown>;\n\n /** Aggregated affected ids (node/service refs that contributed to this item) */\n affectedIds: string[];\n}>;\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\ntype CollectMode = \"global\" | \"visible_group\";\n\nexport type CollectServiceItemsArgs = Readonly<{\n mode: CollectMode;\n\n props: ServiceProps;\n serviceMap: DgpServiceMap;\n\n /** For global: pass all tags, and usually props.fields */\n tags?: readonly Tag[];\n fields?: readonly Field[];\n\n /** For visible_group */\n tag?: Tag;\n tagId?: string;\n\n /** Host-defined filter surface */\n filter?: DynamicRule[\"filter\"];\n\n /**\n * visible_group fallbacks:\n * - include node-scoped fallbacks for these node ids (tag.id, option.id, etc.)\n */\n visibleNodeIds?: readonly string[];\n\n /**\n * visible_group fallbacks:\n * - include global fallbacks for these primary ids (services in the group)\n */\n visiblePrimaries?: readonly IdType[];\n}>;\n\nfunction asArray<T>(v: T | readonly T[] | undefined): readonly T[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v as any];\n}\n\nfunction isServiceIdRef(v: unknown): v is IdType {\n return (\n typeof v === \"string\" || (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nfunction svcSnapshot(\n serviceMap: DgpServiceMap,\n sid: IdType,\n): Record<string, unknown> {\n const svc: DgpServiceCapability | undefined = (serviceMap as any)[sid];\n if (!svc) return { id: sid };\n\n const meta: Record<string, unknown> =\n svc.meta && typeof svc.meta === \"object\" ? (svc.meta as any) : {};\n\n return {\n ...svc,\n id: sid,\n ...meta,\n } as unknown as Record<string, unknown>;\n}\n\nfunction pushItem(\n out: Map<string, ServiceItem>,\n next: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n serviceId: IdType;\n role: \"base\" | \"utility\";\n affectedIds: readonly string[];\n service: Record<string, unknown>;\n }>,\n): void {\n // dedupe by (serviceId, role) to preserve role semantics\n const key: string = `${String(next.serviceId)}|${next.role}`;\n\n const existing: ServiceItem | undefined = out.get(key);\n if (!existing) {\n out.set(key, {\n tagId: next.tagId,\n fieldId: next.fieldId,\n optionId: next.optionId,\n nodeId: next.nodeId,\n serviceId: next.serviceId,\n role: next.role,\n service: next.service,\n affectedIds: Array.from(new Set(next.affectedIds)),\n });\n return;\n }\n\n const mergedIds: string[] = Array.from(\n new Set<string>([...existing.affectedIds, ...next.affectedIds]),\n );\n\n // Prefer preserving an existing tagId if present; otherwise use new\n out.set(key, {\n ...existing,\n tagId: existing.tagId ?? next.tagId,\n affectedIds: mergedIds,\n });\n}\n\nfunction fieldRoleOf(\n f: Field,\n o?: { pricing_role?: string | undefined },\n): \"base\" | \"utility\" {\n const roleRaw: string | undefined =\n (o?.pricing_role as any) ?? (f.pricing_role as any) ?? \"base\";\n return roleRaw === \"utility\" ? \"utility\" : \"base\";\n}\n\nfunction applyFilterAllowLists(\n tagId: string | undefined,\n fieldId: string | undefined,\n filter: DynamicRule[\"filter\"] | undefined,\n): boolean {\n const tagAllow: readonly string[] | undefined = asArray(filter?.tag_id);\n const fieldAllow: readonly string[] | undefined = asArray(filter?.field_id);\n\n if (tagAllow) {\n if (!tagId) return false;\n if (!tagAllow.includes(tagId)) return false;\n }\n\n if (fieldAllow) {\n if (!fieldId) return false;\n if (!fieldAllow.includes(fieldId)) return false;\n }\n\n return true;\n}\n\nexport function collectServiceItems(\n args: CollectServiceItemsArgs,\n): ServiceItem[] {\n const filter: DynamicRule[\"filter\"] | undefined = args.filter;\n const roleFilter: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n (filter?.role as any) ?? \"both\";\n const where: readonly WhereClause[] | undefined = filter?.where;\n\n const out: Map<string, ServiceItem> = new Map<string, ServiceItem>();\n\n const addServiceRef = (\n ref: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n serviceId: IdType;\n role: \"base\" | \"utility\";\n\n affectedIds: readonly string[];\n }>,\n ): void => {\n if (roleFilter !== \"both\" && ref.role !== roleFilter) return;\n if (!applyFilterAllowLists(ref.tagId, ref.fieldId, filter)) return;\n\n const svc: DgpServiceCapability | undefined = (args.serviceMap as any)[\n ref.serviceId\n ];\n\n // IMPORTANT (per your 1:A): unknown services are INCLUDED; where-filter only applies when svc exists.\n if (where && svc && !matchesWhere(svc as any, where)) return;\n\n pushItem(out, {\n ...ref,\n service: svcSnapshot(args.serviceMap, ref.serviceId),\n });\n };\n\n // ────────────────────────────────────────────────────────────────\n // 1) TAG SERVICES (tag.service_id)\n // ────────────────────────────────────────────────────────────────\n if (args.mode === \"global\") {\n for (const t of args.tags ?? []) {\n const sid: unknown = (t as any).service_id;\n if (!isServiceIdRef(sid)) continue;\n\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n } else if (args.mode === \"visible_group\") {\n const t: Tag | undefined = args.tag;\n const sid: unknown = t ? (t as any).service_id : undefined;\n\n if (t && isServiceIdRef(sid)) {\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 2) FIELD SERVICES (field.service_id) + OPTION SERVICES\n // - fields can be button fields with service_id\n // - multi-field options can map to services\n // ────────────────────────────────────────────────────────────────\n const fields: readonly Field[] = args.fields ?? [];\n\n for (const f of fields) {\n // field.service_id (button field)\n const fSid: unknown = (f as any).service_id;\n if (isServiceIdRef(fSid)) {\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n serviceId: fSid,\n role: \"base\",\n affectedIds: [`field:${f.id}`, `service:${String(fSid)}`],\n });\n }\n\n // option services\n for (const o of f.options ?? []) {\n const oSid: unknown = (o as any).service_id;\n if (!isServiceIdRef(oSid)) continue;\n\n const role: \"base\" | \"utility\" = fieldRoleOf(f, o);\n\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n optionId: o.id,\n serviceId: oSid,\n role,\n affectedIds: [\n `field:${f.id}`,\n `option:${o.id}`,\n `service:${String(oSid)}`,\n ],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 3) FALLBACK SERVICES (node + global)\n // Global: include ALL fallbacks everywhere\n // Visible group: include:\n // - nodes fallbacks for visibleNodeIds (tag + visible option ids)\n // - global fallbacks for visiblePrimaries (primary ids in group)\n // ────────────────────────────────────────────────────────────────\n const fb: ServiceProps[\"fallbacks\"] | undefined = args.props.fallbacks;\n if (!fb) return Array.from(out.values());\n\n const addFallbackNode = (nodeId: string, list: unknown): void => {\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId,\n serviceId: cand,\n role: \"base\",\n affectedIds: [`fallback-node:${nodeId}`, `service:${String(cand)}`],\n });\n }\n };\n\n const addFallbackGlobal = (primaryKey: string, list: unknown): void => {\n const primaryId: IdType = primaryKey;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: primaryId,\n role: \"base\",\n affectedIds: [\n `fallback-global-primary:${primaryKey}`,\n `service:${String(primaryId)}`,\n ],\n });\n\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: cand,\n role: \"base\",\n affectedIds: [\n `fallback-global:${primaryKey}`,\n `service:${String(cand)}`,\n ],\n });\n }\n };\n\n const includeAllFallbacks: boolean = args.mode === \"global\";\n const includeGroupFallbacks: boolean = args.mode === \"visible_group\";\n\n // node-scoped fallbacks\n const nodes: Record<string, IdType[] | undefined> | undefined =\n fb.nodes && typeof fb.nodes === \"object\"\n ? (fb.nodes as any)\n : undefined;\n\n if (nodes) {\n if (includeAllFallbacks) {\n for (const [nodeId, list] of Object.entries(nodes)) {\n addFallbackNode(nodeId, list);\n }\n } else if (includeGroupFallbacks) {\n const allowNodes: Set<string> = new Set<string>(\n Array.isArray(args.visibleNodeIds)\n ? (args.visibleNodeIds as string[])\n : [],\n );\n\n for (const nodeId of allowNodes) {\n addFallbackNode(nodeId, (nodes as any)[nodeId]);\n }\n }\n }\n\n // global fallbacks: primary -> candidates\n const globalFb: Record<string, IdType[] | undefined> | undefined =\n fb.global && typeof fb.global === \"object\"\n ? (fb.global as any)\n : undefined;\n\n if (globalFb) {\n if (includeAllFallbacks) {\n for (const [primaryKey, list] of Object.entries(globalFb)) {\n addFallbackGlobal(primaryKey, list);\n }\n } else if (includeGroupFallbacks) {\n const allowPrimaries: Set<string> = new Set<string>(\n (args.visiblePrimaries ?? []).map((x) => String(x)),\n );\n\n for (const primaryKey of allowPrimaries) {\n const list: unknown = (globalFb as any)[primaryKey];\n if (list === undefined) continue;\n addFallbackGlobal(primaryKey, list);\n }\n }\n }\n\n return Array.from(out.values());\n}\n","// src/core/validate/policies/ops.ts\nimport type { DynamicRule } from \"@/schema/validation\";\n\nexport function evalPolicyOp(\n op: DynamicRule[\"op\"],\n values: unknown[],\n rule: DynamicRule,\n): boolean {\n switch (op) {\n case \"all_equal\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"no_mix\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"unique\": {\n const seen: Set<string> = new Set<string>();\n for (const v of values) {\n const k: string = JSON.stringify(v);\n if (seen.has(k)) return false;\n seen.add(k);\n }\n return true;\n }\n case \"all_true\": {\n return values.every((v) => v === true);\n }\n case \"any_true\": {\n return values.some((v) => v === true);\n }\n case \"max_count\": {\n const limit: number =\n typeof rule.value === \"number\" ? rule.value : Infinity;\n return values.length <= limit;\n }\n case \"min_count\": {\n const min: number = typeof rule.value === \"number\" ? rule.value : 0;\n return values.length >= min;\n }\n default:\n return true;\n }\n}\n","// src/core/validate/policies/apply-policies.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap, IdType } from \"@/schema/provider\";\nimport type { DynamicRule, ValidationError } from \"@/schema/validation\";\n\nimport { getByPath } from \"../shared\";\nimport { collectServiceItems, type ServiceItem } from \"./collect-service-items\";\nimport { evalPolicyOp } from \"./ops\";\n\nfunction uniq<T>(arr: readonly T[]): T[] {\n return Array.from(new Set<T>(arr));\n}\n\nfunction stableSeverity(\n s: DynamicRule[\"severity\"] | undefined,\n): \"error\" | \"warning\" | \"info\" {\n if (s === \"warning\") return \"warning\";\n if (s === \"error\") return \"error\";\n return \"error\";\n}\n\nfunction defaultPolicyMessage(rule: DynamicRule): string {\n if (typeof rule.message === \"string\" && rule.message.trim())\n return rule.message;\n if (typeof rule.label === \"string\" && rule.label.trim())\n return rule.label.trim();\n return `Policy \"${rule.id}\" violated`;\n}\n\nfunction affectedFromItems(items: readonly ServiceItem[]): string[] {\n const ids: string[] = [];\n for (const it of items) {\n for (const x of it.affectedIds ?? []) ids.push(x);\n ids.push(`service:${String(it.serviceId)}`);\n }\n return uniq(ids);\n}\n\nfunction visibleGroupNodeIds(tag: Tag, fields: readonly Field[]): string[] {\n const ids: string[] = [tag.id];\n\n for (const f of fields) {\n for (const o of f.options ?? []) {\n ids.push(o.id);\n }\n }\n\n return uniq(ids);\n}\n\nfunction visibleGroupPrimaries(tag: Tag, fields: readonly Field[]): IdType[] {\n const prim: IdType[] = [];\n\n const tagSid: unknown = (tag as any).service_id;\n if (\n typeof tagSid === \"string\" ||\n (typeof tagSid === \"number\" && Number.isFinite(tagSid))\n ) {\n prim.push(tagSid);\n }\n\n for (const f of fields) {\n const fsid: unknown = (f as any).service_id;\n if (\n typeof fsid === \"string\" ||\n (typeof fsid === \"number\" && Number.isFinite(fsid))\n ) {\n prim.push(fsid);\n }\n\n for (const o of f.options ?? []) {\n const osid: unknown = (o as any).service_id;\n if (\n typeof osid === \"string\" ||\n (typeof osid === \"number\" && Number.isFinite(osid))\n ) {\n prim.push(osid);\n }\n }\n }\n\n return uniq(prim);\n}\n\nexport function applyPolicies(\n errors: ValidationError[],\n props: ServiceProps,\n serviceMap: DgpServiceMap,\n policies: DynamicRule[] | undefined,\n fieldsVisibleUnder: (tagId: string) => Field[],\n tags: Tag[],\n): void {\n if (!policies?.length) return;\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n for (const t of tags) tagById.set(t.id, t);\n\n for (const rule of policies) {\n const projPath: string = rule.projection ?? \"service.id\";\n const severity: \"error\" | \"warning\" | \"info\" = stableSeverity(\n rule.severity,\n );\n const message: string = defaultPolicyMessage(rule);\n\n // ────────────────────────────────────────────────────────────────\n // GLOBAL: \"all services - everywhere, anywhere\"\n // - includes tags, fields (field.service_id + option.service_id), fallbacks (nodes + global)\n // - if rule.filter.tag_id is present, global becomes \"union of those visible groups\"\n // (still strict within the selected universe)\n // ────────────────────────────────────────────────────────────────\n if (rule.scope === \"global\") {\n const tagAllow: readonly string[] | undefined = Array.isArray(\n rule.filter?.tag_id,\n )\n ? (rule.filter?.tag_id as string[])\n : rule.filter?.tag_id\n ? [rule.filter.tag_id as string]\n : undefined;\n\n let items: ServiceItem[] = [];\n\n if (tagAllow && tagAllow.length) {\n // Union of selected visible-groups (including tag itself + group fallbacks)\n const merged: Map<string, ServiceItem> = new Map<\n string,\n ServiceItem\n >();\n\n for (const id of tagAllow) {\n const t: Tag | undefined = tagById.get(id);\n if (!t) continue;\n\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n const nodeIds: string[] = visibleGroupNodeIds(\n t,\n visibleFields,\n );\n const primaries: IdType[] = visibleGroupPrimaries(\n t,\n visibleFields,\n );\n\n const sub: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n for (const it of sub) {\n const k: string = `${String(it.serviceId)}|${it.role}`;\n const existing: ServiceItem | undefined = merged.get(k);\n if (!existing) {\n merged.set(k, it);\n } else {\n merged.set(k, {\n ...existing,\n affectedIds: uniq([\n ...existing.affectedIds,\n ...it.affectedIds,\n ]),\n });\n }\n }\n }\n\n items = Array.from(merged.values());\n } else {\n // Truly everything, anywhere:\n const allFields: Field[] = props.fields ?? [];\n\n items = collectServiceItems({\n mode: \"global\",\n props,\n serviceMap,\n tags,\n fields: allFields,\n filter: rule.filter,\n });\n }\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: \"global\",\n details: {\n ruleId: rule.id,\n scope: \"global\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n\n continue;\n }\n\n // ────────────────────────────────────────────────────────────────\n // VISIBLE GROUP: \"all current visible nodes under tagId including the tag\"\n // + include node-scoped fallbacks for the tag + visible option ids\n // + include global fallbacks for primaries present in that group\n // ────────────────────────────────────────────────────────────────\n for (const t of tags) {\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n\n const nodeIds: string[] = visibleGroupNodeIds(t, visibleFields);\n const primaries: IdType[] = visibleGroupPrimaries(t, visibleFields);\n\n const items: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n if (!items.length) continue;\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: t.id,\n details: {\n ruleId: rule.id,\n scope: \"visible_group\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n }\n }\n}\n","import type { FallbackSettings, RatePolicy, ValidatorOptions } from \"@/schema\";\nimport { normalizeRatePolicy } from \"@/utils/util\";\n\nexport const DEFAULT_FALLBACK_SETTINGS: Readonly<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\nexport function resolveGlobalRatePolicy(\n options: Pick<ValidatorOptions, \"ratePolicy\">,\n): RatePolicy {\n return normalizeRatePolicy(options.ratePolicy);\n}\n\nexport function resolveFallbackSettings(\n options: Pick<ValidatorOptions, \"fallbackSettings\">,\n): FallbackSettings {\n return {\n ...DEFAULT_FALLBACK_SETTINGS,\n ...(options.fallbackSettings ?? {}),\n };\n}\n\nexport function mergeValidatorOptions(\n defaults: ValidatorOptions = {},\n overrides: ValidatorOptions = {},\n): ValidatorOptions {\n const mergedFallbackSettings = {\n ...(defaults.fallbackSettings ?? {}),\n ...(overrides.fallbackSettings ?? {}),\n };\n\n return {\n ...defaults,\n ...overrides,\n policies: overrides.policies ?? defaults.policies,\n ratePolicy: overrides.ratePolicy ?? defaults.ratePolicy,\n fallbackSettings:\n Object.keys(mergedFallbackSettings).length > 0\n ? mergedFallbackSettings\n : undefined,\n };\n}\n","// src/core/builder.ts\nimport {normalise} from \"./normalise\";\nimport {validate} from \"./validate\";\nimport { mergeValidatorOptions } from \"@/core/governance\";\n\nimport type {\n DgpServiceMap,\n EdgeKind,\n Field,\n GraphEdge,\n GraphNode,\n GraphSnapshot,\n NodeKind,\n ServiceProps,\n Tag,\n ValidationError,\n ValidatorOptions,\n} from \"@/schema\";\nimport {visibleFieldIdsUnder} from \"@/core/visibility\";\nimport {buildNodeMap, NodeMap} from \"@/core/node-map\";\nimport {cloneDeep} from \"lodash-es\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\n /**\n * Field ids whose options should be shown as nodes in the graph.\n * If a field id is NOT in this set, its options are not materialized as nodes:\n * - include/exclude wires keyed by an option id will be drawn from the FIELD instead.\n */\n showOptionNodes?: Set<string> | string[];\n};\n\nexport interface Builder {\n /** Replace current payload (injects root if missing, rebuilds indexes) */\n load(props: ServiceProps): void;\n\n /** Graph for visualisation */\n tree(): GraphSnapshot;\n\n /** Deterministic save payload (drops unbound utility fields, prunes dead maps) */\n cleanedProps(): ServiceProps;\n\n /** Validation errors for current state */\n errors(): ValidationError[];\n\n /**\n * Compute IDs of fields visible under a tag.\n * If selectedOptionKeys provided, applies option-level include/exclude.\n * NOTE: keys are “button ids”: either option.id or field.id for option-less buttons.\n */\n visibleFields(tagId: string, selectedOptionKeys?: string[]): string[];\n\n /** Update builder options (validator context etc.) */\n setOptions(patch: Partial<BuilderOptions>): void;\n\n /** Access the current props (already normalised) */\n getProps(): ServiceProps;\n\n /** Service map for validation/rules */\n getServiceMap(): DgpServiceMap;\n getOptions(): BuilderOptions;\n\n getConstraints(): {\n id: string;\n label: string;\n description: string;\n value: string;\n }[];\n\n isTagId(id: string): boolean;\n isFieldId(id: string): boolean;\n isOptionId(id: string): boolean;\n getNodeMap(): NodeMap;\n}\n\nexport function createBuilder(opts: BuilderOptions = {}): Builder {\n return new BuilderImpl(opts);\n}\n\n/* ────────────────────────────────────────────────────────────────────────── */\n\nclass BuilderImpl implements Builder {\n private props: ServiceProps = {\n filters: [],\n fields: [],\n schema_version: \"1.0\",\n };\n private tagById = new Map<string, Tag>();\n private fieldById = new Map<string, Field>();\n private optionOwnerById = new Map<string, { fieldId: string }>(); // option.id → fieldId\n\n private options: BuilderOptions;\n private _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n isTagId(id: string) {\n return this.tagById.has(id);\n }\n isFieldId(id: string) {\n return this.fieldById.has(id);\n }\n isOptionId(id: string) {\n return this.optionOwnerById.has(id);\n }\n\n load(raw: ServiceProps): void {\n const next = normalise(raw, {\n defaultPricingRole: \"base\",\n constraints: this.getConstraints().map((item) => item.label),\n });\n this.props = next;\n this.rebuildIndexes();\n }\n\n getProps(): ServiceProps {\n return this.props;\n }\n\n setOptions(patch: Partial<BuilderOptions>): void {\n this.options = { ...this.options, ...patch };\n }\n\n getServiceMap(): DgpServiceMap {\n return this.options.serviceMap ?? {};\n }\n\n getConstraints() {\n const serviceMap = this.getServiceMap();\n\n const out = new Set<{\n label: string;\n id: string;\n value: string;\n description: string;\n }>();\n const guard = new Set<string>();\n\n for (const svc of Object.values(serviceMap)) {\n const flags = svc.flags ?? {};\n for (const flagId of Object.keys(flags)) {\n if (guard.has(flagId)) continue;\n guard.add(flagId);\n out.add({\n id: flagId,\n value: flagId,\n label: flagId,\n description: flags[flagId].description,\n });\n }\n }\n\n // if you want deterministic ordering in UI:\n return Array.from(out);\n }\n\n /* ───── querying ─────────────────────────────────────────────────────── */\n\n tree(): GraphSnapshot {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const showSet = toStringSet(this.options.showOptionNodes);\n\n // 1) tags as nodes\n for (const t of this.props.filters) {\n nodes.push({ id: t.id, kind: \"tag\" as NodeKind, label: t.label });\n }\n\n // 2) tag hierarchy edges\n for (const t of this.props.filters) {\n if (t.bind_id) {\n edges.push({\n from: t.bind_id,\n to: t.id,\n kind: \"child\" as EdgeKind,\n });\n }\n }\n\n // 3) fields as nodes\n for (const f of this.props.fields) {\n nodes.push({\n id: f.id,\n kind: \"field\" as NodeKind,\n label: f.label,\n bind_type:\n f.pricing_role === \"utility\"\n ? \"utility\"\n : f.bind_id\n ? \"bound\"\n : null,\n });\n }\n\n // 4) field bind edges\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) {\n for (const tagId of b)\n edges.push({\n from: tagId,\n to: f.id,\n kind: \"bind\" as EdgeKind,\n });\n } else if (typeof b === \"string\") {\n edges.push({ from: b, to: f.id, kind: \"bind\" as EdgeKind });\n }\n }\n\n // 5) Option nodes (only for fields in showOptionNodes)\n for (const f of this.props.fields) {\n const showOptions = showSet.has(f.id);\n if (!showOptions) continue;\n if (!Array.isArray(f.options)) continue;\n\n for (const o of f.options) {\n nodes.push({\n id: o.id,\n kind: \"option\",\n label: o.label,\n });\n // field → option edge\n const e: any = {\n from: f.id,\n to: o.id,\n kind: \"option\" as EdgeKind,\n meta: { ownerField: f.id },\n };\n edges.push(e as GraphEdge);\n }\n }\n\n // 6) tag includes/excludes\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"include\" as EdgeKind });\n }\n for (const id of t.excludes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"exclude\" as EdgeKind });\n }\n }\n\n // 7) button-level includes/excludes (keys are button IDs: option.id OR field.id)\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n\n const pushButtonEdge = (\n keyId: string,\n targetFieldId: string,\n kind: EdgeKind,\n ) => {\n const owner = this.optionOwnerById.get(keyId);\n const ownerFieldId =\n owner?.fieldId ??\n (this.fieldById.has(keyId) ? keyId : undefined);\n if (!ownerFieldId) return; // dangling key, ignore\n\n // If the key is an option AND its field is being shown, draw from the option\n const fromNode =\n owner && showSet.has(owner.fieldId)\n ? keyId // option node → visible, draw from option\n : ownerFieldId; // else draw from the field\n\n const meta: any = owner\n ? showSet.has(owner.fieldId)\n ? {\n via: \"option-visible\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : {\n via: \"option-hidden\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : { via: \"field-button\" };\n\n const e: any = { from: fromNode, to: targetFieldId, kind, meta };\n edges.push(e as GraphEdge);\n };\n\n for (const [keyId, arr] of Object.entries(incMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"include\" as EdgeKind);\n }\n for (const [keyId, arr] of Object.entries(excMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"exclude\" as EdgeKind);\n }\n\n return { nodes, edges };\n }\n\n cleanedProps(): ServiceProps {\n // Build quick indexes\n const fieldIds = new Set(this.props.fields.map((f) => f.id));\n const optionIds = new Set<string>();\n this.optionOwnerById.forEach((_v, oid) => optionIds.add(oid));\n\n // 1) drop utility fields that are truly \"orphaned\"\n // (unbound + not included by tag or button includes + not referenced as a key)\n const includedByTag = new Set<string>();\n const excludedAnywhere = new Set<string>();\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n for (const id of t.excludes ?? []) excludedAnywhere.add(id);\n }\n\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n const includedByButtons = new Set<string>(); // field ids that might be pulled in\n const referencedKeys = new Set<string>(); // keys in maps (field button or option id)\n const referencedOwnerFields = new Set<string>();\n\n for (const [key, arr] of Object.entries(incMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n includedByButtons.add(fid);\n }\n }\n for (const [key, arr] of Object.entries(excMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n // exclusion targets don’t “include”, but record that these field ids are referenced\n // (so we don’t accidentally drop something host intentionally excludes/controls)\n // not strictly necessary, but conservative:\n void fid;\n }\n }\n\n const boundIds = new Set<string>();\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) b.forEach((id) => boundIds.add(id));\n else if (typeof b === \"string\") boundIds.add(b);\n }\n\n const fields = this.props.fields.filter((f) => {\n const isUtility = (f.pricing_role ?? \"base\") === \"utility\";\n if (!isUtility) return true;\n\n const bound = !!f.bind_id;\n const included =\n includedByTag.has(f.id) || includedByButtons.has(f.id);\n const referenced =\n referencedOwnerFields.has(f.id) || referencedKeys.has(f.id);\n const excluded = excludedAnywhere.has(f.id);\n\n // keep if bound OR included OR referenced by maps; drop if truly orphaned or globally excluded\n return bound || included || referenced || !excluded;\n });\n\n // 2) prune button maps: keep only valid keys and existing field targets\n const allowedTargets = new Set(fields.map((f) => f.id)); // targets must be existing fields\n\n const pruneButtons = (src?: Record<string, string[]>) => {\n if (!src) return undefined;\n const out: Record<string, string[]> = {};\n for (const [key, arr] of Object.entries(src)) {\n // key must be an existing option.id OR field.id\n const keyIsValid = optionIds.has(key) || fieldIds.has(key);\n if (!keyIsValid) continue;\n\n const cleaned = (arr ?? []).filter((fid) =>\n allowedTargets.has(fid),\n );\n if (cleaned.length) out[key] = Array.from(new Set(cleaned));\n }\n return Object.keys(out).length ? out : undefined;\n };\n\n const includes_for_buttons = pruneButtons(\n this.props.includes_for_buttons,\n );\n const excludes_for_buttons = pruneButtons(\n this.props.excludes_for_buttons,\n );\n\n // 3) return canonical object\n const out: ServiceProps = {\n filters: this.props.filters.slice(),\n fields,\n ...(includes_for_buttons && { includes_for_buttons }),\n ...(excludes_for_buttons && { excludes_for_buttons }),\n schema_version: this.props.schema_version ?? \"1.0\",\n // keep fallbacks & other maps as-is\n ...(this.props.fallbacks\n ? { fallbacks: this.props.fallbacks }\n : {}),\n };\n return out;\n }\n\n errors(): ValidationError[] {\n return validate(this.props, mergeValidatorOptions({}, this.options));\n }\n\n getOptions(): BuilderOptions {\n return cloneDeep(this.options);\n }\n\n visibleFields(tagId: string, selectedKeys?: string[]): string[] {\n return visibleFieldIdsUnder(this.props, tagId, {\n selectedKeys: new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n ),\n });\n }\n\n getNodeMap(): NodeMap {\n if (!this._nodemap) this._nodemap = buildNodeMap(this.getProps());\n ///--\n return this._nodemap;\n }\n\n /* ───── internals ──────────────────────────────────────────────────── */\n\n private rebuildIndexes(): void {\n this.tagById.clear();\n this.fieldById.clear();\n this.optionOwnerById.clear();\n this._nodemap = null;\n\n for (const t of this.props.filters) this.tagById.set(t.id, t);\n for (const f of this.props.fields) {\n this.fieldById.set(f.id, f);\n if (Array.isArray(f.options)) {\n for (const o of f.options)\n this.optionOwnerById.set(o.id, { fieldId: f.id });\n }\n }\n }\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\nfunction toStringSet(v: Set<string> | string[] | undefined): Set<string> {\n if (!v) return new Set();\n if (v instanceof Set) return new Set(Array.from(v).map(String));\n return new Set((v as string[]).map(String));\n}\n","import type {\n DgpServiceMap,\n Field,\n PricingRole,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { RatePolicy } from \"@/schema/validation\";\nimport { Builder } from \"./builder\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\nimport { isMultiField } from \"@/utils\";\n\ntype BaseMember = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n service_id: ServiceIdRef;\n rate: number;\n};\n\ntype FieldReference = {\n refKind: \"single\" | \"multi\";\n nodeId: string;\n fieldId: string;\n label?: string;\n rate: number;\n service_id?: ServiceIdRef;\n members: BaseMember[];\n};\n\ntype Anchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SimulationAnchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SharedDiagnostic = {\n scope: \"visible_group\";\n tagId: string;\n nodeId: string;\n message: string;\n simulationAnchor?: SimulationAnchor;\n invalidFieldIds: string[];\n};\n\nexport type RateCoherenceDiagnostic =\n | (SharedDiagnostic & {\n kind: \"contextual\";\n primary: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n offender: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n policy: RatePolicy[\"kind\"];\n policyPct?: number;\n })\n | (SharedDiagnostic & {\n kind: \"internal_field\";\n fieldId: string;\n });\n\nexport function validateRateCoherenceDeep(params: {\n builder: Builder;\n services: DgpServiceMap;\n tagId: string;\n ratePolicy?: RatePolicy;\n invalidFieldIds?: Iterable<string>;\n}): RateCoherenceDiagnostic[] {\n const { builder, services, tagId } = params;\n const ratePolicy = normalizeRatePolicy(params.ratePolicy);\n const props = builder.getProps() as ServiceProps;\n const invalidFieldIds = new Set(params.invalidFieldIds ?? []);\n\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const tagById = new Map((props.filters ?? []).map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n const baselineFieldIds = builder.visibleFields(tagId, []);\n const baselineFields = baselineFieldIds\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const anchors = collectAnchors(baselineFields);\n const diagnostics: RateCoherenceDiagnostic[] = [];\n const seen = new Set<string>();\n\n for (const anchor of anchors) {\n const selectedKeys =\n anchor.kind === \"option\"\n ? [`${anchor.fieldId}::${anchor.id}`]\n : [anchor.fieldId];\n\n const visibleFields = builder\n .visibleFields(tagId, selectedKeys)\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const visibleInvalidFieldIds = visibleFields\n .map((field) => field.id)\n .filter((fieldId) => invalidFieldIds.has(fieldId));\n\n for (const fieldId of visibleInvalidFieldIds) {\n const key = `internal|${tagId}|${fieldId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n kind: \"internal_field\",\n scope: \"visible_group\",\n tagId,\n fieldId,\n nodeId: fieldId,\n message: `Field \"${fieldId}\" is internally invalid under rate policy \"${ratePolicy.kind}\".`,\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: [fieldId],\n });\n }\n\n const references = visibleFields.flatMap((field) =>\n collectFieldReferences(field, services),\n );\n if (references.length <= 1) continue;\n\n const primary = references.reduce((best, current) => {\n if (current.rate !== best.rate) {\n return current.rate > best.rate ? current : best;\n }\n const bestKey = `${best.fieldId}|${best.nodeId}`;\n const currentKey = `${current.fieldId}|${current.nodeId}`;\n return currentKey < bestKey ? current : best;\n });\n\n for (const candidate of references) {\n if (candidate.nodeId === primary.nodeId) continue;\n if (candidate.fieldId === primary.fieldId) continue;\n if (passesRatePolicy(ratePolicy, primary.rate, candidate.rate)) {\n continue;\n }\n\n const key = contextualKey(tagId, primary, candidate, ratePolicy);\n if (seen.has(key)) continue;\n seen.add(key);\n\n diagnostics.push({\n kind: \"contextual\",\n scope: \"visible_group\",\n tagId,\n nodeId: candidate.nodeId,\n primary: toDiagnosticRef(primary),\n offender: toDiagnosticRef(candidate),\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n message: explainRateMismatch(\n ratePolicy,\n primary,\n candidate,\n describeLabel(tag),\n ),\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: visibleInvalidFieldIds,\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction collectAnchors(fields: Field[]): Anchor[] {\n const anchors: Anchor[] = [];\n\n for (const field of fields) {\n if (!isButton(field)) continue;\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n anchors.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n });\n }\n continue;\n }\n\n anchors.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n });\n }\n\n return anchors;\n}\n\nfunction collectFieldReferences(\n field: Field,\n services: DgpServiceMap,\n): FieldReference[] {\n const members = collectBaseMembers(field, services);\n if (members.length === 0) return [];\n\n if (isMultiField(field)) {\n const averageRate =\n members.reduce((sum, member) => sum + member.rate, 0) /\n members.length;\n return [\n {\n refKind: \"multi\",\n nodeId: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n rate: averageRate,\n members,\n },\n ];\n }\n\n return members.map((member) => ({\n refKind: \"single\",\n nodeId: member.id,\n fieldId: field.id,\n label: member.label,\n rate: member.rate,\n service_id: member.service_id,\n members: [member],\n }));\n}\n\nfunction collectBaseMembers(\n field: Field,\n services: DgpServiceMap,\n): BaseMember[] {\n const members: BaseMember[] = [];\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n const role = normalizeRole(option.pricing_role ?? field.pricing_role, \"base\");\n if (role !== \"base\") continue;\n if (option.service_id === undefined || option.service_id === null) {\n continue;\n }\n const cap = getServiceCapability(services, option.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n continue;\n }\n members.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n service_id: option.service_id,\n rate: cap.rate,\n });\n }\n return members;\n }\n\n const role = normalizeRole(field.pricing_role, \"base\");\n if (role !== \"base\") return members;\n if (field.service_id === undefined || field.service_id === null) return members;\n\n const cap = getServiceCapability(services, field.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n return members;\n }\n\n members.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n service_id: field.service_id,\n rate: cap.rate,\n });\n return members;\n}\n\nfunction isButton(field: Field): boolean {\n if ((field as any).button === true) return true;\n return Array.isArray(field.options) && field.options.length > 0;\n}\n\nfunction normalizeRole(\n role: PricingRole | undefined,\n fallback: PricingRole,\n): PricingRole {\n return role === \"base\" || role === \"utility\" ? role : fallback;\n}\n\nfunction toDiagnosticRef(reference: FieldReference) {\n return {\n nodeId: reference.nodeId,\n fieldId: reference.fieldId,\n label: reference.label,\n refKind: reference.refKind,\n service_id: reference.service_id,\n rate: reference.rate,\n };\n}\n\nfunction contextualKey(\n tagId: string,\n primary: FieldReference,\n candidate: FieldReference,\n ratePolicy: RatePolicy,\n): string {\n const pctKey = \"pct\" in ratePolicy ? `:${ratePolicy.pct}` : \"\";\n return [\n \"contextual\",\n tagId,\n primary.fieldId,\n primary.nodeId,\n candidate.fieldId,\n candidate.nodeId,\n `${ratePolicy.kind}${pctKey}`,\n ].join(\"|\");\n}\n\nfunction describeLabel(tag?: Tag): string {\n return tag?.label ?? tag?.id ?? \"tag\";\n}\n\nfunction explainRateMismatch(\n policy: RatePolicy,\n primary: FieldReference,\n candidate: FieldReference,\n where: string,\n): string {\n const primaryLabel = `${primary.label ?? primary.nodeId} (${primary.rate})`;\n const candidateLabel = `${candidate.label ?? candidate.nodeId} (${candidate.rate})`;\n\n switch (policy.kind) {\n case \"eq_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must exactly match ${primaryLabel}.`;\n case \"lte_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must stay within ${policy.pct}% below and never above ${primaryLabel}.`;\n case \"within_pct\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be within ${policy.pct}% of ${primaryLabel}.`;\n case \"at_least_pct_lower\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be at least ${policy.pct}% lower than ${primaryLabel}.`;\n }\n}\n","// src/core/validate/index.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nimport {\n createFieldsVisibleUnder,\n validateVisibility,\n} from \"./steps/visibility\";\nimport { validateStructure } from \"./steps/structure\";\nimport { validateIdentity } from \"./steps/identity\";\nimport { validateOptionMaps } from \"./steps/option-maps\";\nimport { validateServiceVsUserInput } from \"./steps/service-vs-input\";\nimport { validateUtilityMarkers } from \"./steps/utility\";\nimport { validateRates } from \"./steps/rates\";\nimport { validateConstraints } from \"./steps/constraints\";\nimport { validateCustomFields } from \"./steps/custom\";\nimport { validateGlobalUtilityGuard } from \"./steps/global-utility-guard\";\nimport { validateUnboundFields } from \"./steps/unbound\";\nimport { validateFallbacks } from \"./steps/fallbacks\";\n\nimport { applyPolicies } from \"./policies/apply-policies\";\nimport type { ValidationCtx } from \"./shared\";\nimport { buildNodeMap } from \"@/core/node-map\";\nimport { createBuilder } from \"@/core/builder\";\nimport { validateRateCoherenceDeep } from \"@/core/rate-coherence\";\nimport {\n mergeValidatorOptions,\n resolveFallbackSettings,\n resolveGlobalRatePolicy,\n} from \"@/core/governance\";\n\n/**\n * We read simulation options from ctx without changing the public ValidatorOptions type.\n * (So UI can pass these without needing schema/type changes immediately.)\n */\ntype VisibilitySimOpts = Readonly<{\n simulate?: boolean;\n maxStates?: number;\n maxDepth?: number;\n simulateAllRoots?: boolean;\n onlyEffectfulTriggers?: boolean;\n}>;\n\nfunction readVisibilitySimOpts(ctx: ValidatorOptions): VisibilitySimOpts {\n const c = ctx as any;\n\n const simulate =\n c.simulateVisibility === true ||\n c.visibilitySimulate === true ||\n c.simulate === true;\n\n const maxStates =\n typeof c.maxVisibilityStates === \"number\"\n ? c.maxVisibilityStates\n : typeof c.visibilityMaxStates === \"number\"\n ? c.visibilityMaxStates\n : typeof c.maxStates === \"number\"\n ? c.maxStates\n : undefined;\n\n const maxDepth =\n typeof c.maxVisibilityDepth === \"number\"\n ? c.maxVisibilityDepth\n : typeof c.visibilityMaxDepth === \"number\"\n ? c.visibilityMaxDepth\n : typeof c.maxDepth === \"number\"\n ? c.maxDepth\n : undefined;\n\n const simulateAllRoots =\n c.simulateAllRoots === true || c.visibilitySimulateAllRoots === true;\n\n const onlyEffectfulTriggers =\n c.onlyEffectfulTriggers === false\n ? false\n : c.visibilityOnlyEffectfulTriggers !== false; // default true\n\n return {\n simulate,\n maxStates,\n maxDepth,\n simulateAllRoots,\n onlyEffectfulTriggers,\n };\n}\n\n/**\n * Core synchronous validate.\n */\nexport function validate(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): ValidationError[] {\n const options = mergeValidatorOptions({}, ctx);\n const fallbackSettings = resolveFallbackSettings(options);\n const ratePolicy = resolveGlobalRatePolicy(options);\n\n const errors: ValidationError[] = [];\n const serviceMap: DgpServiceMap = options.serviceMap ?? {};\n const selectedKeys: Set<string> = new Set<string>(\n options.selectedOptionKeys ?? [],\n );\n\n const tags: Tag[] = Array.isArray(props.filters) ? props.filters : [];\n const fields: Field[] = Array.isArray(props.fields) ? props.fields : [];\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n const fieldById: Map<string, Field> = new Map<string, Field>();\n\n for (const t of tags) tagById.set(t.id, t);\n for (const f of fields) fieldById.set(f.id, f);\n\n const v: ValidationCtx = {\n props,\n nodeMap: options.nodeMap ?? buildNodeMap(props),\n options: {\n ...options,\n ratePolicy,\n fallbackSettings,\n },\n errors,\n serviceMap,\n selectedKeys,\n tags,\n fields,\n invalidRateFieldIds: new Set<string>(),\n tagById,\n fieldById,\n fieldsVisibleUnder: (_tagId: string): Field[] => [],\n };\n\n // 1) structure\n validateStructure(v);\n\n // 2) identity + labels\n validateIdentity(v);\n\n // 3) option maps\n validateOptionMaps(v);\n\n // 4) visibility helpers + visibility rules (optionally simulated)\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n\n const visSim = readVisibilitySimOpts(options);\n validateVisibility(v, visSim);\n\n // --------- Dynamic policies (super-admin) --------------------------\n applyPolicies(\n v.errors,\n v.props,\n v.serviceMap,\n v.options.policies,\n v.fieldsVisibleUnder,\n v.tags,\n );\n\n // 5) service vs user-input rules\n validateServiceVsUserInput(v);\n\n // 6) utility marker rules\n validateUtilityMarkers(v);\n\n // 7) rates & pricing roles\n validateRates(v);\n\n if (Object.keys(serviceMap).length > 0 && tags.length > 0) {\n const builder = createBuilder({ serviceMap });\n builder.load(props);\n\n for (const tag of tags) {\n const diags = validateRateCoherenceDeep({\n builder,\n services: serviceMap,\n tagId: tag.id,\n ratePolicy: ratePolicy,\n invalidFieldIds: v.invalidRateFieldIds,\n });\n\n for (const diag of diags) {\n if (diag.kind !== \"contextual\") continue;\n errors.push({\n code: \"rate_coherence_violation\",\n severity: \"error\",\n message: diag.message,\n nodeId: diag.nodeId,\n details: {\n tagId: diag.tagId,\n simulationAnchor: diag.simulationAnchor,\n primary: diag.primary,\n offender: diag.offender,\n policy: diag.policy,\n policyPct: diag.policyPct,\n invalidFieldIds: diag.invalidFieldIds,\n },\n });\n }\n }\n }\n\n // 8) constraints vs capabilities + inheritance\n validateConstraints(v);\n\n // 9) custom field rules\n validateCustomFields(v);\n\n // 10) optional global utility guard\n validateGlobalUtilityGuard(v);\n\n // 11) unbound fields\n validateUnboundFields(v);\n\n // 12) fallbacks strict-mode conversion\n validateFallbacks(v);\n\n return v.errors;\n}\n\n/**\n * UI-friendly async wrapper:\n * - yields to microtask queue\n * - then yields to the next animation frame (so paint can happen)\n * - then runs validate()\n */\nexport async function validateAsync(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): Promise<ValidationError[]> {\n // microtask yield\n await Promise.resolve();\n\n // next paint/frame yield (browser environments)\n if (typeof requestAnimationFrame === \"function\") {\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n } else {\n // non-browser fallback\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n }\n\n return validate(props, ctx);\n}\n","// src/core/utils/fallback.ts\r\nimport type {\r\n ServiceProps,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n NodeIdRef,\r\n} from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\r\nexport type FailedFallbackContext = {\r\n scope: \"node\" | \"global\";\r\n nodeId?: string; // when scope='node'\r\n primary: ServiceIdRef;\r\n candidate: ServiceIdRef;\r\n tagContext?: string; // tag.id when evaluating constraints\r\n reason:\r\n | \"unknown_service\"\r\n | \"no_primary\"\r\n | \"rate_violation\"\r\n | \"constraint_mismatch\"\r\n | \"cycle\"\r\n | \"no_tag_context\";\r\n details?: Record<string, unknown>;\r\n};\r\n\r\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\r\nexport function resolveServiceFallback(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n}): ServiceIdRef | null {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const tried: ServiceIdRef[] = [];\r\n\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n const primaryRate = rateOf(services, primary);\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n if (tried.includes(cand)) continue;\r\n tried.push(cand);\r\n\r\n const candCap = services[Number(cand)] ?? services[cand as any];\r\n if (!candCap) continue;\r\n\r\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(tagId, params, candCap);\r\n if (!ok) continue;\r\n }\r\n return cand;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function collectFailedFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings,\r\n): FailedFallbackContext[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\r\n const out: FailedFallbackContext[] = [];\r\n const fb = props.fallbacks ?? {};\r\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\r\n\r\n // Node-scoped (tags or options)\r\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n if (!primary) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary: \"\" as any,\r\n candidate: \"\" as any,\r\n reason: \"no_primary\",\r\n });\r\n continue;\r\n }\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n continue;\r\n }\r\n // Tag contexts\r\n if (tagContexts.length === 0) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"no_tag_context\",\r\n });\r\n continue;\r\n }\r\n let anyPass = false;\r\n let anyFail = false;\r\n for (const tagId of tagContexts) {\r\n const ok = s.requireConstraintFit\r\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\r\n : true;\r\n if (ok) anyPass = true;\r\n else {\r\n anyFail = true;\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n tagContext: tagId,\r\n reason: \"constraint_mismatch\",\r\n });\r\n }\r\n }\r\n // If none passed, we already added per-context mismatches above\r\n void anyPass;\r\n void anyFail;\r\n }\r\n }\r\n\r\n // Global (soft; no tag context)\r\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction rateOf(\r\n map: DgpServiceMap,\r\n id: ServiceIdRef | undefined,\r\n): number | undefined {\r\n if (id === undefined || id === null) return undefined;\r\n const c = getCap(map, id);\r\n return c?.rate ?? undefined;\r\n}\r\n\r\nfunction passesRate(\n policy: Required<FallbackSettings>[\"ratePolicy\"],\n primaryRate?: number,\n candRate?: number,\n): boolean {\n if (typeof candRate !== \"number\" || !Number.isFinite(candRate))\n return false;\n if (typeof primaryRate !== \"number\" || !Number.isFinite(primaryRate))\n return false;\n return passesRatePolicy(normalizeRatePolicy(policy), primaryRate, candRate);\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\r\n // New structure: flags[flagId].enabled\r\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\r\n if (fromFlags === true) return true;\r\n if (fromFlags === false) return false;\r\n\r\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\r\n const legacy: unknown = (cap as any)[flagId];\r\n return legacy === true;\r\n}\r\n\r\nfunction satisfiesTagConstraints(\r\n tagId: string,\r\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\r\n cap: DgpServiceCapability,\r\n): boolean {\r\n const tag = ctx.props.filters.find((t) => t.id === tagId);\r\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\r\n if (!eff) return true;\r\n\r\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\r\n for (const [key, value] of Object.entries(eff)) {\r\n if (value === true && !isCapFlagEnabled(cap, key)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction primaryForNode(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n reasonNoPrimary?: string;\r\n} {\r\n // Tag node?\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\r\n }\r\n // Option node: locate its parent field\r\n const field = props.fields.find(\r\n (f) =>\r\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\r\n );\r\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\r\n const opt = field.options!.find((o) => o.id === nodeId)!;\r\n const contexts = bindIdsToArray(field.bind_id);\r\n return { primary: opt.service_id as any, tagContexts: contexts };\r\n}\r\n\r\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}\r\n\r\n/**\r\n * Return all fallback candidates that are eligible for the given primary,\r\n * respecting:\r\n * - node-scoped list first (if nodeId provided), then global list for `primary`\r\n * - rate policy vs. primary\r\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\r\n * - excludes (including primary automatically)\r\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\r\n * - unique (dedupe) and optional limit\r\n */\r\nexport function getEligibleFallbacks(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped list first\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\r\n unique?: boolean; // default true\r\n limit?: number; // optional cap\r\n}): ServiceIdRef[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const excludes = new Set<string>((params.exclude ?? []).map(String));\r\n excludes.add(String(primary)); // never return the primary itself\r\n const unique = params.unique ?? true;\r\n\r\n // Gather source lists: node → global\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n if (!lists.length) return [];\r\n\r\n const primaryRate = rateOf(services, primary);\r\n const seen = new Set<string>();\r\n const eligible: ServiceIdRef[] = [];\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n const key = String(cand);\r\n if (excludes.has(key)) continue;\r\n if (unique && seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const cap = getCap(services, cand);\r\n if (!cap) continue;\r\n\r\n // Rate policy must pass\r\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\r\n\r\n // Tag constraint fit is only enforced if we know tagId and setting requires it\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(\r\n tagId,\r\n { props: params.props, services },\r\n cap,\r\n );\r\n if (!ok) continue;\r\n }\r\n\r\n eligible.push(cand);\r\n }\r\n }\r\n\r\n // Selection strategy\r\n if (s.selectionStrategy === \"cheapest\") {\r\n eligible.sort((a, b) => {\r\n const ra = rateOf(services, a) ?? Infinity;\r\n const rb = rateOf(services, b) ?? Infinity;\r\n return ra - rb;\r\n });\r\n }\r\n // 'priority' keeps original order\r\n\r\n // Optional limit\r\n if (typeof params.limit === \"number\" && params.limit >= 0) {\r\n return eligible.slice(0, params.limit);\r\n }\r\n return eligible;\r\n}\r\n\r\nexport function getFallbackRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: NodeIdRef,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n} {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n return { primary, tagContexts };\r\n}\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(builder: Builder): NodeIndex {\n const props = builder.getProps();\n const nodeMap = builder.getNodeMap();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (\n fieldId: string,\n tagId: string,\n ): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean,\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(\n explicit ? node : { ...node, isInherited: true },\n );\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n const id = typeof input === \"object\" ? input.id : input;\n\n const cached = nodeCache.get(id);\n if (cached) return cached;\n\n const node = nodeMap.get(id);\n\n if (!node) return mkUnknown(id);\n\n if (node.kind === \"tag\") return getTag(id) ?? mkUnknown(id);\n if (node.kind == \"field\") return getField(id) ?? mkUnknown(id);\n if (node.kind == \"option\") return getOption(id) ?? mkUnknown(id);\n\n return mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n","// src/core/policy.ts\nimport type { DynamicRule, ValidatorOptions } from \"@/schema/validation\";\n\nexport type PolicyDiagnostic = {\n ruleIndex: number;\n ruleId?: string;\n severity: \"error\" | \"warning\";\n message: string;\n path?: string; // e.g. \"filter.role\", \"op\"\n};\n\nconst ALLOWED_SCOPES = new Set<DynamicRule[\"scope\"]>([\n \"global\",\n \"visible_group\",\n]);\nconst ALLOWED_SUBJECTS = new Set<DynamicRule[\"subject\"]>([\"services\"]);\nconst ALLOWED_OPS = new Set<DynamicRule[\"op\"]>([\n \"all_equal\",\n \"unique\",\n \"no_mix\",\n \"all_true\",\n \"any_true\",\n \"max_count\",\n \"min_count\",\n]);\nconst ALLOWED_ROLES = new Set<NonNullable<DynamicRule[\"filter\"]>[\"role\"]>([\n \"base\",\n \"utility\",\n \"both\",\n]);\nconst ALLOWED_SEVERITIES = new Set<NonNullable<DynamicRule[\"severity\"]>>([\n \"error\",\n \"warning\",\n]);\n\nconst ALLOWED_WHERE_OPS = new Set<\n NonNullable<NonNullable<DynamicRule[\"filter\"]>[\"where\"]>[number][\"op\"]\n>([\"eq\", \"neq\", \"in\", \"nin\", \"exists\", \"truthy\", \"falsy\"]);\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nfunction normaliseWhere(\n src: unknown,\n d: PolicyDiagnostic[],\n i: number,\n id: string,\n): WhereClause[] | undefined {\n if (src === undefined) return undefined;\n if (!Array.isArray(src)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: \"filter.where must be an array; ignored.\",\n path: \"filter.where\",\n });\n return undefined;\n }\n\n const out: WhereClause[] = [];\n\n src.forEach((raw, j) => {\n const obj: any = raw && typeof raw === \"object\" ? raw : null;\n const path: string | undefined =\n typeof obj?.path === \"string\" && obj.path.trim()\n ? obj.path.trim()\n : undefined;\n\n if (!path) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path must be a non-empty string; entry ignored.`,\n path: `filter.where[${j}].path`,\n });\n return;\n }\n\n if (!path.startsWith(\"service.\")) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path should start with \"service.\" for subject \"services\".`,\n path: `filter.where[${j}].path`,\n });\n }\n\n const opRaw: unknown = obj?.op;\n const op: WhereClause[\"op\"] =\n opRaw === undefined\n ? \"eq\"\n : typeof opRaw === \"string\" &&\n ALLOWED_WHERE_OPS.has(opRaw as any)\n ? (opRaw as any)\n : \"eq\";\n\n if (\n opRaw !== undefined &&\n !(typeof opRaw === \"string\" && ALLOWED_WHERE_OPS.has(opRaw as any))\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `Unknown filter.where[${j}].op; defaulted to \"eq\".`,\n path: `filter.where[${j}].op`,\n });\n }\n\n const value: unknown = obj?.value;\n\n // validate value requirements lightly (non-fatal)\n if (op === \"exists\" || op === \"truthy\" || op === \"falsy\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" does not use \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n } else if (op === \"in\" || op === \"nin\") {\n if (!Array.isArray(value)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" expects an array \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n }\n\n out.push({ path, op, value });\n });\n\n return out.length ? out : undefined;\n}\n\n/**\n * Compile & validate arbitrary JSON into DynamicRule[] with defaults:\n * - scope: (default) \"visible_group\"\n * - subject: (default) \"services\"\n * - filter.role: (default) \"both\"\n * - severity: (default) \"error\"\n * - projection: (default) \"service.id\"\n *\n * Returns normalized rules + diagnostics (errors/warnings).\n */\nexport function compilePolicies(raw: unknown): {\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n} {\n const diagnostics: PolicyDiagnostic[] = [];\n const policies: DynamicRule[] = [];\n\n if (!Array.isArray(raw)) {\n diagnostics.push({\n ruleIndex: -1,\n severity: \"error\",\n message: \"Policies root must be an array.\",\n });\n return { policies, diagnostics };\n }\n\n raw.forEach((entry, i) => {\n const d: PolicyDiagnostic[] = [];\n const src = entry && typeof entry === \"object\" ? (entry as any) : {};\n\n let id: string | undefined =\n typeof src.id === \"string\" && src.id.trim()\n ? src.id.trim()\n : undefined;\n\n // id default\n if (!id) {\n id = `policy_${i + 1}`;\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"id\"; generated automatically.',\n path: \"id\",\n });\n }\n\n // ✅ label: required by DynamicRule; default to id\n const label: string =\n typeof src.label === \"string\" && src.label.trim()\n ? src.label.trim()\n : id;\n\n if (!(typeof src.label === \"string\" && src.label.trim())) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"label\"; defaulted to rule id.',\n path: \"label\",\n });\n }\n\n // scope default + validation\n let scope: DynamicRule[\"scope\"] = ALLOWED_SCOPES.has(src.scope)\n ? src.scope\n : src.scope === undefined\n ? \"visible_group\"\n : \"visible_group\";\n if (src.scope !== undefined && !ALLOWED_SCOPES.has(src.scope)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"scope\"; defaulted to \"visible_group\".',\n path: \"scope\",\n });\n }\n\n // subject default + validation\n let subject: DynamicRule[\"subject\"] = ALLOWED_SUBJECTS.has(src.subject)\n ? src.subject\n : \"services\";\n if (src.subject !== undefined && !ALLOWED_SUBJECTS.has(src.subject)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"subject\"; defaulted to \"services\".',\n path: \"subject\",\n });\n }\n\n // op required & valid\n const op: DynamicRule[\"op\"] = src.op;\n if (!ALLOWED_OPS.has(op)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `Invalid \"op\": ${String(op)}.`,\n path: \"op\",\n });\n }\n\n // projection default\n let projection: string | undefined =\n typeof src.projection === \"string\" && src.projection.trim()\n ? src.projection.trim()\n : \"service.id\";\n\n // For services subject, encourage service.* projection\n if (\n subject === \"services\" &&\n projection &&\n !projection.startsWith(\"service.\")\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message:\n 'Projection should start with \"service.\" for subject \"services\".',\n path: \"projection\",\n });\n }\n\n const filterSrc =\n src.filter && typeof src.filter === \"object\"\n ? (src.filter as DynamicRule[\"filter\"])\n : undefined;\n\n const role: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n filterSrc?.role && ALLOWED_ROLES.has(filterSrc.role)\n ? filterSrc.role\n : \"both\";\n\n if (filterSrc?.role && !ALLOWED_ROLES.has(filterSrc.role)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown filter.role; defaulted to \"both\".',\n path: \"filter.role\",\n });\n }\n\n const filter: DynamicRule[\"filter\"] | undefined = {\n role,\n tag_id:\n filterSrc?.tag_id !== undefined\n ? Array.isArray(filterSrc.tag_id)\n ? filterSrc.tag_id\n : [filterSrc.tag_id]\n : undefined,\n field_id:\n filterSrc?.field_id !== undefined\n ? Array.isArray(filterSrc.field_id)\n ? filterSrc.field_id\n : [filterSrc.field_id]\n : undefined,\n where: normaliseWhere((filterSrc as any)?.where, d, i, id),\n };\n\n // severity default\n const severity: NonNullable<DynamicRule[\"severity\"]> =\n ALLOWED_SEVERITIES.has(src.severity) ? src.severity : \"error\";\n if (\n src.severity !== undefined &&\n !ALLOWED_SEVERITIES.has(src.severity)\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"severity\"; defaulted to \"error\".',\n path: \"severity\",\n });\n }\n\n // value requirements by op\n const value = src.value;\n if (op === \"max_count\" || op === \"min_count\") {\n if (!(typeof value === \"number\" && Number.isFinite(value))) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `\"${op}\" requires numeric \"value\".`,\n path: \"value\",\n });\n }\n } else if (op === \"all_true\" || op === \"any_true\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" ignores \"value\"; it checks all/any true.`,\n path: \"value\",\n });\n }\n } else {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" does not use \"value\".`,\n path: \"value\",\n });\n }\n }\n\n // assemble rule if no fatal (error-level) diagnostics for op/value\n const hasFatal = d.some((x) => x.severity === \"error\");\n if (!hasFatal) {\n const rule: DynamicRule = {\n id,\n label, // ✅ now always present\n scope,\n subject,\n filter,\n projection,\n op,\n value: value as any,\n severity,\n message:\n typeof src.message === \"string\" ? src.message : undefined,\n };\n policies.push(rule);\n }\n\n diagnostics.push(...d);\n });\n\n return { policies, diagnostics };\n}\n\n/** Split diagnostics for convenience in UI */\nexport function splitPolicyDiagnostics(diags: PolicyDiagnostic[]): {\n errors: PolicyDiagnostic[];\n warnings: PolicyDiagnostic[];\n} {\n return {\n errors: diags.filter((d) => d.severity === \"error\"),\n warnings: diags.filter((d) => d.severity === \"warning\"),\n };\n}\n\n/**\n * Convenience helper: compile policies and pass to validator options.\n * You can use this in your editor before calling validate().\n */\nexport function withCompiledPolicies(\n opts: ValidatorOptions,\n rawPolicies: unknown,\n): { opts: ValidatorOptions; diagnostics: PolicyDiagnostic[] } {\n const { policies, diagnostics } = compilePolicies(rawPolicies);\n return { opts: { ...opts, policies }, diagnostics };\n}\n","import type { Builder } from \"@/core/builder\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n FallbackSettings,\n RatePolicy,\n ServiceIdRef,\n} from \"@/schema\";\nimport {\n constraintFitOk,\n getServiceCapability,\n normalizeRatePolicy,\n rateOk,\n toFiniteNumber,\n} from \"@/utils/util\";\nimport { DEFAULT_FALLBACK_SETTINGS } from \"@/core/governance\";\n\nexport type ServiceCheck = {\n id: ServiceIdRef;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n\nexport type FilterServicesForVisibleGroupInput = {\n candidates: ServiceIdRef[];\n context: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: ServiceIdRef[];\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n ratePolicy?: RatePolicy;\n fallbackSettings?: FallbackSettings;\n /** Backward-compatible alias for fallbackSettings */\n fallback?: FallbackSettings;\n strictSafety?: boolean;\n enforcePolicies?: boolean;\n };\n};\n\nexport type FilterServicesForVisibleGroupResult = {\n checks: ServiceCheck[];\n diagnostics?: PolicyDiagnostic[];\n};\n\nexport function filterServicesForVisibleGroup(\n input: FilterServicesForVisibleGroupInput,\n deps: {\n builder: Builder;\n },\n): FilterServicesForVisibleGroupResult {\n const svcMap: DgpServiceMap = deps.builder.getServiceMap?.() ?? {};\n const builderOptions = deps.builder.getOptions?.();\n const { context } = input;\n\n const usedSet = new Set(context.usedServiceIds.map(String));\n const primary = context.usedServiceIds[0];\n const explicitFallbackSettings =\n context.fallbackSettings ?? context.fallback;\n const resolvedRatePolicy = normalizeRatePolicy(\n context.ratePolicy ??\n explicitFallbackSettings?.ratePolicy ??\n builderOptions?.ratePolicy,\n );\n const fallbackSettingsSource =\n explicitFallbackSettings ?? builderOptions?.fallbackSettings;\n\n const fb: FallbackSettings = {\n ...DEFAULT_FALLBACK_SETTINGS,\n ...(fallbackSettingsSource ?? {}),\n ratePolicy: resolvedRatePolicy,\n };\n const policySource = context.policies ?? builderOptions?.policies ?? [];\n\n const visibleServiceIds =\n context.selectedButtons === undefined\n ? undefined\n : collectVisibleServiceIds(\n deps.builder,\n context.tagId,\n context.selectedButtons,\n );\n\n const checks: ServiceCheck[] = [];\n let lastDiagnostics: PolicyDiagnostic[] | undefined = undefined;\n\n for (const id of input.candidates) {\n if (usedSet.has(String(id))) continue;\n\n const cap = getServiceCapability(svcMap, id);\n if (!cap) {\n checks.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n context.effectiveConstraints ?? {},\n );\n\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n const polRes = evaluatePoliciesRaw(\n policySource,\n [...context.usedServiceIds, id],\n svcMap,\n context.tagId,\n visibleServiceIds,\n );\n const passesPolicies = polRes.ok;\n lastDiagnostics = polRes.diagnostics;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n checks.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length ? polRes.warnings : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return {\n checks,\n diagnostics:\n lastDiagnostics && lastDiagnostics.length\n ? lastDiagnostics\n : undefined,\n };\n}\n\nfunction evaluatePoliciesRaw(\n raw: unknown,\n serviceIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n) {\n const compiled = compilePolicies(raw);\n const evaluated = evaluateServicePolicies(\n compiled.policies,\n serviceIds,\n svcMap,\n tagId,\n visibleServiceIds,\n );\n return {\n ...evaluated,\n diagnostics: compiled.diagnostics,\n };\n}\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const scoped = scopeServiceIdsForRule(svcIds, r, visibleServiceIds);\n const ids = scoped.filter((id) =>\n matchesRuleFilter(getServiceCapability(svcMap, id), r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(getServiceCapability(svcMap, id), projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\") {\n errors.push(r.id ?? \"policy_error\");\n } else {\n warnings.push(r.id ?? \"policy_warning\");\n }\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction scopeServiceIdsForRule(\n serviceIds: (string | number)[],\n rule: DynamicRule,\n visibleServiceIds?: Set<string>,\n): ServiceIdRef[] {\n if (rule.scope !== \"visible_group\" || !visibleServiceIds) return serviceIds;\n return serviceIds.filter((id) => visibleServiceIds.has(String(id)));\n}\n\nfunction collectVisibleServiceIds(\n builder: Builder,\n tagId: string,\n selectedButtons: string[],\n): Set<string> {\n const out = new Set<string>();\n const props = builder.getProps();\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tag = tags.find((t) => t.id === tagId);\n if (tag?.service_id != null) out.add(String(tag.service_id));\n\n const visibleFieldIds = new Set(builder.visibleFields(tagId, selectedButtons));\n for (const field of fields) {\n if (!visibleFieldIds.has(field.id)) continue;\n\n if ((field as any).service_id != null) {\n out.add(String((field as any).service_id));\n }\n for (const option of field.options ?? []) {\n if ((option as any).service_id != null) {\n out.add(String((option as any).service_id));\n }\n }\n }\n\n return out;\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\") ? projection.slice(8) : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n","// src/utils/prune-fallbacks.ts\r\nimport type { ServiceProps, ServiceIdRef } from \"@/schema\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport { collectFailedFallbacks } from \"@/core\";\r\n\r\nexport type PrunedFallback = {\r\n nodeId: string;\r\n candidate: ServiceIdRef;\r\n reasons: string[]; // aggregated reasons that caused full-context failure\r\n contexts?: string[]; // tag contexts considered (for option nodes)\r\n};\r\n\r\nexport type PruneResult = {\r\n props: ServiceProps;\r\n removed: PrunedFallback[];\r\n};\r\n\r\n/**\r\n * Remove node-scoped fallback candidates that fail in ALL relevant contexts.\r\n * - Tag node: single context (the tag itself)\r\n * - Option node: contexts = parent field's bind_id tags\r\n * - Global fallbacks are NEVER pruned here (soft by design)\r\n */\r\nexport function pruneInvalidNodeFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings\r\n): PruneResult {\r\n const fb = props.fallbacks;\r\n if (!fb?.nodes || Object.keys(fb.nodes).length === 0) {\r\n return { props, removed: [] };\r\n }\r\n\r\n // 1) Build node → contexts (tag ids) and primary lookup\r\n const nodeContexts = new Map<string, string[]>();\r\n const nodePrimary = new Map<string, ServiceIdRef | undefined>();\r\n\r\n for (const nodeId of Object.keys(fb.nodes)) {\r\n const tag = props.filters.find(t => t.id === nodeId);\r\n if (tag) {\r\n nodeContexts.set(nodeId, [tag.id]);\r\n nodePrimary.set(nodeId, tag.service_id as any);\r\n continue;\r\n }\r\n // option node: locate parent field\r\n const field = props.fields.find(f => Array.isArray(f.options) && f.options.some(o => o.id === nodeId));\r\n if (field) {\r\n const contexts = toBindArray(field.bind_id);\r\n nodeContexts.set(nodeId, contexts);\r\n const opt = field.options!.find(o => o.id === nodeId)!;\r\n nodePrimary.set(nodeId, opt.service_id as any);\r\n continue;\r\n }\r\n // unknown node id → treat as no contexts & no primary\r\n nodeContexts.set(nodeId, []);\r\n nodePrimary.set(nodeId, undefined);\r\n }\r\n\r\n // 2) Gather diagnostics (per context). We use dev mode collection to get granular reasons.\r\n const diags = collectFailedFallbacks(props, services, { ...settings, mode: 'dev' });\r\n\r\n // 3) Decide which (nodeId, candidate) pairs fail in ALL contexts\r\n const failuresByPair = new Map<string, { reasons: Set<string>; contexts: Set<string> }>();\r\n const totalContextsByNode = new Map<string, number>();\r\n\r\n for (const [nodeId, ctxs] of nodeContexts.entries()) {\r\n totalContextsByNode.set(nodeId, Math.max(1, ctxs.length)); // at least 1 for tag/no-context cases\r\n }\r\n\r\n for (const d of diags) {\r\n if (d.scope !== 'node') continue;\r\n const key = `${d.nodeId}::${String(d.candidate)}`;\r\n let rec = failuresByPair.get(key);\r\n if (!rec) {\r\n rec = { reasons: new Set<string>(), contexts: new Set<string>() };\r\n failuresByPair.set(key, rec);\r\n }\r\n rec.reasons.add(d.reason);\r\n if (d.tagContext) rec.contexts.add(d.tagContext);\r\n // For node-level reasons not tied to a context, mark all contexts as failed by leaving contexts set empty;\r\n // we'll interpret empty-but-has-reasons as global failure later when totals == 1.\r\n }\r\n\r\n // 4) Build a pruned copy of fallbacks.nodes\r\n const prunedNodes: Record<string, ServiceIdRef[]> = {};\r\n const removed: PrunedFallback[] = [];\r\n\r\n for (const [nodeId, list] of Object.entries(fb.nodes)) {\r\n const contexts = nodeContexts.get(nodeId) ?? [];\r\n const totalContexts = Math.max(1, contexts.length);\r\n const keep: ServiceIdRef[] = [];\r\n\r\n for (const cand of list) {\r\n const key = `${nodeId}::${String(cand)}`;\r\n const rec = failuresByPair.get(key);\r\n\r\n // Not present in failures → keep\r\n if (!rec) {\r\n keep.push(cand);\r\n continue;\r\n }\r\n\r\n const failedContextsCount = rec.contexts.size > 0 ? rec.contexts.size : totalContexts;\r\n const failsAll = failedContextsCount >= totalContexts;\r\n\r\n if (failsAll) {\r\n removed.push({\r\n nodeId,\r\n candidate: cand,\r\n reasons: Array.from(rec.reasons),\r\n contexts: contexts.length ? contexts.slice() : undefined,\r\n });\r\n } else {\r\n keep.push(cand); // passes in at least one context\r\n }\r\n }\r\n\r\n if (keep.length) prunedNodes[nodeId] = keep;\r\n }\r\n\r\n const outProps: ServiceProps = {\r\n ...props,\r\n fallbacks: {\r\n ...(props.fallbacks?.global ? { global: props.fallbacks!.global } : {}),\r\n ...(Object.keys(prunedNodes).length ? { nodes: prunedNodes } : {}),\r\n }\r\n };\r\n\r\n return { props: outProps, removed };\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction toBindArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}","// src/utils/build-order-snapshot.ts\r\n\r\nimport type {\r\n FallbackDiagnostics,\r\n OrderSnapshot,\r\n QuantityRule,\r\n Scalar,\r\n ServiceFallbacks,\r\n UtilityLineItem,\r\n UtilityMode,\r\n} from \"@/schema/order\";\r\nimport type {\n DgpServiceCapability,\n Field,\n FieldOption,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { Builder } from \"@/core\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport { isMultiField } from \"./index\";\r\nimport type { PruneResult } from \"./prune-fallbacks\";\r\nimport { pruneInvalidNodeFallbacks } from \"./prune-fallbacks\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport {\n constraintFitOk,\n getServiceCapability,\n normalizeRatePolicy,\n rateOk,\n} from \"./util\";\n\r\n/* ───────────────────────── Public types ───────────────────────── */\r\n\r\nexport type BuildOrderSnapshotSettings = {\r\n mode?: \"prod\" | \"dev\";\r\n hostDefaultQuantity?: number;\r\n /** Full fallback policy */\r\n fallback?: FallbackSettings;\r\n workspaceId?: string;\r\n builderCommit?: string;\r\n};\r\n\r\nexport type BuildOrderSelection = {\r\n /** Single active context (one tag) coming from Selection */\r\n activeTagId: string;\r\n /** Non-option inputs, keyed by fieldId (will be remapped to field.name in the payload) */\r\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\r\n /** Option selections, keyed by fieldId → optionId[] */\r\n optionSelectionsByFieldId: Record<string, string[]>;\r\n selectedKeys?: string[];\r\n /**\r\n * Selection visit order for options (optional, improves \"first option wins primary\" determinism).\r\n * If omitted, iteration order falls back to Object.entries(optionSelectionsByFieldId).\r\n */\r\n optionTraversalOrder?: Array<{ fieldId: string; optionId: string }>;\r\n};\r\n\r\n/* ───────────────────────── Entry point ───────────────────────── */\r\n\r\nexport function buildOrderSnapshot(\r\n props: ServiceProps,\r\n builder: Builder,\r\n selection: BuildOrderSelection,\r\n services: DgpServiceMap,\r\n settings: BuildOrderSnapshotSettings = {},\r\n): OrderSnapshot {\r\n const mode: \"prod\" | \"dev\" = settings.mode ?? \"prod\";\r\n const hostDefaultQty: number = Number.isFinite(\r\n settings.hostDefaultQuantity ?? 1,\r\n )\r\n ? (settings.hostDefaultQuantity as number)\r\n : 1;\r\n\r\n // Default fallback policy (strict in prod; diagnostics in dev)\r\n const fbSettings: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(settings.fallback ?? {}),\n };\r\n\r\n const builtAt: string = new Date().toISOString();\r\n const tagId: string = selection.activeTagId;\r\n\r\n // 1) Resolve visible fields for the single context\r\n const selectedButtonKeys: string[] =\r\n selection.selectedKeys ??\r\n toSelectedOptionKeys(selection.optionSelectionsByFieldId);\r\n const visibleFieldIds: string[] = builder.visibleFields(\r\n tagId,\r\n selectedButtonKeys,\r\n );\r\n\r\n // Indexes\r\n const tagById: Map<string, Tag> = new Map(\r\n (props.filters ?? []).map((t) => [t.id, t]),\r\n );\r\n const fieldById: Map<string, Field> = new Map(\r\n (props.fields ?? []).map((f) => [f.id, f]),\r\n );\r\n const tagConstraints:\r\n | Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>\r\n | undefined = tagById.get(tagId)?.constraints ?? undefined;\r\n\r\n // 2) Selection.fields (id, type, selectedOptions?)\r\n const selectionFields = visibleFieldIds\r\n .map((fid) => fieldById.get(fid))\r\n .filter((f): f is Field => !!f)\r\n .map((f) => {\r\n const optIds: string[] | undefined = isOptionBased(f)\r\n ? (selection.optionSelectionsByFieldId[f.id] ?? [])\r\n : undefined;\r\n return {\r\n id: f.id,\r\n type: String(f.type),\r\n ...(optIds && optIds.length ? { selectedOptions: optIds } : {}),\r\n };\r\n });\r\n\r\n // 3) Inputs (form by field.name, selections by fieldId)\r\n const { formValues, selections } = buildInputs(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n );\r\n\r\n // 4) Quantity\r\n const qtyRes = resolveQuantity(\n visibleFieldIds,\n fieldById,\n tagById,\n selection,\n tagId,\n hostDefaultQty,\n );\n const quantity: number = qtyRes.quantity;\r\n const quantitySource = qtyRes.source;\r\n\r\n // 5) Services and serviceMap (UPDATED behavior: tag default is default; any option with service_id is included; first becomes primary)\r\n const { serviceMap, servicesList } = resolveServices(\r\n tagId,\r\n visibleFieldIds,\r\n selection,\r\n tagById,\r\n fieldById,\r\n );\r\n\r\n const { min, max } = resolveMinMax(servicesList, services);\r\n\r\n // 6) Fallbacks — client-side conservative prune (keeps only relevant-to-selection)\r\n const prunedFallbacks = pruneFallbacksConservative(\r\n props.fallbacks as unknown as ServiceFallbacks | undefined,\r\n { tagId, constraints: tagConstraints, serviceMap, servicesList },\r\n services,\r\n fbSettings,\r\n );\r\n\r\n // 7) Utilities — line items derived from utility fields/options\r\n const utilities = collectUtilityLineItems(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n quantity,\r\n );\r\n\r\n // 8) Dev warnings (fallback diagnostics + form/utility hints)\r\n const warnings: OrderSnapshot[\"warnings\"] | undefined =\r\n mode === \"dev\"\r\n ? buildDevWarnings(\r\n props,\r\n services,\r\n tagId,\r\n serviceMap,\r\n prunedFallbacks.original,\r\n prunedFallbacks.pruned,\r\n fieldById,\r\n visibleFieldIds,\r\n selection,\r\n )\r\n : undefined;\r\n\r\n // 9) Meta.context (single-tag effective constraints + nodeContexts)\r\n const snapshotPolicy = toSnapshotPolicy(fbSettings);\r\n const meta = {\r\n schema_version: props.schema_version,\r\n workspaceId: settings.workspaceId,\r\n builder: settings.builderCommit\r\n ? { commit: settings.builderCommit }\r\n : undefined,\r\n context: {\r\n tag: tagId,\r\n constraints: (tagConstraints ?? {}) as Record<\r\n \"refill\" | \"cancel\" | \"dripfeed\",\r\n boolean | undefined\r\n >,\r\n nodeContexts: buildNodeContexts(\r\n tagId,\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n ),\r\n policy: snapshotPolicy,\r\n },\r\n };\r\n\r\n const snapshot: OrderSnapshot = {\r\n version: \"1\",\r\n mode,\r\n builtAt,\r\n selection: {\r\n tag: tagId,\r\n buttons: selectedButtonKeys,\r\n fields: selectionFields,\r\n },\r\n inputs: {\r\n form: formValues,\r\n selections,\r\n },\r\n\r\n min,\r\n max: max ?? min,\r\n\r\n quantity,\r\n quantitySource,\r\n services: servicesList,\r\n serviceMap,\r\n ...(prunedFallbacks.pruned\r\n ? { fallbacks: prunedFallbacks.pruned }\r\n : {}),\r\n ...(utilities.length ? { utilities } : {}),\r\n ...(warnings ? { warnings } : {}),\r\n meta,\r\n };\r\n\r\n return snapshot;\r\n}\r\n\r\n/* ───────────────────────── Helpers ───────────────────────── */\r\n\r\nfunction isOptionBased(f: Field): boolean {\r\n const hasOptions: boolean =\r\n Array.isArray(f.options) && f.options.length > 0;\r\n return hasOptions || isMultiField(f);\r\n}\r\n\r\nfunction toSelectedOptionKeys(byField: Record<string, string[]>): string[] {\r\n const keys: string[] = [];\r\n for (const [fieldId, optionIds] of Object.entries(byField ?? {})) {\r\n for (const optId of optionIds ?? []) {\r\n keys.push(`${fieldId}::${optId}`);\r\n }\r\n }\r\n return keys;\r\n}\r\n\r\nfunction isServicedBased(field: Field) {\r\n if (field.service_id) return true;\r\n return !!(field.options && field.options.some((item) => item.service_id));\r\n}\r\n\r\nfunction buildInputs(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): {\r\n formValues: Record<string, Scalar | Scalar[]>;\r\n selections: Record<string, string[]>;\r\n} {\r\n const formValues: Record<string, Scalar | Scalar[]> = {};\r\n const selections: Record<string, string[]> = {};\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f: Field | undefined = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const selOptIds: string[] | undefined =\r\n selection.optionSelectionsByFieldId[fid];\r\n if (selOptIds && selOptIds.length) {\r\n selections[fid] = [...selOptIds];\r\n }\r\n\r\n // Only non-option fields contribute to form values; key by field.name\r\n if (!isServicedBased(f)) {\r\n const name: string | undefined = f.name;\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[fid];\r\n if (!name || val === undefined) continue;\r\n formValues[name] = val;\r\n }\r\n }\r\n\r\n return { formValues, selections };\r\n}\r\n\r\n/* ───────────────── Quantity ───────────────── */\r\n\r\nfunction resolveQuantity(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n tagById: Map<string, Tag>,\n selection: BuildOrderSelection,\n tagId: string,\n hostDefault: number,\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } {\n // Precedence:\n // 1) First visible field with a valid quantity rule -> evaluate\n // 2) Selected option defaults, then visible button-style field defaults, then active tag default\n // 3) Host default\n for (const fid of visibleFieldIds) {\n const f: Field | undefined = fieldById.get(fid);\n if (!f) continue;\n const rule: QuantityRule | undefined = readQuantityRule(\r\n (f.meta as any)?.quantity,\r\n );\n if (!rule) continue;\n\n const raw: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[fid];\n const evaluated = evaluateQuantityRule(rule, raw);\n if (Number.isFinite(evaluated) && (evaluated as number) > 0) {\n return {\n quantity: evaluated as number,\n source: { kind: \"field\", id: f.id, rule },\n };\n }\n\n break;\n }\n\n const nodeDefault = resolveNodeDefaultQuantity(\n visibleFieldIds,\n fieldById,\n tagById,\n selection,\n tagId,\n );\n if (nodeDefault) return nodeDefault;\n\n return {\n quantity: hostDefault,\n source: { kind: \"default\", defaultedFromHost: true },\n };\n}\n\r\nfunction readQuantityRule(v: unknown): QuantityRule | undefined {\n if (!v || typeof v !== \"object\") return undefined;\n const src = v as QuantityRule;\n if (\r\n src.valueBy !== \"value\" &&\r\n src.valueBy !== \"length\" &&\r\n src.valueBy !== \"eval\"\r\n )\r\n return undefined;\n const out: QuantityRule = { valueBy: src.valueBy };\n if (src.code && typeof src.code === \"string\") out.code = src.code;\n if (typeof src.multiply === \"number\" && Number.isFinite(src.multiply)) {\n out.multiply = src.multiply;\n }\n if (typeof src.fallback === \"number\" && Number.isFinite(src.fallback)) {\n out.fallback = src.fallback;\n }\n if (src.clamp && typeof src.clamp === \"object\") {\n const min =\n typeof src.clamp.min === \"number\" && Number.isFinite(src.clamp.min)\n ? src.clamp.min\n : undefined;\n const max =\n typeof src.clamp.max === \"number\" && Number.isFinite(src.clamp.max)\n ? src.clamp.max\n : undefined;\n if (min !== undefined || max !== undefined) {\n out.clamp = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n };\n }\n }\n return out;\n}\n\nfunction evaluateQuantityRule(\n rule: QuantityRule,\n raw: Scalar | Scalar[] | undefined,\n): number {\n const evaluated = evaluateRawQuantityRule(rule, raw);\n if (Number.isFinite(evaluated)) {\n const adjusted = applyQuantityTransforms(evaluated as number, rule);\n if (Number.isFinite(adjusted) && adjusted > 0) return adjusted;\n }\n\n if (typeof rule.fallback === \"number\" && Number.isFinite(rule.fallback)) {\n const fallback = applyClamp(rule.fallback, rule.clamp);\n if (Number.isFinite(fallback) && fallback > 0) return fallback;\n }\n\n return NaN;\n}\n\nfunction evaluateRawQuantityRule(\n rule: QuantityRule,\n raw: Scalar | Scalar[] | undefined,\n): number {\n switch (rule.valueBy) {\n case \"value\": {\n const n = Number(Array.isArray(raw) ? (raw as Scalar[])[0] : raw);\n return Number.isFinite(n) ? n : NaN;\r\n }\r\n case \"length\": {\r\n if (Array.isArray(raw)) return raw.length;\r\n if (typeof raw === \"string\") return raw.length;\r\n return NaN;\r\n }\r\n case \"eval\": {\r\n try {\r\n if (!rule.code || typeof rule.code !== \"string\") return NaN;\r\n // eslint-disable-next-line no-new-func\r\n const fn = new Function(\r\n \"value\",\r\n \"values\",\r\n `return (function(){ ${rule.code}\\n})()`,\r\n );\r\n const single = Array.isArray(raw) ? (raw as Scalar[])[0] : raw;\r\n const values = Array.isArray(raw)\r\n ? (raw as Scalar[])\r\n : raw !== undefined\r\n ? [raw]\r\n : [];\r\n const out = fn(single, values);\r\n const n = Number(out);\r\n return Number.isFinite(n) ? n : NaN;\r\n } catch {\r\n return NaN;\r\n }\r\n }\r\n default:\n return NaN;\n }\n}\n\nfunction applyQuantityTransforms(value: number, rule: QuantityRule): number {\n let next = value;\n if (typeof rule.multiply === \"number\" && Number.isFinite(rule.multiply)) {\n next *= rule.multiply;\n }\n return applyClamp(next, rule.clamp);\n}\n\nfunction applyClamp(\n value: number,\n clamp: QuantityRule[\"clamp\"] | undefined,\n): number {\n let next = value;\n if (clamp?.min !== undefined) next = Math.max(next, clamp.min);\n if (clamp?.max !== undefined) next = Math.min(next, clamp.max);\n return next;\n}\n\nfunction resolveNodeDefaultQuantity(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n tagById: Map<string, Tag>,\n selection: BuildOrderSelection,\n tagId: string,\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } | undefined {\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\n for (const { fieldId, optionId } of optionVisit) {\n if (!visibleFieldIds.includes(fieldId)) continue;\n const field = fieldById.get(fieldId);\n const option = field?.options?.find((item) => item.id === optionId);\n const quantityDefault = readQuantityDefault(\n (option?.meta as any)?.quantityDefault,\n );\n if (quantityDefault !== undefined) {\n return {\n quantity: quantityDefault,\n source: { kind: \"option\", id: optionId },\n };\n }\n }\n\n for (const fieldId of visibleFieldIds) {\n const field = fieldById.get(fieldId);\n if (!field) continue;\n const isButtonStyle =\n field.button === true ||\n (Array.isArray(field.options) && field.options.length > 0);\n if (!isButtonStyle) continue;\n const quantityDefault = readQuantityDefault(\n (field as any).quantityDefault,\n );\n if (quantityDefault !== undefined) {\n return {\n quantity: quantityDefault,\n source: { kind: \"field\", id: field.id },\n };\n }\n }\n\n const tagQuantityDefault = readQuantityDefault(\n (tagById.get(tagId)?.meta as any)?.quantityDefault,\n );\n if (tagQuantityDefault !== undefined) {\n return {\n quantity: tagQuantityDefault,\n source: { kind: \"tag\", id: tagId },\n };\n }\n\n return undefined;\n}\n\nfunction readQuantityDefault(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : undefined;\n}\n\r\n/* ───────────────── Services (UPDATED) ───────────────── */\r\n\r\nfunction resolveServices(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n tagById: Map<string, Tag>,\r\n fieldById: Map<string, Field>,\r\n): {\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n} {\r\n const serviceMap: Record<string, Array<string | number>> = {};\r\n const ordered: Array<string | number> = [];\r\n\r\n // 1) Tentative primary from tag default (if any) — default only.\r\n const tag = tagById.get(tagId);\r\n let primary: string | number | undefined;\r\n let primaryOrigin: \"tag\" | \"option\" | undefined;\r\n\r\n if (tag?.service_id !== undefined) {\r\n primary = tag.service_id;\r\n primaryOrigin = \"tag\";\r\n // We'll only record it in lists if it survives override.\r\n }\r\n\r\n // 2) Walk option selections in a deterministic order\r\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\r\n\r\n for (const { fieldId, optionId } of optionVisit) {\r\n // only consider options whose field is visible in this group\r\n if (!visibleFieldIds.includes(fieldId)) continue;\r\n\r\n const f = fieldById.get(fieldId);\r\n if (!f || !Array.isArray(f.options)) continue;\r\n\r\n const opt = f.options.find((o) => o.id === optionId);\r\n if (!opt) continue;\r\n\r\n const role = (opt.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\"\r\n | string;\r\n const sid = opt.service_id;\r\n\r\n // Defensive: ignore if a (misconfigured) utility has service_id.\r\n if (role === \"utility\") continue;\r\n\r\n if (sid !== undefined) {\r\n // First option with service_id overrides tag default primary.\r\n if (primary === undefined || primaryOrigin === \"tag\") {\r\n primary = sid;\r\n primaryOrigin = \"option\";\r\n // Since primary owns index 0, push it first\r\n ordered.length = 0; // clear any tentative tag default\r\n ordered.push(primary);\r\n } else {\r\n // Additional option services append\r\n ordered.push(sid);\r\n }\r\n // Map origin node → sid\r\n pushService(serviceMap, optionId, sid);\r\n }\r\n }\r\n\r\n // 3) If no option established a primary, use tag default (if present)\r\n if (primaryOrigin !== \"option\" && primary !== undefined) {\r\n ordered.unshift(primary);\r\n pushService(serviceMap, tagId, primary);\r\n } else {\r\n // If overridden, we do NOT record tagId→default in serviceMap\r\n }\r\n\r\n const servicesList = dedupeByString(ordered);\r\n return { serviceMap, servicesList };\r\n}\r\n\r\nfunction buildOptionVisitOrder(\r\n selection: BuildOrderSelection,\r\n fieldById: Map<string, Field>,\r\n): Array<{ fieldId: string; optionId: string }> {\r\n if (\r\n selection.optionTraversalOrder &&\r\n selection.optionTraversalOrder.length\r\n ) {\r\n return selection.optionTraversalOrder.slice();\r\n }\r\n // fallback: expand optionSelectionsByFieldId in insertion-ish order\r\n const out: Array<{ fieldId: string; optionId: string }> = [];\r\n for (const [fid, optIds] of Object.entries(\r\n selection.optionSelectionsByFieldId ?? {},\r\n )) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n for (const oid of optIds ?? [])\r\n out.push({ fieldId: fid, optionId: oid });\r\n }\r\n return out;\r\n}\r\n\r\nfunction pushService(\r\n map: Record<string, Array<string | number>>,\r\n nodeId: string,\r\n sid: string | number,\r\n): void {\r\n if (!map[nodeId]) map[nodeId] = [];\r\n map[nodeId].push(sid);\r\n}\r\n\r\nfunction dedupeByString<T extends string | number>(arr: T[]): T[] {\r\n const s = new Set<string>();\r\n const out: T[] = [];\r\n for (const v of arr) {\r\n const key = String(v);\r\n if (s.has(key)) continue;\r\n s.add(key);\r\n out.push(v);\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────── Fallback pruning (client-conservative) ───────────── */\r\n\r\ntype PruneEnv = {\r\n tagId: string;\r\n constraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n};\r\n\r\nfunction pruneFallbacksConservative(\r\n fallbacks: ServiceFallbacks | undefined,\r\n env: PruneEnv,\r\n svcMap: DgpServiceMap,\r\n policy: FallbackSettings,\r\n): { pruned?: ServiceFallbacks; original?: ServiceFallbacks } {\r\n if (!fallbacks) return { pruned: undefined, original: undefined };\r\n\r\n // Prefer shared helper (keeps behavior consistent with tests)\r\n try {\r\n const { props: prunedProps }: PruneResult = pruneInvalidNodeFallbacks(\r\n {\r\n filters: [],\r\n fields: [],\r\n schema_version: \"1.0\",\r\n fallbacks,\r\n } as unknown as ServiceProps,\r\n svcMap,\r\n policy,\r\n );\r\n return {\r\n pruned: prunedProps.fallbacks as unknown as\r\n | ServiceFallbacks\r\n | undefined,\r\n original: fallbacks,\r\n };\r\n } catch {\r\n // Minimal inline conservative prune (selection-aware)\r\n const out: ServiceFallbacks = {};\r\n const requireFit: boolean = policy.requireConstraintFit ?? true;\r\n\r\n // Nodes: keep only for nodes present in env.serviceMap; apply rate & (optional) constraints against tag\r\n if ((fallbacks as any).nodes) {\r\n const keptNodes: Record<string, Array<string | number>> = {};\r\n for (const [nodeId, candidates] of Object.entries(\r\n (fallbacks as any).nodes as Record<\r\n string,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!env.serviceMap[nodeId]) continue;\r\n const primary = (env.serviceMap[nodeId] ?? [])[0];\r\n const kept: Array<string | number> = [];\r\n for (const cand of candidates ?? []) {\r\n if (!rateOk(svcMap, cand, primary, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptNodes[nodeId] = kept;\r\n }\r\n if (Object.keys(keptNodes).length) (out as any).nodes = keptNodes;\r\n }\r\n\r\n // Global: keep only primaries that are present in selection; apply rate & (optional) constraints\r\n if ((fallbacks as any).global) {\r\n const keptGlobal: Record<\r\n string | number,\r\n Array<string | number>\r\n > = {};\r\n const present = new Set(env.servicesList.map((sid) => String(sid)));\r\n for (const [primary, cands] of Object.entries(\r\n (fallbacks as any).global as Record<\r\n string | number,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!present.has(String(primary))) continue;\r\n const primId: string | number = isFiniteNumber(primary)\r\n ? Number(primary)\r\n : (primary as any);\r\n const kept: Array<string | number> = [];\r\n for (const cand of cands ?? []) {\r\n if (!rateOk(svcMap, cand, primId, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptGlobal[primId] = kept;\r\n }\r\n if (Object.keys(keptGlobal).length)\r\n (out as any).global = keptGlobal;\r\n }\r\n\r\n return {\r\n pruned: Object.keys(out).length ? out : undefined,\r\n original: fallbacks,\r\n };\r\n }\r\n}\r\n\r\nfunction isFiniteNumber(v: unknown): v is number {\r\n return typeof v === \"number\" && Number.isFinite(v);\r\n}\r\n\r\n/* ───────────────── Utilities collection ───────────────── */\r\n\r\ntype UtilityMarker = {\n mode: UtilityMode;\n rate: number;\n valueBy?: \"value\" | \"length\";\n percentBase?: \"service_total\" | \"base_service\" | \"all\";\n label?: string;\n};\n\r\nfunction collectUtilityLineItems(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n quantity: number,\r\n): UtilityLineItem[] {\r\n const items: UtilityLineItem[] = [];\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const isUtilityField = (f.pricing_role ?? \"base\") === \"utility\";\r\n const marker = readUtilityMarker((f.meta as any)?.utility);\r\n\r\n // Field-based utility\r\n if (isUtilityField && marker) {\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n f.id,\r\n marker,\r\n quantity,\r\n val,\r\n );\r\n if (item) items.push(item);\r\n }\r\n\r\n // Option-based utility (only if selected)\r\n if (Array.isArray(f.options) && f.options.length) {\r\n const selectedOptIds =\r\n selection.optionSelectionsByFieldId[f.id] ?? [];\r\n if (selectedOptIds.length) {\r\n const optById = new Map<string, FieldOption>(\r\n f.options.map((o) => [o.id, o]),\r\n );\r\n for (const oid of selectedOptIds) {\r\n const opt = optById.get(oid);\r\n if (!opt) continue;\r\n if ((opt.pricing_role ?? \"base\") !== \"utility\") continue;\r\n const om = readUtilityMarker((opt.meta as any)?.utility);\r\n if (!om) continue;\r\n // For per_value on options, we use the parent field's value as the base value\r\n const parentVal: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n opt.id,\r\n om,\r\n quantity,\r\n parentVal,\r\n );\r\n if (item) items.push(item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction readUtilityMarker(v: unknown): UtilityMarker | undefined {\r\n if (!v || typeof v !== \"object\") return undefined;\r\n const src = v as UtilityMarker;\r\n if (!src.mode || typeof src.rate !== \"number\" || !Number.isFinite(src.rate))\r\n return undefined;\r\n if (\r\n src.mode !== \"flat\" &&\r\n src.mode !== \"per_quantity\" &&\r\n src.mode !== \"per_value\" &&\r\n src.mode !== \"percent\"\r\n )\n return undefined;\n const out: UtilityMarker = { mode: src.mode, rate: src.rate };\n if (src.valueBy === \"value\" || src.valueBy === \"length\")\n out.valueBy = src.valueBy;\n if (\n src.percentBase === \"service_total\" ||\n src.percentBase === \"base_service\" ||\n src.percentBase === \"all\"\n ) {\n out.percentBase = src.percentBase;\n }\n if (typeof src.label === \"string\" && src.label.trim()) {\n out.label = src.label.trim();\n }\n return out;\n}\n\r\nfunction buildUtilityItemFromMarker(\r\n nodeId: string,\r\n marker: UtilityMarker,\r\n quantity: number,\r\n value: Scalar | Scalar[] | undefined,\r\n): UtilityLineItem | undefined {\r\n const base: UtilityLineItem = {\n nodeId,\n mode: marker.mode,\n rate: marker.rate,\n ...(marker.percentBase ? { percentBase: marker.percentBase } : {}),\n ...(marker.label ? { label: marker.label } : {}),\n inputs: { quantity },\n };\n if (marker.mode === \"per_value\") {\n base.inputs.valueBy = marker.valueBy ?? \"value\";\n if (marker.valueBy === \"length\") {\n base.inputs.value = Array.isArray(value)\r\n ? value.length\n : typeof value === \"string\"\n ? value.length\n : 0;\n } else {\n base.inputs.value = Array.isArray(value)\n ? (value[0] ?? null)\n : (value ?? null);\r\n }\r\n }\r\n return base;\r\n}\r\n\r\n/* ───────────────── meta.context helpers ──────────────── */\r\n\r\nfunction buildNodeContexts(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): Record<string, string | null> {\r\n const ctx: Record<string, string | null> = {};\r\n ctx[tagId] = tagId; // tag maps to itself\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const binds = normalizeBindIds(f.bind_id);\r\n const applicable = binds.has(tagId);\r\n\r\n const selectedOptIds = selection.optionSelectionsByFieldId[fid] ?? [];\r\n for (const oid of selectedOptIds) {\r\n ctx[oid] = applicable ? tagId : null;\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\nfunction normalizeBindIds(bind: string | string[] | undefined): Set<string> {\r\n const out = new Set<string>();\r\n if (!bind) return out;\r\n if (Array.isArray(bind)) {\r\n for (const b of bind) if (b) out.add(String(b));\r\n } else {\r\n out.add(String(bind));\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────── Dev warnings ───────────────── */\r\n\r\nfunction buildDevWarnings(\r\n props: ServiceProps,\r\n svcMap: DgpServiceMap,\r\n _tagId: string,\r\n _snapshotServiceMap: Record<string, Array<string | number>>,\r\n originalFallbacks: ServiceFallbacks | undefined,\r\n _prunedFallbacks: ServiceFallbacks | undefined,\r\n fieldById: Map<string, Field>,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n): OrderSnapshot[\"warnings\"] | undefined {\r\n const out: OrderSnapshot[\"warnings\"] = {};\r\n\r\n // Fallback diagnostics (non-fatal). Call only if a global helper is present at runtime.\r\n const maybeCollectFailed:\r\n | ((\r\n p: ServiceProps,\r\n sm: DgpServiceMap,\r\n s: { mode: \"dev\" },\r\n ) => FallbackDiagnostics[])\r\n | undefined = (globalThis as any).collectFailedFallbacks;\r\n\r\n try {\r\n if (maybeCollectFailed && originalFallbacks) {\r\n const diags = maybeCollectFailed(\r\n {\r\n ...props,\r\n fallbacks: originalFallbacks,\r\n } as ServiceProps,\r\n svcMap,\r\n { mode: \"dev\" },\r\n );\r\n if (diags && diags.length) {\r\n out.fallbacks = diags;\r\n }\r\n }\r\n } catch {\r\n // ignore diagnostics failures in dev\r\n }\r\n\r\n // Utility/Form warnings: missing field.name while value present (only for non-option fields)\r\n const utilityWarnings: Array<{ nodeId: string; reason: string }> = [];\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n const hasVal = selection.formValuesByFieldId[fid] !== undefined;\r\n if (hasVal && !f.name && !isOptionBased(f)) {\r\n utilityWarnings.push({\r\n nodeId: fid,\r\n reason: \"missing_field_name_for_form_value\",\r\n });\r\n }\r\n }\r\n if (utilityWarnings.length) {\r\n (out as any).utility = utilityWarnings;\r\n }\r\n\r\n if (!(out as any).fallbacks && !(out as any).utility) return undefined;\r\n return out;\r\n}\r\n\r\n/* ───────────────── Mapping: internal settings → SnapshotContext.policy ───────────────── */\r\n\r\nfunction toSnapshotPolicy(settings: FallbackSettings): {\n ratePolicy:\n | { kind: \"eq_primary\" }\n | { kind: \"lte_primary\"; pct: number }\n | { kind: \"within_pct\"; pct: number }\n | { kind: \"at_least_pct_lower\"; pct: number };\n requireConstraintFit: boolean;\n} {\n const requireConstraintFit = settings.requireConstraintFit ?? true;\n const rp = normalizeRatePolicy(settings.ratePolicy);\n return { ratePolicy: rp, requireConstraintFit };\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction resolveMinMax(\r\n servicesList: Array<string | number>,\r\n services: DgpServiceMap,\r\n): { min: number; max?: number } {\r\n let min: number | undefined = undefined;\r\n let max: number | undefined = undefined;\r\n\r\n for (const sid of servicesList) {\r\n const cap = getCap(services, sid);\r\n if (!cap) continue;\r\n\r\n if (typeof cap.min === \"number\" && Number.isFinite(cap.min)) {\r\n min = min === undefined ? cap.min : Math.min(min, cap.min);\r\n }\r\n if (typeof cap.max === \"number\" && Number.isFinite(cap.max)) {\r\n max = max === undefined ? cap.max : Math.max(max, cap.max);\r\n }\r\n }\r\n\r\n return { min: min ?? 1, ...(max !== undefined ? { max } : {}) };\r\n}\r\n","// src/core/fallback-editor.ts\r\n\r\nimport { collectFailedFallbacks, getEligibleFallbacks, getFallbackRegistrationInfo } from \"@/core\";\r\n\r\nimport type {\r\n FallbackCandidateCheck,\r\n FallbackCheckReason,\r\n FallbackCheckResult,\r\n FallbackEditorOptions,\r\n FallbackEditorState,\r\n FallbackMutationOptions,\r\n FallbackRegistration,\r\n FallbackScopeRef,\r\n Field,\r\n FieldOption,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n ServiceProps,\r\n Tag\r\n} from \"@/schema\";\r\n\r\n/**\r\n * Keep the editor contract exactly as discussed:\r\n * - mutates only ServiceFallback (internal clone)\r\n * - props are read-only context\r\n * - get(serviceId) is service-centric\r\n * - getScope(context) is raw scope access\r\n */\r\nexport interface FallbackEditor {\r\n state(): FallbackEditorState;\r\n value(): ServiceFallback;\r\n reset(): FallbackEditorState;\r\n\r\n /** Service-centric: all registrations that belong to this primary service */\r\n get(serviceId: ServiceIdRef): FallbackRegistration[];\r\n\r\n /** Exact/raw scope access */\r\n getScope(context: FallbackScopeRef): ServiceIdRef[];\r\n\r\n /** Validation preview */\r\n check(\r\n context: FallbackScopeRef,\r\n candidates?: ServiceIdRef[],\r\n ): FallbackCheckResult;\r\n\r\n add(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n addMany(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n remove(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n ): FallbackEditorState;\r\n\r\n replace(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState;\r\n\r\n clear(context: FallbackScopeRef): FallbackEditorState;\r\n\r\n /**\r\n * Optional helper for picker UIs:\r\n * shows candidates that the core fallback resolver would currently accept.\r\n */\r\n eligible(\r\n context: FallbackScopeRef,\r\n options?: {\r\n exclude?: ServiceIdRef[];\r\n unique?: boolean;\r\n limit?: number;\r\n },\r\n ): ServiceIdRef[];\r\n}\r\n\r\ntype NodeRegistrationInfo =\r\n | {\r\n ok: true;\r\n primary: ServiceIdRef;\r\n tagContexts: string[];\r\n }\r\n | {\r\n ok: false;\r\n reasons: FallbackCheckReason[];\r\n };\r\n\r\nexport function createFallbackEditor(\r\n options: FallbackEditorOptions = {},\r\n): FallbackEditor {\r\n const original = cloneFallbacks(options.fallbacks);\r\n let current = cloneFallbacks(options.fallbacks);\r\n\r\n const props = options.props;\r\n const services = options.services ?? {};\r\n const settings = options.settings ?? {};\r\n\r\n function state(): FallbackEditorState {\r\n return {\r\n original: cloneFallbacks(original),\r\n current: cloneFallbacks(current),\r\n changed: !sameFallbacks(original, current),\r\n };\r\n }\r\n\r\n function value(): ServiceFallback {\r\n return cloneFallbacks(current);\r\n }\r\n\r\n function reset(): FallbackEditorState {\r\n current = cloneFallbacks(original);\r\n return state();\r\n }\r\n\r\n function get(serviceId: ServiceIdRef): FallbackRegistration[] {\r\n const out: FallbackRegistration[] = [];\r\n\r\n for (const [primary, list] of Object.entries(current.global ?? {})) {\r\n if (String(primary) !== String(serviceId)) continue;\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n services: [...(list ?? [])],\r\n });\r\n }\r\n\r\n if (!props) return out;\r\n\r\n for (const [nodeId, list] of Object.entries(current.nodes ?? {})) {\r\n const info = getFallbackRegistrationInfo(props, nodeId);\r\n if (String(info.primary) !== String(serviceId)) continue;\r\n\r\n out.push({\r\n scope: \"node\",\r\n scopeId: nodeId,\r\n primary: info.primary!,\r\n services: [...(list ?? [])],\r\n });\r\n }\r\n\r\n return out;\r\n }\r\n function getScope(context: FallbackScopeRef): ServiceIdRef[] {\r\n if (context.scope === \"global\") {\r\n return [...(current.global?.[context.primary] ?? [])];\r\n }\r\n return [...(current.nodes?.[context.nodeId] ?? [])];\r\n }\r\n\r\n function check(\r\n context: FallbackScopeRef,\r\n candidates?: ServiceIdRef[],\r\n ): FallbackCheckResult {\r\n const normalized = normalizeCandidateList(\r\n candidates ?? getScope(context),\r\n true,\r\n );\r\n\r\n if (context.scope === \"node\" && !props) {\r\n return {\r\n context,\r\n allowed: [],\r\n rejected: normalized.map((candidate) => ({\r\n candidate,\r\n ok: false,\r\n reasons: [\"missing_service_props\"],\r\n })),\r\n warnings: [\"missing_service_props\"],\r\n };\r\n }\r\n\r\n // Build a temporary fallback payload with only this scope updated,\r\n // then let the canonical fallback validator tell us what fails.\r\n const tempFallbacks = cloneFallbacks(current);\r\n\r\n if (context.scope === \"global\") {\r\n tempFallbacks.global ??= {};\r\n if (normalized.length)\r\n tempFallbacks.global[context.primary] = normalized;\r\n else delete tempFallbacks.global[context.primary];\r\n } else {\r\n tempFallbacks.nodes ??= {};\r\n if (normalized.length)\r\n tempFallbacks.nodes[context.nodeId] = normalized;\r\n else delete tempFallbacks.nodes[context.nodeId];\r\n }\r\n\r\n // Without props, global checking can still do minimal structural validation.\r\n if (!props) {\r\n if (context.scope !== \"global\") {\r\n return {\r\n context,\r\n allowed: [],\r\n rejected: normalized.map((candidate) => ({\r\n candidate,\r\n ok: false,\r\n reasons: [\"missing_service_props\"],\r\n })),\r\n warnings: [\"missing_service_props\"],\r\n };\r\n }\r\n\r\n const rejected: FallbackCandidateCheck[] = [];\r\n const allowed: ServiceIdRef[] = [];\r\n\r\n for (const candidate of normalized) {\r\n const reasons: FallbackCheckReason[] = [];\r\n\r\n if (String(candidate) === String(context.primary)) {\r\n reasons.push(\"self_reference\");\r\n }\r\n\r\n if (reasons.length) {\r\n rejected.push({ candidate, ok: false, reasons });\r\n } else {\r\n allowed.push(candidate);\r\n }\r\n }\r\n\r\n return {\r\n context,\r\n primary: context.primary,\r\n allowed,\r\n rejected,\r\n warnings: [],\r\n };\r\n }\r\n\r\n const fakeProps: ServiceProps = {\r\n ...props,\r\n fallbacks: tempFallbacks,\r\n };\r\n\r\n const diags = collectFailedFallbacks(fakeProps, services, {\r\n ...settings,\r\n mode: \"dev\",\r\n });\r\n\r\n const scoped = diags.filter((d) => {\r\n if (context.scope === \"global\") {\r\n return (\r\n d.scope === \"global\" &&\r\n String(d.primary) === String(context.primary)\r\n );\r\n }\r\n return (\r\n d.scope === \"node\" &&\r\n String(d.nodeId) === String(context.nodeId)\r\n );\r\n });\r\n\r\n const rejected: FallbackCandidateCheck[] = normalized\r\n .map((candidate) => {\r\n const reasons = scoped\r\n .filter((d) => String(d.candidate) === String(candidate))\r\n .map((d) => mapDiagReason(d.reason));\r\n\r\n return {\r\n candidate,\r\n ok: reasons.length === 0,\r\n reasons,\r\n };\r\n })\r\n .filter((row) => !row.ok);\r\n\r\n const allowed = normalized.filter(\r\n (candidate) =>\r\n !rejected.some(\r\n (r) => String(r.candidate) === String(candidate),\r\n ),\r\n );\r\n\r\n const info =\r\n context.scope === \"global\"\r\n ? { ok: true, primary: context.primary }\r\n : getNodeRegistrationInfo(props, context.nodeId);\r\n const primary = info?.ok ? info.primary : undefined;\r\n\r\n return {\r\n context,\r\n primary,\r\n allowed,\r\n rejected,\r\n warnings: [],\r\n };\r\n }\r\n\r\n function add(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n return addMany(context, [candidate], options);\r\n }\r\n\r\n function addMany(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n const existing = getScope(context);\r\n const merged = [...existing];\r\n\r\n const insertAt =\r\n typeof options?.index === \"number\"\r\n ? clamp(options.index, 0, merged.length)\r\n : undefined;\r\n\r\n const incoming = normalizeCandidateList(candidates, true).filter(\r\n (id) => !merged.some((x) => String(x) === String(id)),\r\n );\r\n\r\n if (insertAt === undefined) {\r\n merged.push(...incoming);\r\n } else {\r\n merged.splice(insertAt, 0, ...incoming);\r\n }\r\n\r\n return replace(context, merged, options);\r\n }\r\n\r\n function remove(\r\n context: FallbackScopeRef,\r\n candidate: ServiceIdRef,\r\n ): FallbackEditorState {\r\n const next = getScope(context).filter(\r\n (id) => String(id) !== String(candidate),\r\n );\r\n return writeScope(context, next);\r\n }\r\n\r\n function replace(\r\n context: FallbackScopeRef,\r\n candidates: ServiceIdRef[],\r\n options?: FallbackMutationOptions,\r\n ): FallbackEditorState {\r\n const strict = !!options?.strict;\r\n const normalized = normalizeCandidateList(candidates, true);\r\n const checked = check(context, normalized);\r\n const next = strict ? checked.allowed : normalized;\r\n return writeScope(context, next);\r\n }\r\n\r\n function clear(context: FallbackScopeRef): FallbackEditorState {\r\n return writeScope(context, []);\r\n }\r\n\r\n function eligible(\r\n context: FallbackScopeRef,\r\n opt?: {\r\n exclude?: ServiceIdRef[];\r\n unique?: boolean;\r\n limit?: number;\r\n },\r\n ): ServiceIdRef[] {\r\n if (!props) return [];\r\n\r\n if (context.scope === \"global\") {\r\n return getEligibleFallbacks({\r\n primary: context.primary,\r\n services,\r\n fallbacks: current,\r\n settings,\r\n props,\r\n exclude: opt?.exclude,\r\n unique: opt?.unique,\r\n limit: opt?.limit,\r\n });\r\n }\r\n\r\n const info = getFallbackRegistrationInfo(props, context.nodeId);\r\n if (!info.primary) return [];\r\n\r\n return getEligibleFallbacks({\r\n primary: info.primary,\r\n nodeId: context.nodeId,\r\n tagId: info.tagContexts[0],\r\n services,\r\n fallbacks: current,\r\n settings,\r\n props,\r\n exclude: opt?.exclude,\r\n unique: opt?.unique,\r\n limit: opt?.limit,\r\n });\r\n }\r\n\r\n function writeScope(\r\n context: FallbackScopeRef,\r\n nextList: ServiceIdRef[],\r\n ): FallbackEditorState {\r\n const next = cloneFallbacks(current);\r\n\r\n if (context.scope === \"global\") {\r\n next.global ??= {};\r\n if (nextList.length) {\r\n next.global[context.primary] = [...nextList];\r\n } else {\r\n delete next.global[context.primary];\r\n if (!Object.keys(next.global).length) delete next.global;\r\n }\r\n } else {\r\n next.nodes ??= {};\r\n if (nextList.length) {\r\n next.nodes[context.nodeId] = [...nextList];\r\n } else {\r\n delete next.nodes[context.nodeId];\r\n if (!Object.keys(next.nodes).length) delete next.nodes;\r\n }\r\n }\r\n\r\n current = next;\r\n return state();\r\n }\r\n\r\n return {\r\n state,\r\n value,\r\n reset,\r\n get,\r\n getScope,\r\n check,\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n eligible,\r\n };\r\n}\r\n\r\n/* -------------------------------- helpers ------------------------------- */\r\n\r\nfunction cloneFallbacks(input?: ServiceFallback): ServiceFallback {\r\n return {\r\n ...(input?.nodes ? { nodes: cloneRecordArray(input.nodes) } : {}),\r\n ...(input?.global ? { global: cloneRecordArray(input.global) } : {}),\r\n };\r\n}\r\n\r\nfunction cloneRecordArray<T extends string | number>(\r\n input: Record<string | number, T[]>,\r\n): Record<string | number, T[]> {\r\n const out: Record<string | number, T[]> = {};\r\n for (const [k, v] of Object.entries(input)) out[k] = [...(v ?? [])];\r\n return out;\r\n}\r\n\r\nfunction sameFallbacks(a?: ServiceFallback, b?: ServiceFallback): boolean {\r\n return JSON.stringify(a ?? {}) === JSON.stringify(b ?? {});\r\n}\r\n\r\nfunction normalizeCandidateList(\r\n input: ServiceIdRef[],\r\n preserveOrder: boolean,\r\n): ServiceIdRef[] {\r\n const out: ServiceIdRef[] = [];\r\n for (const item of input ?? []) {\r\n if (!isValidServiceIdRef(item)) continue;\r\n const exists = out.some((x) => String(x) === String(item));\r\n if (exists) continue;\r\n out.push(item);\r\n }\r\n return preserveOrder ? out : out;\r\n}\r\n\r\nfunction isValidServiceIdRef(value: unknown): value is ServiceIdRef {\r\n return (\r\n (typeof value === \"number\" && Number.isFinite(value)) ||\r\n (typeof value === \"string\" && value.trim().length > 0)\r\n );\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, n));\r\n}\r\n\r\n/**\r\n * Mirrors primaryForNode(...) semantics from core/fallback.ts:\r\n * - tag.id => tag.service_id\r\n * - option.id => option.service_id\r\n * - option tag contexts => bind_id array of parent field\r\n */\r\nfunction getNodeRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): NodeRegistrationInfo {\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n if (!isValidServiceIdRef((tag as Tag).service_id)) {\r\n return { ok: false, reasons: [\"no_primary\"] };\r\n }\r\n return {\r\n ok: true,\r\n primary: (tag as Tag).service_id as any,\r\n tagContexts: [tag.id],\r\n };\r\n }\r\n\r\n const hit = findOptionOwner(props.fields, nodeId);\r\n if (!hit) {\r\n return { ok: false, reasons: [\"node_not_found\"] };\r\n }\r\n\r\n if (!isValidServiceIdRef((hit.option as FieldOption).service_id)) {\r\n return { ok: false, reasons: [\"no_primary\"] };\r\n }\r\n\r\n return {\r\n ok: true,\r\n primary: (hit.option as FieldOption).service_id as any,\r\n tagContexts: bindIdsToArray(hit.field.bind_id),\r\n };\r\n}\r\n\r\nfunction findOptionOwner(\r\n fields: Field[],\r\n optionId: string,\r\n): { field: Field; option: FieldOption } | null {\r\n for (const field of fields) {\r\n for (const option of field.options ?? []) {\r\n if (option.id === optionId) return { field, option };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction bindIdsToArray(v: string | string[] | undefined): string[] {\r\n if (Array.isArray(v)) return v.filter(Boolean);\r\n return v ? [v] : [];\r\n}\r\n\r\nfunction mapDiagReason(reason: unknown): FallbackCheckReason {\r\n switch (String(reason)) {\r\n case \"unknown_service\":\r\n return \"unknown_service\";\r\n case \"no_primary\":\r\n return \"no_primary\";\r\n case \"rate_violation\":\r\n return \"rate_violation\";\r\n case \"constraint_mismatch\":\r\n return \"constraint_mismatch\";\r\n case \"cycle\":\r\n return \"cycle\";\r\n case \"no_tag_context\":\r\n return \"no_tag_context\";\r\n default:\r\n return \"node_not_found\";\r\n }\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function uniqueId(ctx: EditorModuleContext, base: string): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ]);\r\n let candidate = nextCopyId(base);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function uniqueOptionId(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n base: string,\r\n): string {\r\n const props = ctx.getProps();\r\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\r\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\r\n let candidate = base;\r\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function genId(\r\n ctx: EditorModuleContext,\r\n prefix: \"t\" | \"f\" | \"o\",\r\n): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ...(props.fields ?? []).flatMap((f) => f.options?.map((o) => o.id) ?? []),\r\n ]);\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `${prefix}:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate id\");\r\n}\r\n\r\nexport function nextCopyLabel(old: string): string {\r\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\r\n if (!m) return `${old} (copy)`;\r\n const stem = m[1].trim();\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem} (copy ${n})`;\r\n}\r\n\r\nexport function nextCopyName(old?: string): string | undefined {\r\n if (!old) return undefined;\r\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function defaultOptionIdStrategy(old: string): string {\r\n return nextCopyId(old);\r\n}\r\n\r\nexport function nextCopyId(old: string): string {\r\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function bumpSuffix(old: string): string {\r\n const m = old.match(/^(.*?)(\\d+)$/);\r\n if (!m) return `${old}2`;\r\n const stem = m[1];\r\n return `${stem}${parseInt(m[2], 10) + 1}`;\r\n}\r\n","import type { ServiceProps, Tag } from \"@/schema\";\r\nimport type {\r\n DuplicateOptions,\r\n EditorModuleContext,\r\n NodeRef,\r\n} from \"./editor-types\";\r\nimport {\r\n defaultOptionIdStrategy,\r\n nextCopyLabel,\r\n nextCopyName,\r\n} from \"./editor-ids\";\r\n\r\nexport function duplicate(\r\n ctx: EditorModuleContext,\r\n ref: NodeRef,\r\n opts: DuplicateOptions = {},\r\n): string {\r\n const snapBefore = ctx.makeSnapshot(\"duplicate:before\");\r\n try {\r\n let newId = \"\";\r\n ctx.transact(\"duplicate\", () => {\r\n if (ref.kind === \"tag\") {\r\n newId = duplicateTag(ctx, ref.id, opts);\r\n } else if (ref.kind === \"field\") {\r\n newId = duplicateField(ctx, ref.id, opts);\r\n } else {\r\n newId = duplicateOption(ctx, ref.fieldId, ref.id, opts);\r\n }\r\n });\r\n return newId;\r\n } catch (err) {\r\n ctx.loadSnapshot(snapBefore, \"undo\");\r\n throw err;\r\n }\r\n}\r\n\r\nexport function duplicateTag(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const tags = props.filters ?? [];\r\n const src = tags.find((t) => t.id === tagId);\r\n if (!src) throw new Error(`Tag not found: ${tagId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n\r\n if (!opts.withChildren) {\r\n ctx.patchProps((p) => {\r\n const clone = { ...src, id, label };\r\n clone.bind_id = src.bind_id;\r\n clone.constraints_overrides = undefined;\r\n clone.constraints_origin = undefined;\r\n const arr = p.filters ?? [];\r\n const idx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(idx + 1, 0, clone);\r\n p.filters = arr;\r\n });\r\n return id;\r\n }\r\n\r\n const idMap = new Map<string, string>();\r\n const collect = (t: typeof src, acc: (typeof src)[]) => {\r\n acc.push(t);\r\n for (const child of tags.filter((x) => x.bind_id === t.id)) {\r\n collect(child as any, acc);\r\n }\r\n };\r\n const subtree: (typeof src)[] = [];\r\n collect(src, subtree);\r\n\r\n for (const n of subtree) {\r\n idMap.set(n.id, n.id === src.id ? id : ctx.uniqueId(n.id));\r\n }\r\n\r\n const clones = subtree.map((n) => {\r\n const cloned = { ...n };\r\n cloned.id = idMap.get(n.id)!;\r\n cloned.label =\r\n n.id === src.id\r\n ? label\r\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\r\n cloned.bind_id = n.bind_id ? (idMap.get(n.bind_id) ?? n.bind_id) : undefined;\r\n cloned.constraints_origin = undefined;\r\n cloned.constraints_overrides = undefined;\r\n return cloned;\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.filters ?? [];\r\n const rootIdx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(rootIdx + 1, 0, clones[0] as any);\r\n for (const c of clones.slice(1)) arr.push(c as any);\r\n p.filters = arr;\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateField(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const src = fields.find((f) => f.id === fieldId);\r\n if (!src) throw new Error(`Field not found: ${fieldId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n const name = opts.nameStrategy\r\n ? opts.nameStrategy(src.name)\r\n : nextCopyName(src.name);\r\n\r\n const optId = (old: string) =>\r\n ctx.uniqueOptionId(\r\n id,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\r\n );\r\n\r\n const clonedOptions = (src.options ?? []).map((o) => ({\r\n ...o,\r\n id: optId(o.id),\r\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\r\n }));\r\n\r\n const cloned = {\r\n ...src,\r\n id,\r\n label,\r\n name,\r\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\r\n options: clonedOptions,\r\n } as typeof src;\r\n\r\n const optionIdMap = new Map<string, string>();\r\n (src.options ?? []).forEach((o, i) => {\r\n const newOptId = clonedOptions[i]?.id ?? o.id;\r\n optionIdMap.set(o.id, newOptId);\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.fields ?? [];\r\n const idx = arr.findIndex((f) => f.id === fieldId);\r\n arr.splice(idx + 1, 0, cloned as any);\r\n p.fields = arr;\r\n\r\n if (opts.copyIncludesExcludes) {\r\n for (const t of p.filters ?? []) {\r\n if (t.includes?.includes(fieldId)) {\r\n const s = new Set(t.includes);\r\n s.add(id);\r\n t.includes = Array.from(s);\r\n }\r\n if (t.excludes?.includes(fieldId)) {\r\n const s = new Set(t.excludes);\r\n s.add(id);\r\n t.excludes = Array.from(s);\r\n }\r\n }\r\n }\r\n\r\n if (opts.copyOptionMaps) {\r\n const maps: Array<\"includes_for_buttons\" | \"excludes_for_buttons\"> = [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ];\r\n\r\n for (const mapKey of maps) {\r\n const srcMap = (p as any)[mapKey] ?? {};\r\n const nextMap: Record<string, string[]> = { ...srcMap };\r\n\r\n for (const [key, targets] of Object.entries(\r\n srcMap as Record<string, string[]>,\r\n )) {\r\n if (key === fieldId) {\r\n const newKey = id;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n continue;\r\n }\r\n\r\n if (optionIdMap.has(key)) {\r\n const newKey = optionIdMap.get(key)!;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n }\r\n }\r\n\r\n (p as any)[mapKey] = nextMap;\r\n }\r\n }\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n optionId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`Field not found: ${fieldId}`);\r\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (optIdx < 0) {\r\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\r\n }\r\n const src = (f.options ?? [])[optIdx];\r\n\r\n const newId = ctx.uniqueOptionId(\r\n fieldId,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\r\n );\r\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? src.id);\r\n\r\n ctx.patchProps((p) => {\r\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\r\n const arr = fld.options ?? [];\r\n const clone = { ...src, id: newId, label: newLabel };\r\n arr.splice(optIdx + 1, 0, clone);\r\n fld.options = arr;\r\n\r\n if (opts.copyOptionMaps) {\r\n const oldKey = `${fieldId}::${optionId}`;\r\n const newKey = `${fieldId}::${newId}`;\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey] ?? {};\r\n if (m[oldKey]) {\r\n m[newKey] = Array.from(new Set(m[oldKey]));\r\n p[mapKey] = m as any;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return newId;\r\n}\r\n","import type { ServicePropsNotice } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\n\r\nfunction genNoticeId(ctx: EditorModuleContext): string {\r\n const taken = new Set((ctx.getProps().notices ?? []).map((n) => n.id));\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `n:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate notice id\");\r\n}\r\n\r\nexport function addNotice(\r\n ctx: EditorModuleContext,\r\n input: Omit<ServicePropsNotice, \"id\"> & { id?: string },\r\n): string {\r\n const id = input.id ?? genNoticeId(ctx);\r\n\r\n ctx.exec({\r\n name: \"addNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = (p.notices ??= []);\r\n if (notices.some((n) => n.id === id)) {\r\n throw new Error(`Notice id '${id}' already exists`);\r\n }\r\n notices.push({ ...input, id });\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateNotice(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<ServicePropsNotice>,\r\n): void {\r\n const { id: _ignored, ...rest } = patch;\r\n ctx.exec({\r\n name: \"updateNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = p.notices;\r\n if (!notices?.length) return;\r\n\r\n const target = notices.find((n) => n.id === id);\r\n if (!target) return;\r\n Object.assign(target, rest);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeNotice(ctx: EditorModuleContext, id: string): void {\r\n ctx.exec({\r\n name: \"removeNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (!p.notices?.length) return;\r\n p.notices = p.notices.filter((n) => n.id !== id);\r\n if (!p.notices.length) delete p.notices;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { cloneDeep } from \"lodash-es\";\nimport type { Field, ServiceIdRef, ServiceProps, Tag } from \"@/schema\";\nimport type {\r\n EditorModuleContext,\r\n EditorNodeLookup,\r\n} from \"./editor-types\";\r\nimport { clearFieldButtonReceiverMaps, isActualButtonField, ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function reLabel(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n nextLabel: string,\r\n): void {\r\n const label = String(nextLabel ?? \"\").trim();\r\n\r\n ctx.exec({\r\n name: \"reLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if ((t.label ?? \"\") === label) return;\r\n t.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n if ((o.label ?? \"\") === label) return;\r\n o.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n const fld = (p.fields ?? []).find((x) => x.id === id);\r\n if (!fld) return;\r\n if ((fld.label ?? \"\") === label) return;\r\n fld.label = label;\r\n ctx.api.refreshGraph();\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setFieldName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n nextName: string | null | undefined,\r\n): void {\r\n const raw = typeof nextName === \"string\" ? nextName : \"\";\r\n const name = raw.trim();\r\n\r\n ctx.exec({\r\n name: \"setFieldName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const fields = p.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_not_found\",\r\n message: `Field not found: ${fieldId}`,\r\n meta: { fieldId },\r\n });\r\n return;\r\n }\r\n\r\n const fieldHasService =\n (typeof (f as any).service_id === \"number\" &&\n Number.isFinite((f as any).service_id)) ||\n (typeof (f as any).service_id === \"string\" &&\n (f as any).service_id.trim().length > 0);\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) =>\n (typeof (o as any).service_id === \"number\" &&\n Number.isFinite((o as any).service_id)) ||\n (typeof (o as any).service_id === \"string\" &&\n (o as any).service_id.trim().length > 0),\n )\n : false;\n\r\n if (fieldHasService || optionHasService) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_has_service_mapping\",\r\n message:\r\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\r\n meta: {\r\n fieldId,\r\n fieldHasService,\r\n optionHasService,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (name.length === 0) {\r\n if (\"name\" in f) delete (f as any).name;\r\n return;\r\n }\r\n\r\n const collision = fields.find(\r\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\r\n );\r\n if (collision) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_name_collision\",\r\n message: `Another field already uses the name \"${name}\".`,\r\n meta: { fieldId, otherFieldId: collision.id },\r\n });\r\n return;\r\n }\r\n\r\n (f as any).name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n input: {\r\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\r\n): string {\r\n const id = input.id ?? ctx.genId(\"o\");\r\n\r\n ctx.exec({\r\n name: \"addOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`addOption: field '${fieldId}' not found`);\r\n const list = (f.options ??= []);\r\n if (list.some((o) => o.id === id)) {\r\n throw new Error(`Option id '${id}' already exists`);\r\n }\r\n list.push({ ...input, id } as any);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n patch: Partial<\r\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('updateOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"updateOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n const o = f.options.find((x) => x.id === optionId);\r\n if (o) Object.assign(o, patch);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeOption(ctx: EditorModuleContext, optionId: string) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('removeOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"removeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n f.options = f.options.filter((o) => o.id !== optionId);\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n if (map[optionId]) delete map[optionId];\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editLabel(ctx: EditorModuleContext, id: string, label: string): void {\r\n const next = (label ?? \"\").trim();\r\n if (!next) throw new Error(\"Label cannot be empty\");\r\n\r\n ctx.exec({\r\n name: \"editLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (t) t.label = next;\r\n return;\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (f) f.label = next;\r\n return;\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (o) o.label = next;\r\n return;\r\n }\r\n throw new Error(\"editLabel: unsupported id\");\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n name: string | undefined,\r\n) {\r\n ctx.exec({\r\n name: \"editName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n f.name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setService(\n ctx: EditorModuleContext,\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n): void {\n ctx.exec({\r\n name: \"setService\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n ((typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id)) ||\n (typeof input.service_id === \"string\" &&\n input.service_id.trim().length > 0));\n const sid: ServiceIdRef | undefined = validId\n ? typeof input.service_id === \"string\"\n ? input.service_id.trim()\n : Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\r\n\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (t as any).service_id;\r\n else t.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n\r\n const currentRole = (o.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n const role = nextRole ?? currentRole;\r\n\r\n if (role === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (option).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n o.pricing_role = \"utility\";\r\n if (\"service_id\" in o) delete (o as any).service_id;\r\n return;\r\n }\r\n\r\n if (nextRole) o.pricing_role = \"base\";\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (o as any).service_id;\r\n else o.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) {\r\n throw new Error(\r\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\r\n );\r\n }\r\n\r\n const isOptionBased = Array.isArray(f.options) && f.options.length > 0;\r\n const isButton = !!(f as any).button;\r\n\r\n if (nextRole) {\r\n f.pricing_role = nextRole;\r\n }\r\n const effectiveRole = (f.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n\r\n if (isOptionBased) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\r\n code: \"field_option_based_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (!isButton) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Only button fields (without options) can have a service_id.\",\r\n code: \"non_button_field_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (effectiveRole === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (field).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (f as any).service_id;\r\n else (f as any).service_id = sid;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addTag(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"t\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = [...(p.filters ?? []), payload];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateTag(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Tag>,\r\n) {\r\n let prev: Tag | undefined;\r\n ctx.exec({\r\n name: \"updateTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) => {\r\n if (t.id !== id) return t;\r\n prev = t;\r\n return { ...t, ...patch };\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) =>\r\n t.id === id && prev ? prev : t,\r\n );\r\n }),\r\n });\r\n}\r\n\r\nexport function removeTag(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id);\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function addField(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\r\n id?: string;\r\n label: string;\r\n type: Field[\"type\"];\r\n },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"f\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = [...(p.fields ?? []), payload as Field];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateField(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Field>,\r\n) {\r\n let prev: Field | undefined;\r\n let prevIncludesForButton: string[] | undefined;\r\n let prevExcludesForButton: string[] | undefined;\r\n ctx.exec({\r\n name: \"updateField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevIncludesForButton = p.includes_for_buttons?.[id]\r\n ? [...(p.includes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n prevExcludesForButton = p.excludes_for_buttons?.[id]\r\n ? [...(p.excludes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n\r\n p.fields = (p.fields ?? []).map((f) => {\r\n if (f.id !== id) return f;\r\n prev = cloneDeep(f);\r\n const nextField = { ...f, ...patch } as Field;\r\n if (!isActualButtonField(nextField)) {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n return nextField;\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).map((f) =>\r\n f.id === id && prev ? prev : f,\r\n );\r\n if (prevIncludesForButton) {\r\n p.includes_for_buttons = {\r\n ...(p.includes_for_buttons ?? {}),\r\n [id]: [...prevIncludesForButton],\r\n };\r\n } else {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n if (prevExcludesForButton) {\r\n p.excludes_for_buttons = {\r\n ...(p.excludes_for_buttons ?? {}),\r\n [id]: [...prevExcludesForButton],\r\n };\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function removeField(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n clearFieldButtonReceiverMaps(p, id);\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey];\r\n if (!m) continue;\r\n for (const k of Object.keys(m)) {\r\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\r\n if (!m[k]?.length) delete m[k];\r\n }\r\n }\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function remove(ctx: EditorModuleContext, id: string) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id) as any;\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n\r\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => (p.fields ?? []).some((f) => f.id === fid),\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => fid !== id,\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n for (const key of Object.keys(map)) {\r\n map[key] = (map[key] ?? []).filter((fid) => fid !== id);\r\n if (!map[key]?.length) delete map[key];\r\n }\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n removeOption(ctx, id);\r\n return;\r\n }\r\n\r\n throw new Error(\"remove: unknown id prefix\");\r\n}\r\n\r\nexport function getNode(ctx: EditorModuleContext, id: string): EditorNodeLookup {\r\n const props = ctx.getProps();\r\n if (ctx.isTagId(id)) {\r\n const t = (props.filters ?? []).find((x) => x.id === id);\r\n return {\r\n kind: \"tag\",\r\n data: t,\r\n owners: { parentTagId: t?.bind_id },\r\n };\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n const bind = Array.isArray(f?.bind_id)\r\n ? (f!.bind_id as string[])\r\n : f?.bind_id\r\n ? [f.bind_id]\r\n : [];\r\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(props, id);\r\n const f = own ? (props.fields ?? []).find((x) => x.id === own.fieldId) : undefined;\r\n const o = f?.options?.find((x) => x.id === id);\r\n return {\r\n kind: \"option\",\r\n data: o,\r\n owners: { fieldId: own?.fieldId },\r\n };\r\n }\r\n return { kind: \"option\", data: undefined, owners: {} };\r\n}\r\n","import type { EditorOptions, Field, ServiceProps } from \"@/schema\";\r\n\r\nexport function ownerOfOption(\r\n props: ServiceProps,\r\n optionId: string,\r\n): { fieldId: string; index: number } | null {\r\n for (const f of props.fields ?? []) {\r\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (idx >= 0) return { fieldId: f.id, index: idx };\r\n }\r\n return null;\r\n}\r\n\r\nexport function hasFieldOptions(field: Partial<Field> | undefined): boolean {\r\n return Array.isArray(field?.options) && field.options.length > 0;\r\n}\r\n\r\nexport function isActualButtonField(field: Partial<Field> | undefined): boolean {\r\n return field?.button === true && !hasFieldOptions(field);\r\n}\r\n\r\nexport function clearFieldButtonReceiverMaps(\r\n props: ServiceProps,\r\n fieldId: string,\r\n): void {\r\n if (props.includes_for_buttons?.[fieldId]) {\r\n delete props.includes_for_buttons[fieldId];\r\n }\r\n if (props.excludes_for_buttons?.[fieldId]) {\r\n delete props.excludes_for_buttons[fieldId];\r\n }\r\n if (\r\n props.includes_for_buttons &&\r\n Object.keys(props.includes_for_buttons).length === 0\r\n ) {\r\n delete props.includes_for_buttons;\r\n }\r\n if (\r\n props.excludes_for_buttons &&\r\n Object.keys(props.excludes_for_buttons).length === 0\r\n ) {\r\n delete props.excludes_for_buttons;\r\n }\r\n}\r\n\r\nexport function ensureServiceExists(opts: EditorOptions, id: any) {\r\n if (typeof opts.serviceExists === \"function\") {\r\n if (!opts.serviceExists(id)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n if (opts.serviceMap) {\r\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n throw new Error(\"service_checker_missing\");\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function setConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n value: boolean | undefined,\r\n) {\r\n let prev: boolean | undefined;\r\n ctx.exec({\r\n name: \"setConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n if (!t.constraints) t.constraints = {};\r\n if (value === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = value;\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (!t.constraints) t.constraints = {};\r\n if (prev === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = prev;\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraintOverride(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n let prev: boolean | undefined;\r\n let prevOverride: any;\r\n ctx.exec({\r\n name: \"clearConstraintOverride\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n prevOverride = t.constraints_overrides?.[flag];\r\n\r\n if (t.constraints) delete t.constraints[flag];\r\n if (t.constraints_overrides) delete t.constraints_overrides[flag];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (prev !== undefined) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = prev;\r\n }\r\n if (prevOverride !== undefined) {\r\n if (!t.constraints_overrides) t.constraints_overrides = {};\r\n t.constraints_overrides[flag] = prevOverride;\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n ctx.exec({\r\n name: \"clearConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const tags = p.filters ?? [];\r\n const byId = new Map(tags.map((t) => [t.id, t]));\r\n const children = new Map<string, string[]>();\r\n for (const t of tags) {\r\n if (t.bind_id) {\r\n if (!children.has(t.bind_id)) children.set(t.bind_id, []);\r\n children.get(t.bind_id)!.push(t.id);\r\n }\r\n }\r\n\r\n const process = (id: string) => {\r\n const t = byId.get(id);\r\n if (!t) return;\r\n\r\n const override = t.constraints_overrides?.[flag];\r\n if (override) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = override.from;\r\n delete t.constraints_overrides![flag];\r\n if (Object.keys(t.constraints_overrides ?? {}).length === 0) {\r\n delete t.constraints_overrides;\r\n }\r\n } else if (t.constraints) {\r\n delete t.constraints[flag];\r\n if (Object.keys(t.constraints).length === 0) {\r\n delete t.constraints;\r\n }\r\n }\r\n\r\n for (const childId of children.get(id) ?? []) {\r\n process(childId);\r\n }\r\n };\r\n\r\n process(tagId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { normalizeFieldValidation } from \"@/core\";\r\nimport type { FieldValidationRule } from \"@/schema\";\r\nimport type { EditorModuleContext, QuantityRule } from \"./editor-types\";\r\n\r\nexport function getFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): QuantityRule | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeQuantityRule((f as any).meta?.quantity);\r\n}\r\n\r\nexport function setFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rule: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeQuantityRule(rule);\r\n\r\n if (!normalized) {\r\n if ((f as any).meta?.quantity !== undefined) {\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n (f as any).meta = {\r\n ...(f as any).meta,\r\n quantity: normalized,\r\n };\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).meta?.quantity) return;\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function getFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): FieldValidationRule[] | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeFieldValidation((f as any).validation);\r\n}\r\n\r\nexport function setFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rules: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeFieldValidation(rules);\r\n\r\n if (!normalized) {\r\n if (\"validation\" in f) delete (f as any).validation;\r\n return;\r\n }\r\n\r\n (f as any).validation = normalized;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).validation) return;\r\n delete (f as any).validation;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function normalizeQuantityRule(input: unknown): QuantityRule | undefined {\r\n if (!input || typeof input !== \"object\") return undefined;\r\n const v = input as any;\r\n const vb = v.valueBy;\r\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\r\n\r\n const out: QuantityRule = { valueBy: vb };\r\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\r\n out.code = v.code;\r\n }\r\n if (typeof v.multiply === \"number\" && Number.isFinite(v.multiply)) {\r\n out.multiply = v.multiply;\r\n }\r\n if (typeof v.fallback === \"number\" && Number.isFinite(v.fallback)) {\r\n out.fallback = v.fallback;\r\n }\r\n if (v.clamp && typeof v.clamp === \"object\") {\r\n const min =\r\n typeof v.clamp.min === \"number\" && Number.isFinite(v.clamp.min)\r\n ? v.clamp.min\r\n : undefined;\r\n const max =\r\n typeof v.clamp.max === \"number\" && Number.isFinite(v.clamp.max)\r\n ? v.clamp.max\r\n : undefined;\r\n if (min !== undefined || max !== undefined) {\r\n out.clamp = {\r\n ...(min !== undefined ? { min } : {}),\r\n ...(max !== undefined ? { max } : {}),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ServiceProps } from \"@/schema\";\r\nimport type { EditorModuleContext, WireKind } from \"./editor-types\";\r\nimport { ensureServiceExists, isActualButtonField } from \"./editor-utils\";\r\n\r\nexport function wouldCreateTagCycle(\r\n _ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n parentId: string,\r\n childId: string,\r\n): boolean {\r\n if (parentId === childId) return true;\r\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\r\n let cur: string | undefined = parentId;\r\n const guard = new Set<string>();\r\n while (cur) {\r\n if (cur === childId) return true;\r\n if (guard.has(cur)) break;\r\n guard.add(cur);\r\n cur = tagById.get(cur)?.bind_id;\r\n }\r\n return false;\r\n}\r\n\r\nexport function wouldCreateIncludeExcludeCycle(\r\n ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n receiverId: string,\r\n targetId: string,\r\n): boolean {\r\n if (receiverId === targetId) return true;\r\n\r\n const getDirectRelations = (id: string): string[] => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\r\n }\r\n const inc = p.includes_for_buttons?.[id] ?? [];\r\n const exc = p.excludes_for_buttons?.[id] ?? [];\r\n return [...inc, ...exc];\r\n };\r\n\r\n const visited = new Set<string>();\r\n const stack = [targetId];\r\n\r\n while (stack.length > 0) {\r\n const curr = stack.pop()!;\r\n if (curr === receiverId) return true;\r\n if (visited.has(curr)) continue;\r\n visited.add(curr);\r\n stack.push(...getDirectRelations(curr));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function include(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"include\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.includes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.includes?.length ?? 0) > 0) {\r\n t.includes = Array.from(next);\r\n }\r\n\r\n if (t.excludes) {\r\n t.excludes = t.excludes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.excludes.length === 0) {\r\n delete t.excludes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.includes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.includes_for_buttons) p.includes_for_buttons = {};\r\n p.includes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.excludes_for_buttons?.[receiverId]) {\r\n p.excludes_for_buttons[receiverId] =\r\n p.excludes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.excludes_for_buttons[receiverId].length === 0) {\r\n delete p.excludes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function exclude(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"exclude\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.excludes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.excludes?.length ?? 0) > 0) {\r\n t.excludes = Array.from(next);\r\n }\r\n\r\n if (t.includes) {\r\n t.includes = t.includes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.includes.length === 0) {\r\n delete t.includes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.excludes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.excludes_for_buttons) p.excludes_for_buttons = {};\r\n p.excludes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.includes_for_buttons?.[receiverId]) {\r\n p.includes_for_buttons[receiverId] =\r\n p.includes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.includes_for_buttons[receiverId].length === 0) {\r\n delete p.includes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function connect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `connect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n if (wouldCreateTagCycle(ctx, p, fromId, toId)) {\r\n throw new Error(`bind would create a cycle: ${fromId} ? ${toId}`);\r\n }\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child) child.bind_id = fromId;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n if (!f.bind_id) {\r\n f.bind_id = tagId;\r\n return;\r\n }\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id !== tagId) f.bind_id = [f.bind_id, tagId];\r\n return;\r\n }\r\n if (!f.bind_id.includes(tagId)) f.bind_id.push(tagId);\r\n return;\r\n }\r\n throw new Error(`bind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n const arr = (t[key] ??= []);\r\n if (!arr.includes(toId)) arr.push(toId);\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n const next = { ...(maps ?? {}) };\r\n const arr = next[fromId] ?? [];\r\n if (!arr.includes(toId)) arr.push(toId);\r\n next[fromId] = arr;\r\n (p as any)[mapKey] = next;\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"connect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) (t as any).service_id = fromId;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"connect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n (o as any).service_id = fromId;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown connect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function disconnect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `disconnect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child?.bind_id === fromId) delete child.bind_id;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f?.bind_id) return;\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id === tagId) delete f.bind_id;\r\n return;\r\n }\r\n f.bind_id = f.bind_id.filter((x) => x !== tagId) as any;\r\n if (f.bind_id?.length === 0) delete f.bind_id;\r\n return;\r\n }\r\n throw new Error(`unbind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\r\n if (!t[key]?.length) delete (t as any)[key];\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n if (!maps) return;\r\n if (maps[fromId]) {\r\n maps[fromId] = (maps[fromId] ?? []).filter(\r\n (fid) => fid !== toId,\r\n );\r\n if (!maps[fromId]?.length) delete maps[fromId];\r\n }\r\n if (!Object.keys(maps).length) delete (p as any)[mapKey];\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) delete (t as any).service_id;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n delete (o as any).service_id;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown disconnect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import {\r\n filterServicesForVisibleGroup as filterServicesForVisibleGroupCore,\r\n type FilterServicesForVisibleGroupInput,\r\n} from \"@/core\";\r\nimport type { FallbackSettings, RatePolicy } from \"@/schema\";\nimport type { EditorModuleContext, ServiceCheck } from \"./editor-types\";\r\n\r\nexport function filterServicesForVisibleGroup(\r\n ctx: EditorModuleContext,\r\n candidates: Array<number | string>,\r\n input: {\r\n tagId: string;\r\n selectedButtons?: string[];\r\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\n policies?: unknown;\n ratePolicy?: RatePolicy;\n fallbackSettings?: FallbackSettings;\n /** Backward-compatible alias */\n fallback?: FallbackSettings;\n },\n): ServiceCheck[] {\n const coreInput: FilterServicesForVisibleGroupInput = {\r\n candidates,\r\n context: {\r\n tagId: input.tagId,\r\n selectedButtons: input.selectedButtons,\r\n usedServiceIds: input.usedServiceIds,\n effectiveConstraints: input.effectiveConstraints,\n policies: input.policies,\n ratePolicy: input.ratePolicy,\n fallbackSettings: input.fallbackSettings,\n fallback: input.fallback,\n },\n };\n const result = filterServicesForVisibleGroupCore(coreInput, {\r\n builder: ctx.builder,\r\n });\r\n ctx.setLastPolicyDiagnostics(result.diagnostics);\r\n return result.checks;\r\n}\r\n","import type { Tag } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\nimport { ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function placeNode(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n opts: {\r\n scopeTagId?: string;\r\n beforeId?: string;\r\n afterId?: string;\r\n index?: number;\r\n },\r\n) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"placeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const all = p.filters ?? [];\r\n const cur = all.find((t) => t.id === id);\r\n if (!cur) return;\r\n const groupKey = cur.bind_id ?? \"__root__\";\r\n const siblings = all.filter(\r\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\r\n );\r\n\r\n const curIdx = siblings.findIndex((t) => t.id === id);\r\n if (curIdx < 0) return;\r\n const pulled = siblings.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n siblings.findIndex((t) => t.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n siblings.length,\r\n siblings.findIndex((t) => t.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = siblings.length;\r\n }\r\n\r\n const out: Tag[] = [];\r\n for (const t of all) {\r\n const sameGroup = (t.bind_id ?? \"__root__\") === groupKey;\r\n if (!sameGroup) {\r\n out.push(t);\r\n }\r\n }\r\n siblings.splice(dest, 0, pulled);\r\n p.filters = [...out, ...siblings];\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n if (!opts.scopeTagId) {\r\n throw new Error(\"placeNode(field): scopeTagId is required\");\r\n }\r\n const fieldId = id;\r\n const tagId = opts.scopeTagId;\r\n\r\n ctx.exec({\r\n name: \"placeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const map = (p.order_for_tags ??= {});\r\n const arr = (map[tagId] ??= []);\r\n const curIdx = arr.indexOf(fieldId);\r\n if (curIdx >= 0) arr.splice(curIdx, 1);\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) dest = Math.max(0, arr.indexOf(opts.beforeId));\r\n if (opts.afterId) {\r\n dest = Math.min(arr.length, arr.indexOf(opts.afterId) + 1);\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) dest = arr.length;\r\n\r\n arr.splice(dest, 0, fieldId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n placeOption(ctx, id, opts);\r\n return;\r\n }\r\n\r\n throw new Error(\"placeNode: unknown id prefix\");\r\n}\r\n\r\nexport function placeOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n opts: { beforeId?: string; afterId?: string; index?: number },\r\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('placeOption: optionId must start with \"o:\"');\r\n }\r\n\r\n ctx.exec({\r\n name: \"placeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n\r\n const curIdx = f.options.findIndex((o) => o.id === optionId);\r\n if (curIdx < 0) return;\r\n\r\n const pulled = f.options.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n f.options.findIndex((o) => o.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n f.options.length,\r\n f.options.findIndex((o) => o.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = f.options.length;\r\n }\r\n\r\n f.options.splice(dest, 0, pulled);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","// src/react/canvas/editor/editor-catalog.ts\n\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n ServiceCatalogState,\n} from \"@/schema\";\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction normalizeServiceIds(\n ids: Array<CatalogServiceId> | undefined,\n): Array<CatalogServiceId> {\n if (!ids?.length) return [];\n const seen = new Set<string>();\n const out: Array<CatalogServiceId> = [];\n\n for (const id of ids) {\n const key = String(id);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(id);\n }\n\n return out;\n}\n\nfunction sortNodes(nodes: CatalogNode[]): CatalogNode[] {\n return [...nodes].sort((a, b) => {\n const ao = a.order ?? 0;\n const bo = b.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function createEmptyCatalog(): ServiceCatalogState {\n return {\n version: 1,\n nodes: [],\n activeNodeId: undefined,\n expandedIds: [],\n pinnedNodeIds: [],\n selectedServiceId: undefined,\n viewMode: \"all\",\n };\n}\n\nexport function ensureCatalog(\n catalog?: ServiceCatalogState,\n): ServiceCatalogState {\n return clone(catalog ?? createEmptyCatalog());\n}\n\nexport function getCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): CatalogNode | undefined {\n return (catalog?.nodes ?? []).find((x) => x.id === id);\n}\n\nexport function getCatalogChildren(\n catalog: ServiceCatalogState | undefined,\n parentId?: CatalogId,\n): CatalogNode[] {\n return sortNodes(\n (catalog?.nodes ?? []).filter((x) => x.parentId === parentId),\n );\n}\n\nexport function hasCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): boolean {\n return !!getCatalogNode(catalog, id);\n}\n\nexport function createCatalogId(\n catalog: ServiceCatalogState | undefined,\n prefix = \"cg\",\n): string {\n const taken = new Set((catalog?.nodes ?? []).map((x) => x.id));\n for (let i = 1; i < 10000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate catalog id\");\n}\n\nexport function addCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: Array<CatalogServiceId>;\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"cg\");\n\n next.nodes.push({\n id,\n kind: \"group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n serviceIds: normalizeServiceIds(input.serviceIds),\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function addSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"csg\");\n\n next.nodes.push({\n id,\n kind: \"smart-group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n rules: clone(input.rules ?? []),\n match: input.match ?? \"all\",\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function updateCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const idx = next.nodes.findIndex((x) => x.id === id);\n if (idx < 0) return next;\n\n const current = next.nodes[idx]!;\n next.nodes[idx] = {\n ...current,\n ...patch,\n } as CatalogNode;\n\n if (next.nodes[idx]?.kind === \"group\") {\n next.nodes[idx] = {\n ...next.nodes[idx],\n serviceIds: normalizeServiceIds(\n (next.nodes[idx] as Extract<CatalogNode, { kind: \"group\" }>)\n .serviceIds,\n ),\n } as CatalogNode;\n }\n\n return next;\n}\n\nexport function setActiveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id?: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.activeNodeId = id;\n return next;\n}\n\nexport function setCatalogViewMode(\n catalog: ServiceCatalogState | undefined,\n mode: ServiceCatalogState[\"viewMode\"],\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.viewMode = mode;\n return next;\n}\n\nexport function setSelectedCatalogService(\n catalog: ServiceCatalogState | undefined,\n serviceId?: CatalogServiceId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.selectedServiceId = serviceId;\n return next;\n}\n\nexport function toggleCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const expanded = new Set(next.expandedIds ?? []);\n\n if (expanded.has(id)) expanded.delete(id);\n else expanded.add(id);\n\n next.expandedIds = Array.from(expanded);\n return next;\n}\n\nexport function setCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n expanded: boolean,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const set = new Set(next.expandedIds ?? []);\n\n if (expanded) set.add(id);\n else set.delete(id);\n\n next.expandedIds = Array.from(set);\n return next;\n}\n\nexport function toggleCatalogPinned(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const pinned = new Set(next.pinnedNodeIds ?? []);\n\n if (pinned.has(id)) pinned.delete(id);\n else pinned.add(id);\n\n next.pinnedNodeIds = Array.from(pinned);\n return next;\n}\n\nexport function assignServicesToCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n serviceIds: Array<CatalogServiceId>,\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"group\",\n ) as Extract<CatalogNode, { kind: \"group\" }> | undefined;\n\n if (!node) return next;\n\n const incoming = normalizeServiceIds(serviceIds);\n const current = normalizeServiceIds(node.serviceIds);\n\n if (mode === \"replace\") {\n node.serviceIds = incoming;\n return next;\n }\n\n if (mode === \"append\") {\n node.serviceIds = normalizeServiceIds([...current, ...incoming]);\n return next;\n }\n\n node.serviceIds = current.filter(\n (id) => !incoming.some((x) => String(x) === String(id)),\n );\n return next;\n}\n\nexport function clearCatalog(): ServiceCatalogState {\n return createEmptyCatalog();\n}\n\nexport function removeCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n opts?: { cascade?: boolean },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n\n const ids = new Set<string>([id]);\n\n if (opts?.cascade) {\n const queue = [id];\n while (queue.length) {\n const current = queue.shift()!;\n for (const child of next.nodes.filter(\n (x) => x.parentId === current,\n )) {\n if (!ids.has(child.id)) {\n ids.add(child.id);\n queue.push(child.id);\n }\n }\n }\n }\n\n next.nodes = next.nodes.filter((x) => !ids.has(x.id));\n\n if (next.activeNodeId && ids.has(next.activeNodeId)) {\n next.activeNodeId = undefined;\n }\n\n next.expandedIds = (next.expandedIds ?? []).filter((x) => !ids.has(x));\n next.pinnedNodeIds = (next.pinnedNodeIds ?? []).filter((x) => !ids.has(x));\n\n return next;\n}\n\nexport function moveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find((x) => x.id === nodeId);\n if (!node) return next;\n\n node.parentId = opts.parentId;\n\n const siblings = next.nodes\n .filter((x) => x.parentId === opts.parentId && x.id !== nodeId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n let dest = typeof opts.index === \"number\" ? opts.index : siblings.length;\n\n if (opts.beforeId) {\n const idx = siblings.findIndex((x) => x.id === opts.beforeId);\n if (idx >= 0) dest = idx;\n }\n\n if (opts.afterId) {\n const idx = siblings.findIndex((x) => x.id === opts.afterId);\n if (idx >= 0) dest = idx + 1;\n }\n\n const ordered = [...siblings];\n ordered.splice(dest, 0, node);\n\n ordered.forEach((item, i) => {\n item.order = i;\n });\n\n return next;\n}\n\nexport function resolveSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n candidates: Array<CatalogServiceId>,\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n if (!node) return next;\n\n const rules = node.rules ?? [];\n const mode = node.match ?? \"all\";\n\n const resolved = candidates.filter((candidate) => {\n const results = rules.map((rule) => {\n if (rule.type === \"service-field\") {\n return matchers.serviceField?.(candidate, rule) ?? false;\n }\n if (rule.type === \"policy-family\") {\n return matchers.policyFamily?.(candidate, rule) ?? false;\n }\n return matchers.compatibility?.(candidate, rule) ?? false;\n });\n\n return mode === \"all\" ? results.every(Boolean) : results.some(Boolean);\n });\n\n node.resolvedServiceIds = normalizeServiceIds(resolved);\n node.resolvedAt = Date.now();\n\n return next;\n}\n","// src/react/canvas/selection.ts\r\nimport { createNodeIndex, type Builder } from \"@/core\";\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\r\nimport type { DgpServiceCapability } from \"@/schema/provider\";\r\n\r\nexport type Env = \"client\" | \"workspace\";\r\n\r\nexport type VisibleGroup = {\r\n tagId?: string;\r\n tag?: Tag;\r\n fields: Field[];\r\n fieldIds: string[];\r\n parentTags?: Tag[];\r\n childrenTags?: Tag[];\r\n /** In order of selection: tag base (unless overridden) then selected options */\r\n services?: DgpServiceCapability[];\r\n};\r\n\r\n// Returned by visibleGroup():\r\nexport type VisibleGroupResult =\r\n | { kind: \"single\"; group: VisibleGroup }\r\n | { kind: \"multi\"; groups: string[] };\r\n\r\ntype ChangeEvt = { ids: string[]; primary?: string };\r\ntype Listener = (e: ChangeEvt) => void;\r\n\r\nexport type SelectionOptions = {\r\n env?: Env;\r\n rootTagId?: string;\r\n /** Resolve service capability from an id (used for `services` array) */\r\n resolveService?: (id: any) => DgpServiceCapability | undefined;\r\n};\r\n\r\nexport class Selection {\r\n private set = new Set<string>();\r\n private primaryId: string | undefined;\r\n private currentTagId: string | undefined;\r\n private onChangeFns: Listener[] = [];\r\n\r\n constructor(\r\n private readonly builder: Builder,\r\n private readonly opts: SelectionOptions,\r\n ) {}\r\n\r\n // ── Public mutators ──────────────────────────────────────────────────────\r\n replace(id?: string | null) {\r\n if (!id) return this.clear();\r\n this.set.clear();\r\n this.set.add(id);\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n add(id: string) {\r\n // maintain \"most-recent\" selection order:\r\n // Set keeps insertion order, but re-adding an existing id does NOT move it.\r\n // So we delete+add to bump it to the end every time this is called.\r\n if (this.set.has(id)) this.set.delete(id);\r\n this.set.add(id);\r\n\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n remove(id: string) {\r\n if (!this.set.delete(id)) return;\r\n if (this.primaryId === id) {\r\n this.primaryId = this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n }\r\n this.emit();\r\n }\r\n\r\n toggle(id: string) {\r\n if (this.set.has(id)) this.remove(id);\r\n else this.add(id);\r\n }\r\n\r\n many(ids: Iterable<string>, primary?: string) {\r\n this.set = new Set(ids);\r\n this.primaryId = primary ?? this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n this.emit();\r\n }\r\n\r\n clear() {\r\n if (!this.set.size && !this.primaryId) return;\r\n this.set.clear();\r\n this.primaryId = undefined;\r\n this.emit();\r\n }\r\n\r\n // ── Read APIs ────────────────────────────────────────────────────────────\r\n all(): ReadonlySet<string> {\r\n return this.set;\r\n }\r\n\r\n has(id: string): boolean {\r\n return this.set.has(id);\r\n }\r\n\r\n primary(): string | undefined {\r\n return this.primaryId;\r\n }\r\n\r\n currentTag(): string | undefined {\r\n return this.currentTagId;\r\n }\r\n\r\n onChange(fn: Listener): () => void {\r\n this.onChangeFns.push(fn);\r\n return () => {\r\n const i = this.onChangeFns.indexOf(fn);\r\n if (i >= 0) this.onChangeFns.splice(i, 1);\r\n };\r\n }\r\n\r\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\r\n visibleGroup(): VisibleGroupResult {\r\n const props = this.builder.getProps() as ServiceProps;\r\n\r\n // WORKSPACE: >1 tag selected → return raw selection set\r\n if ((this.opts.env ?? \"client\") === \"workspace\") {\r\n const tagIds = Array.from(this.set).filter(\r\n this.builder.isTagId.bind(this.builder),\r\n );\r\n if (tagIds.length > 1) {\r\n return { kind: \"multi\", groups: Array.from(this.set) };\r\n }\r\n }\r\n\r\n const tagId = this.resolveTagContextId(props);\r\n if (!tagId)\r\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\r\n\r\n const group = this.computeGroupForTag(props, tagId);\r\n return { kind: \"single\", group };\r\n }\r\n\r\n /**\r\n * Build a fieldId -> triggerKeys[] map from the current selection set.\r\n *\r\n * What counts as a \"button selection\" (trigger key):\r\n * - field key where the field has button === true (e.g. \"f:dripfeed\")\r\n * - option key (e.g. \"o:fast\")\r\n * - composite key \"fieldId::optionId\" (e.g. \"f:speed::o:fast\")\r\n *\r\n * Grouping:\r\n * - button-field trigger groups under its own fieldId\r\n * - option/composite groups under the option's owning fieldId (from nodeMap)\r\n *\r\n * Deterministic:\r\n * - preserves selection insertion order\r\n * - de-dupes per field\r\n */\r\n buttonSelectionsByFieldId(): Record<string, string[]> {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: Record<string, string[]> = {};\r\n\r\n const push = (fieldId: string, triggerKey: string) => {\r\n const arr = (out[fieldId] ??= []);\r\n if (!arr.includes(triggerKey)) arr.push(triggerKey);\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: \"fieldId::optionId\" => validate optionId; group by option.owner fieldId\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (\r\n optRef?.kind === \"option\" &&\r\n typeof optRef.fieldId === \"string\"\r\n ) {\r\n push(optRef.fieldId, key); // keep composite as the trigger key\r\n }\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger => group by owning fieldId\r\n if (ref.kind === \"option\" && typeof ref.fieldId === \"string\") {\r\n push(ref.fieldId, ref.id ?? key);\r\n continue;\r\n }\r\n\r\n // field trigger => only if it's a button field; group by itself\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n const fieldId = ref.id ?? field?.id ?? key;\r\n if (field?.button === true && typeof fieldId === \"string\") {\r\n push(fieldId, fieldId);\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n /**\r\n * Returns only selection keys that are valid \"trigger buttons\":\r\n * - field keys where field.button === true\r\n * - option keys\r\n * - composite keys \"fieldId::optionId\" (validated by optionId)\r\n * Excludes tags and non-button fields.\r\n */\r\n selectedButtons(): string[] {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n const push = (k: string) => {\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(k);\r\n }\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: validate optionId part\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (optRef?.kind === \"option\") push(key);\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger\r\n if (ref.kind === \"option\") {\r\n push(key);\r\n continue;\r\n }\r\n\r\n // field trigger only if it's a button field\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n if (field?.button === true) push(key);\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n // ── Internals ────────────────────────────────────────────────────────────\r\n private emit() {\r\n const payload: ChangeEvt = {\r\n ids: Array.from(this.set),\r\n primary: this.primaryId,\r\n };\r\n for (const fn of this.onChangeFns) fn(payload);\r\n }\r\n\r\n private updateCurrentTagFrom(id: string) {\n const props = this.builder.getProps() as ServiceProps;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n if (tags.some((t) => t.id === id)) {\n this.currentTagId = id;\n return;\n }\n\n const firstBindId = (field?: Field): string | undefined => {\n if (!field?.bind_id) return undefined;\n return Array.isArray(field.bind_id)\n ? field.bind_id[0]\n : field.bind_id;\n };\n\n const resolveField = (): Field | undefined => {\n const direct = fields.find((x) => x.id === id);\n if (direct) return direct;\n\n if (this.builder.isOptionId(id)) {\n return fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n }\n\n if (id.includes(\"::\")) {\n const [fieldId] = id.split(\"::\");\n if (!fieldId) return undefined;\n return fields.find((x) => x.id === fieldId);\n }\n\n return undefined;\n };\n\n const field = resolveField();\n if (!field) return;\n\n const currentTagId = this.currentTag();\n if (currentTagId) {\n const currentTagNode = createNodeIndex(this.builder).getTag(\n currentTagId,\n );\n if (currentTagNode?.getDescendant(field.id)) {\n this.currentTagId = currentTagId;\n return;\n }\n }\n\n const fallbackTagId = firstBindId(field);\n if (fallbackTagId) this.currentTagId = fallbackTagId;\n }\n\r\n private resolveTagContextId(props: ServiceProps): string | undefined {\r\n if (this.currentTagId) return this.currentTagId;\r\n\r\n for (const id of this.set) if (this.builder.isTagId(id)) return id;\r\n\r\n const fields = props.fields ?? [];\r\n for (const id of this.set) {\r\n const f = fields.find((x) => x.id === id);\r\n if (f?.bind_id)\r\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\r\n }\r\n\r\n for (const id of this.set) {\r\n if (this.builder.isOptionId(id)) {\r\n const host = fields.find((x) =>\r\n (x.options ?? []).some((o) => o.id === id),\r\n );\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n if (id.includes(\"::\")) {\r\n const [fid] = id.split(\"::\");\r\n const host = fields.find((x) => x.id === fid);\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n }\r\n\r\n return this.opts.rootTagId;\r\n }\r\n\r\n private computeGroupForTag(\r\n props: ServiceProps,\r\n tagId: string,\r\n ): VisibleGroup {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n\r\n // ---- delegate visible fields to builder\r\n const selectedTriggerIds = this.selectedButtons();\r\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n const visible = fieldIds\r\n .map((id) => fieldById.get(id))\r\n .filter(Boolean) as Field[];\r\n\r\n // ---- ancestry & immediate children (unchanged)\r\n const parentTags: Tag[] = [];\r\n let cur = tag?.bind_id;\r\n const guard = new Set<string>();\r\n while (cur && !guard.has(cur)) {\r\n const t = tagById.get(cur);\r\n if (!t) break;\r\n parentTags.push(t);\r\n guard.add(cur);\r\n cur = t.bind_id;\r\n }\r\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\r\n\r\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\r\n const services: DgpServiceCapability[] = [];\r\n const resolve = this.opts.resolveService;\r\n\r\n // 1) tag base\r\n let baseAddedFromTag = false;\r\n if (tag?.service_id != null) {\r\n services.push(\r\n resolve?.(tag.service_id) ??\r\n ({ id: tag.service_id } as DgpServiceCapability),\r\n );\r\n baseAddedFromTag = true;\r\n }\r\n\r\n // 2) walk selected ids in insertion order\r\n let baseOverridden = false;\r\n for (const selId of this.set) {\r\n // OPTION selected\r\n const opt = this.findOptionById(fields, selId);\r\n if (opt?.service_id != null) {\r\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(opt.service_id) ??\r\n ({ id: opt.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n continue;\r\n }\r\n\r\n // BUTTON FIELD selected\r\n const f = fieldById.get(selId);\r\n if (f?.button === true && f.service_id != null) {\r\n const role = (f.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(f.service_id) ??\r\n ({ id: f.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n }\r\n }\r\n\r\n return {\r\n tagId,\r\n tag,\r\n fields: visible,\r\n fieldIds,\r\n parentTags,\r\n childrenTags,\r\n services,\r\n };\r\n }\r\n\r\n private addServiceByRole(\r\n services: DgpServiceCapability[],\r\n cap: DgpServiceCapability,\r\n role: PricingRole,\r\n baseAddedFromTag: boolean,\r\n baseOverridden: boolean,\r\n ): boolean {\r\n if (role === \"base\") {\r\n if (!baseOverridden) {\r\n if (baseAddedFromTag && services.length > 0) {\r\n services[0] = cap;\r\n } else {\r\n services.unshift(cap);\r\n }\r\n return true;\r\n } else {\r\n services.push(cap);\r\n }\r\n } else {\r\n services.push(cap);\r\n }\r\n return baseOverridden;\r\n }\r\n\r\n private findOptionById(fields: Field[], selId: string) {\r\n if (this.builder.isOptionId(selId)) {\r\n for (const f of fields) {\r\n const o = f.options?.find((x) => x.id === selId);\r\n if (o) return o;\r\n }\r\n }\r\n if (selId.includes(\"::\")) {\r\n const [fid, oid] = selId.split(\"::\");\r\n const f = fields.find((x) => x.id === fid);\r\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\r\n if (o) return o;\r\n }\r\n return undefined;\r\n }\r\n}\r\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>, primary?: string): void {\n this.selection.many(ids, primary);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","// src/react/inputs/form-context.tsx\nimport type { ReactNode } from \"react\";\nimport * as React from \"react\";\n\nimport type { CoreContext } from \"@timeax/form-palette\";\nimport { Form, useCore } from \"@timeax/form-palette\";\n\ntype Dict = Record<string, unknown>;\n\nexport type FormSnapshot = Dict;\n\nexport type FormApi = {\n /** Value by fieldId (Wrapper uses name=field.id) */\n get: (fieldId: string) => unknown;\n /**\n * Programmatic set (NOT used by Wrapper).\n * If the field is mounted, writes into the core.\n * If not mounted, persists into core.bucket (via core.setValue) or local bag fallback.\n */\n set: (fieldId: string, value: unknown) => void;\n\n /** Option selections (legacy; kept for compatibility) */\n getSelections: (fieldId: string) => string[];\n setSelections: (fieldId: string, optionIds: string[]) => void;\n toggleSelection: (fieldId: string, optionId: string) => void;\n removeSelectionToken(token: string): void;\n\n /** Read-only snapshot for debugging (NO validation) */\n snapshot: () => FormSnapshot;\n\n /** Simple subscribe (re-render triggers) */\n subscribe: (fn: () => void) => () => void;\n\n /**\n * Validation gate:\n * local submit runs validation and returns mounted/visible values.\n * (This is NOT “submitting to a server”.)\n */\n submit: () => { values: Dict; valid: boolean };\n\n setFieldError(id: any, message: string): void;\n setErrors(errors: Record<string, string>): void;\n};\n\nconst Ctx = React.createContext<FormApi | null>(null);\n\nexport function useFormApi(): FormApi {\n const v = React.useContext(Ctx);\n if (!v) throw new Error(\"useFormApi must be used within <FormProvider />\");\n return v;\n}\n\nexport function useOptionalFormApi(): FormApi | null {\n return React.useContext(Ctx);\n}\n\nexport type FormProviderProps = {\n children: ReactNode;\n\n /** Optional schema (zod/jsonschema/etc, depending on your palette build) */\n schema?: any;\n\n /**\n * Same shape as the old OrderFlowProvider usage.\n * - values: seed values (persisted/rehydrated)\n * - selections: legacy (kept for compatibility)\n */\n initial?: {\n values?: Dict;\n selections?: Record<string, string[]>;\n };\n};\n\nexport function FormProvider({ children, schema, initial }: FormProviderProps) {\n // Indefinite memory (we keep values even when fields unmount)\n const [bag, setBag] = React.useState<Dict>(() => ({\n ...(initial?.values ?? {}),\n }));\n\n // Legacy selections (compat only)\n const [selectionsBag, setSelectionsBag] = React.useState<\n Record<string, string[]>\n >(() => ({ ...(initial?.selections ?? {}) }));\n\n // subscribe() support\n const listenersRef = React.useRef(new Set<() => void>());\n const publish = React.useCallback(() => {\n for (const fn of listenersRef.current) fn();\n }, []);\n\n // palette core ref (for submit/values/setValue)\n const coreRef = React.useRef<CoreContext<Dict> | null>(null);\n\n function Bridge() {\n const core = useCore<Dict>();\n\n React.useEffect(() => {\n coreRef.current = core;\n publish();\n return () => {\n coreRef.current = null;\n publish();\n };\n }, [core, publish]);\n\n return null;\n }\n\n const api = React.useMemo<FormApi>(() => {\n return {\n subscribe(fn) {\n listenersRef.current.add(fn);\n return () => listenersRef.current.delete(fn);\n },\n\n get(fieldId) {\n const core = coreRef.current;\n const live =\n (core?.values?.() as Dict | undefined) ?? undefined;\n\n // Prefer live (mounted + bucket), fallback to our indefinite bag\n if (live && fieldId in live) return live[fieldId];\n return bag[fieldId];\n },\n\n set(fieldId, value) {\n const core = coreRef.current;\n\n // Programmatic sets should go through core when possible\n // (core.setValue also persists to bucket when field isn't mounted).\n if (core) {\n core.setValue(fieldId, value);\n return;\n }\n\n // Fallback if core isn't mounted yet\n setBag((prev) => ({ ...prev, [fieldId]: value }));\n publish();\n },\n\n // Legacy selections API (compat; no longer used by the new Wrapper)\n getSelections(fieldId) {\n return selectionsBag[fieldId] ?? [];\n },\n setSelections(fieldId, optionIds) {\n setSelectionsBag((prev) => ({\n ...prev,\n [fieldId]: optionIds ?? [],\n }));\n publish();\n },\n toggleSelection(fieldId, optionId) {\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n if (current.has(optionId)) current.delete(optionId);\n else current.add(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n removeSelectionToken(token) {\n // token is \"fieldId:optionId\" in the old system; keep best-effort compat\n const [fieldId, optionId] = String(token).split(\":\", 2);\n if (!fieldId || !optionId) return;\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n current.delete(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n\n snapshot() {\n // IMPORTANT: read-only, NO validation here.\n const core = coreRef.current;\n const live = (core?.values?.() as Dict | undefined) ?? {};\n\n return live;\n },\n\n submit() {\n const core = coreRef.current;\n if (!core) return { values: {}, valid: false };\n\n // palette submit validates & returns mounted/visible values\n return core.submit() as { values: Dict; valid: boolean };\n },\n\n setFieldError(id: any, message: string) {\n const core = coreRef.current;\n if (!core) return;\n core.error(id, message);\n },\n\n setErrors(values: Record<string, string>) {\n const core = coreRef.current;\n if (!core) return;\n\n core.error(values);\n },\n };\n }, [bag, selectionsBag, publish]);\n\n return (\n <Ctx.Provider value={api}>\n <Form\n adapter=\"local\"\n schema={schema}\n valueBag={bag}\n formRef={coreRef}\n onChange={() => publish()}\n >\n <Bridge />\n {children}\n </Form>\n </Ctx.Provider>\n );\n}\n","import type React from \"react\";\r\nimport { Field, ServiceProps, Ui } from \"@/schema\";\r\n\r\n/** Matches your InputWrapper’s expectations */\r\nexport type InputKind = string; // e.g. \"text\", \"number\", \"select\", \"custom:Rating\"\r\nexport type InputVariant = \"default\" | (string & {});\r\n/* -------------------------------------------------------------------------- */\r\n/* Adapter rules (updated meaning) */\r\n/* - getValue: normalize what host emitted into stored value (for form-palette)*/\r\n/* - getSelectedOptions: REQUIRED if field.options exists (no guessing) */\r\n/* - isActive: optional for option-less action buttons */\r\n/* -------------------------------------------------------------------------- */\r\n\r\nexport type AdapterCtx = { field: Field; props: ServiceProps };\r\n\r\nexport type Adapter = {\r\n valueProp?: string;\r\n changeProp?: string;\r\n errorProp?: string;\r\n\r\n /** normalize what the host emitted into what we store in form-palette */\r\n getValue?: (next: unknown, current: unknown, ctx: AdapterCtx) => unknown;\r\n\r\n /** REQUIRED if field.options exists */\r\n getSelectedOptions?: (\r\n next: unknown,\r\n current: unknown,\r\n ctx: AdapterCtx,\r\n ) => string[];\r\n\r\n /** For option-less action buttons (button: true with no options) */\r\n isActive?: (stored: unknown, ctx: AdapterCtx) => boolean;\r\n getInputPropsFromField?: (props: AdapterCtx) => any;\r\n toValue?: (value: any) => any;\r\n};\r\n\r\nexport type InputDescriptor = {\r\n Component: React.ComponentType<Record<string, unknown>>;\r\n adapter?: Adapter;\r\n defaultProps?: Record<string, unknown>;\r\n ui?: Record<string, Ui>;\r\n};\r\n\r\ntype VariantMap = Map<InputVariant, InputDescriptor>;\r\ntype RegistryStore = Map<InputKind, VariantMap>;\r\n\r\nexport type Registry = {\r\n get(kind: InputKind, variant?: InputVariant): InputDescriptor | undefined;\r\n register(\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void;\r\n unregister(kind: InputKind, variant?: InputVariant): void;\r\n registerMany(\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void;\r\n /** low-level escape hatch */\r\n _store: RegistryStore;\r\n};\r\n\r\nexport function createInputRegistry(): Registry {\r\n const store: RegistryStore = new Map();\r\n\r\n const get = (\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n ): InputDescriptor | undefined => {\r\n const vm = store.get(kind);\r\n if (!vm) return undefined;\r\n const v = (variant ?? \"default\") as InputVariant;\r\n return vm.get(v) ?? vm.get(\"default\");\r\n };\r\n\r\n const register = (\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void => {\r\n let vm = store.get(kind);\r\n if (!vm) {\r\n vm = new Map<InputVariant, InputDescriptor>();\r\n store.set(kind, vm);\r\n }\r\n vm.set((variant ?? \"default\") as InputVariant, descriptor);\r\n };\r\n\r\n const unregister = (kind: InputKind, variant?: InputVariant): void => {\r\n const vm = store.get(kind);\r\n if (!vm) return;\r\n const key = (variant ?? \"default\") as InputVariant;\r\n vm.delete(key);\r\n if (vm.size === 0) store.delete(kind);\r\n };\r\n\r\n const registerMany = (\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void => {\r\n for (const e of entries) register(e.kind, e.descriptor, e.variant);\r\n };\r\n\r\n return { get, register, unregister, registerMany, _store: store };\r\n}\r\n\r\n/** Helper used by InputWrapper */\r\nexport function resolveInputDescriptor(\r\n registry: Registry,\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n): InputDescriptor | undefined {\r\n return registry.get(kind, variant);\r\n}\r\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createInputRegistry } from \"@/react\";\nimport type {\n Registry,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\n\ntype InputsCtxValue = {\n registry: Registry;\n register: (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ) => void;\n unregister: (kind: InputKind, variant?: InputVariant) => void;\n registerMany: (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ) => void;\n};\n\nconst Ctx = createContext<InputsCtxValue | null>(null);\n\nexport function Provider({\n children,\n initialRegistry,\n}: {\n children: ReactNode;\n /** Optional pre-built registry (e.g., you registered built-ins/customs before mounting) */\n initialRegistry?: Registry;\n}) {\n const registry = useMemo(\n () => initialRegistry ?? createInputRegistry(),\n [initialRegistry],\n );\n\n const value = useMemo<InputsCtxValue>(\n () => ({\n registry,\n register: registry.register,\n unregister: registry.unregister,\n registerMany: registry.registerMany,\n }),\n [registry],\n );\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useInputs(): InputsCtxValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useInputs() must be used within <InputsProvider>\");\n return v;\n}\n","// src/react/inputs/wrapper.tsx\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { useField } from \"@timeax/form-palette\";\n\nimport type { Field, FieldOption } from \"@/schema\";\nimport type { Scalar } from \"@/schema/order\";\n\nimport type {\n Adapter,\n AdapterCtx,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\nimport { resolveInputDescriptor, useInputs } from \"@/react\";\n\nimport { useOrderFlow } from \"@/react/hooks/use-order-flow\";\n\nfunction toKind(field: Field): InputKind {\n return field.type as InputKind;\n}\n\nfunction toVariant(field: Field): InputVariant | undefined {\n const v = (field as any).meta?.variant;\n return typeof v === \"string\" && v.trim() ? (v as InputVariant) : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Safe templating (no eval) */\n/* -------------------------------------------------------------------------- */\n\nfunction getPath(ctx: Record<string, unknown>, path: string): unknown {\n const parts = path\n .split(\".\")\n .map((p) => p.trim())\n .filter(Boolean);\n\n let cur: any = ctx;\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n return cur;\n}\n\nfunction parseLiteral(raw: string, ctx: Record<string, unknown>): unknown {\n const s = raw.trim();\n if (!s) return \"\";\n\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n\n const n = Number(s);\n if (!Number.isNaN(n) && s !== \"\") return n;\n\n return getPath(ctx, s);\n}\n\nfunction evalMiniExpr(exprRaw: string, ctx: Record<string, unknown>): string {\n const expr = exprRaw.trim();\n\n const idxNullish = expr.indexOf(\"??\");\n const idxOr = expr.indexOf(\"||\");\n\n const splitAt =\n idxNullish >= 0\n ? { idx: idxNullish, op: \"??\" as const }\n : idxOr >= 0\n ? { idx: idxOr, op: \"||\" as const }\n : null;\n\n const left = splitAt ? expr.slice(0, splitAt.idx).trim() : expr;\n const right = splitAt ? expr.slice(splitAt.idx + 2).trim() : \"\";\n\n const leftVal = getPath(ctx, left);\n\n const isTruthy = (v: unknown) => !!v;\n const isNullish = (v: unknown) => v === null || v === undefined;\n\n const chooseFallback =\n splitAt?.op === \"??\"\n ? isNullish(leftVal)\n : splitAt?.op === \"||\"\n ? !isTruthy(leftVal)\n : false;\n\n const chosen = chooseFallback ? parseLiteral(right, ctx) : leftVal;\n\n if (chosen === null || chosen === undefined) return \"\";\n if (\n typeof chosen === \"string\" ||\n typeof chosen === \"number\" ||\n typeof chosen === \"boolean\"\n ) {\n return String(chosen);\n }\n\n try {\n return JSON.stringify(chosen);\n } catch {\n return String(chosen);\n }\n}\n\nfunction templateString(str: string, ctx: Record<string, unknown>): string {\n return str.replace(/\\{([^}]+)}/g, (_m, expr) =>\n evalMiniExpr(String(expr), ctx),\n );\n}\n\nfunction templateDeep<T>(value: T, ctx: Record<string, unknown>): T {\n if (typeof value === \"string\") return templateString(value, ctx) as any;\n if (Array.isArray(value))\n return value.map((v) => templateDeep(v, ctx)) as any;\n\n if (value && typeof value === \"object\") {\n const out: any = {};\n for (const [k, v] of Object.entries(value as any)) {\n out[k] = templateDeep(v, ctx);\n }\n return out;\n }\n\n return value;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Wrapper */\n/* -------------------------------------------------------------------------- */\n\nexport type InputWrapperProps = {\n field: Field;\n disabled?: boolean;\n\n extraProps?: Record<string, unknown>;\n templateStrings?: boolean;\n ctxOverrides?: Record<string, unknown>;\n className?: string;\n};\n\nexport function Wrapper({\n field,\n disabled,\n extraProps,\n templateStrings = true,\n ctxOverrides,\n className = \"\",\n}: InputWrapperProps) {\n const { registry } = useInputs();\n const flow = useOrderFlow();\n\n const kind = toKind(field);\n const variant = toVariant(field);\n\n const descriptor: InputDescriptor | undefined = React.useMemo(\n () => resolveInputDescriptor(registry, kind, variant),\n [kind, registry, variant],\n );\n\n if (!descriptor) {\n // eslint-disable-next-line no-console\n console.warn(\"[Wrapper] No descriptor for\", { kind, variant, field });\n return null;\n }\n\n const Component = descriptor.Component as any;\n const adapter = (descriptor.adapter ?? {}) as Adapter;\n const baseProps = (descriptor.defaultProps ?? {}) as Record<\n string,\n unknown\n >;\n\n const defaultProps = useMemo(() => {\n return { ...baseProps, ...(field.defaults ?? {}) };\n }, [baseProps, field.defaults]);\n\n const valueProp = adapter.valueProp ?? \"value\";\n const changeProp = adapter.changeProp ?? \"onChange\";\n const errorProp = adapter.errorProp ?? \"errorText\";\n\n const isOptionBased =\n Array.isArray(field.options) && field.options.length > 0;\n\n // action button = option-less button\n const isActionButton = field.button === true && !isOptionBased;\n\n // Register into form-palette:\n // ✅ name is ALWAYS field.id (only name)\n const fp = useField({\n name: field.id,\n required: !!field.required,\n variant: field.type as any,\n defaultValue: field.defaults?.value,\n disabled: !!disabled,\n });\n\n // Option ids allow-list (defensive)\n const optionIds = React.useMemo(() => {\n if (!isOptionBased) return new Set<string>();\n return new Set((field.options ?? []).map((o: FieldOption) => o.id));\n }, [isOptionBased, field.options]);\n\n // Selection syncing bookkeeping\n const prevSelectedRef = React.useRef<string[]>([]);\n React.useEffect(() => {\n prevSelectedRef.current = [];\n }, [field.id]);\n\n const adapterCtx = React.useMemo<AdapterCtx>(\n () => ({ field, props: flow.raw }),\n [field, flow.raw],\n );\n\n const onHostChange = React.useCallback(\n (next: unknown) => {\n const currentStored = (next as any)?.value;\n\n // 1) normalize into stored value\n const stored =\n adapter.getValue?.(next, currentStored, adapterCtx) ??\n currentStored ??\n next;\n\n // 2) write ONLY via form-palette's onChange\n fp.setValue(stored);\n\n // 3) sync visibility triggers to Selection (via order flow)\n if (isOptionBased) {\n if (!adapter.getSelectedOptions) {\n throw new Error(\n `[Wrapper] Adapter for \"${field.id}\" (${field.type}) must implement getSelectedOptions() because this field has options.`,\n );\n }\n\n const rawIds = adapter.getSelectedOptions(\n next,\n stored,\n adapterCtx,\n );\n\n const nextIds = Array.from(\n new Set(\n (rawIds ?? [])\n .map(String)\n .filter((id) => optionIds.has(id)),\n ),\n );\n\n const prev = prevSelectedRef.current;\n prevSelectedRef.current = nextIds;\n\n const prevSet = new Set(prev);\n const nextSet = new Set(nextIds);\n\n // toggle ON\n for (const id of nextIds) {\n if (!prevSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n // toggle OFF\n for (const id of prev) {\n if (!nextSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n return;\n }\n\n if (isActionButton) {\n const isActive =\n adapter.isActive?.(stored, adapterCtx) ?? Boolean(stored);\n if (isActive) flow.toggleOption(field.id);\n else flow.clearField(field.id);\n }\n },\n [\n adapter,\n adapterCtx,\n field.id,\n field.type,\n flow,\n fp,\n isActionButton,\n isOptionBased,\n optionIds,\n ],\n );\n\n // Template context (keep your current behavior)\n const templateCtx = React.useMemo<Record<string, unknown>>(() => {\n const ctxFromInit = (flow as any).init?.ctx ?? {};\n const ctx =\n ctxOverrides && typeof ctxOverrides === \"object\"\n ? { ...(ctxFromInit as any), ...(ctxOverrides as any) }\n : (ctxFromInit as Record<string, unknown>);\n\n return {\n ...ctx,\n field,\n flow,\n value: fp.value,\n error: fp.error,\n };\n }, [ctxOverrides, field, flow, fp.error, fp.value]);\n\n const templatedDefaultProps = React.useMemo(() => {\n if (!templateStrings) return defaultProps;\n return templateDeep(defaultProps as any, templateCtx);\n }, [defaultProps, templateCtx, templateStrings]);\n\n const templatedExtraProps = React.useMemo(() => {\n if (!templateStrings)\n return (extraProps ?? {}) as Record<string, unknown>;\n return templateDeep((extraProps ?? {}) as any, templateCtx);\n }, [extraProps, templateCtx, templateStrings]);\n\n const fieldProps =\n adapter?.getInputPropsFromField?.({ field, props: flow.raw }) ?? {};\n // Build host props\n const hostProps: Record<string, unknown> = {\n id: field.id,\n field,\n disabled: !!disabled || !!fp.disabled,\n required: field.required,\n\n // DO NOT pass `name` to InputField/entries\n fieldKey: field.id,\n\n ...(fieldProps ?? {}),\n // error channel\n error: fp.error,\n\n ...(templatedDefaultProps ?? {}),\n ...(templatedExtraProps ?? {}),\n };\n\n // value + change wiring\n hostProps[valueProp] = (fp.value ?? null) as Scalar | Scalar[] | null;\n hostProps[changeProp] = onHostChange;\n hostProps[errorProp] = fp.error;\n\n return (\n <div ref={fp.ref as any} className={className}>\n <Component {...hostProps} />\n </div>\n );\n}\n","// src/react/hooks/use-order-flow.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { ServiceProps, ServicePropsNotice } from \"@/schema\";\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nimport { buildOrderSnapshot } from \"@/utils/build-order-snapshot\";\nimport {\n type OrderFlowInitializeParams,\n useOrderFlowContext,\n} from \"./order-flow-provider\";\n\nimport type {\n VisibleGroup,\n VisibleGroupResult,\n} from \"@/react/canvas/selection\";\nimport { validateVisibleFields } from \"@/react/hooks/evalute-field-validation\";\n\nconst ROOT_TAG_ID = \"t:root\";\n\ntype NormalizeRateFn = (service: unknown) => number;\n\nexport type PricingPreview = {\n serviceId?: string | number;\n unitRate: number;\n base: number;\n utilities: number;\n total: number;\n utilityBreakdown: Array<{\n nodeId: string;\n mode: string;\n amount: number;\n }>;\n};\n\nexport type UseOrderFlowReturn = {\n ready: boolean;\n initialize: (params: OrderFlowInitializeParams) => void;\n\n activeTagId?: string;\n\n /** raw service props */\n raw: ServiceProps;\n\n /** visibility is Selection-only */\n visibleGroup: VisibleGroup | null;\n\n /**\n * Values are from form-palette (values()) and are already \"visible-only\"\n * because your UI mounts only visible fields.\n */\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\n\n /**\n * Selections are Selection-only now.\n * We keep this for compatibility with buildOrderSnapshot signature,\n * but we do NOT read it from form anymore.\n */\n optionSelectionsByFieldId: Record<string, string[]>;\n\n quantityPreview: number;\n services: Array<string | number>;\n serviceMap: Record<string, Array<string | number>>;\n\n pricingPreview: PricingPreview;\n\n min: number;\n max: number;\n\n selectTag: (tagId: string) => void;\n toggleOption: (fieldId: string, optionId?: string) => void;\n\n /** programmatic value set (rare; wrapper/field hook should handle most) */\n setValue: (fieldId: string, value: Scalar | Scalar[]) => void;\n clearField: (fieldId: string) => void;\n\n reset: (opts?: { keepTag?: boolean }) => void;\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n\n /** VALIDATES via form.submit() */\n buildSnapshot: () => OrderSnapshot | undefined;\n\n notices: ServicePropsNotice[];\n\n fallbackPolicy: FallbackSettings;\n setFallbackPolicy: (next: FallbackSettings) => void;\n};\n\nexport function useOrderFlow(): UseOrderFlowReturn {\n const ctx = useOrderFlowContext();\n const ready = ctx.ready();\n\n const initialize = useCallback(\n (params: OrderFlowInitializeParams) => {\n ctx.initialize(params);\n },\n [ctx],\n );\n\n // keep propsRef updated (best-effort; only when ready)\n const propsRef = useRef<ServiceProps | null>(null);\n useEffect(() => {\n if (!ready) return;\n propsRef.current = ctx.ensureReady(\"propsRef\").builder.getProps();\n }, [ctx, ready]);\n\n /**\n * Selection tick: Selection is external, so we force re-render.\n */\n const [selTick, setSelTick] = useState(0);\n useEffect(() => {\n if (!ready) return;\n const sel = ctx.selection;\n if (!sel?.onChange) return;\n return sel.onChange(() => setSelTick((x) => x + 1));\n }, [ready, ctx.selection]);\n\n /**\n * Form tick: form-palette bridge is pub/sub, so we subscribe.\n * On each tick we recompute form.values() or form.submit() where needed.\n */\n const [formTick, setFormTick] = useState(0);\n useEffect(() => {\n return ctx.formApi.subscribe(() => setFormTick((x) => x + 1));\n }, [ctx.formApi]);\n\n /**\n * Visibility is Selection-only. No form-based augmentation.\n */\n const visibleGroup: VisibleGroup | null = useMemo(() => {\n if (!ready) return null;\n\n const sel = ctx.selection;\n if (!sel) return null;\n\n const vg: VisibleGroupResult = sel.visibleGroup();\n if (vg.kind !== \"single\") return null;\n\n return vg.group ?? null;\n }, [ready, ctx.selection, selTick]);\n\n const activeTagId = useMemo(() => {\n if (!ready) return undefined;\n return ctx.selection?.currentTag?.() ?? ctx.activeTagId;\n }, [ready, ctx.selection, ctx.activeTagId, selTick]);\n\n /**\n * Preview values:\n * - NO validation\n * - driven by form.values() (core.values())\n * - already visible-only because only visible fields are mounted.\n */\n const formValuesByFieldId: Record<string, Scalar | Scalar[]> =\n useMemo(() => {\n const values = (ctx.formApi.snapshot?.() ?? {}) as Record<\n string,\n Scalar | Scalar[]\n >;\n\n return values;\n }, [ctx.formApi, formTick]);\n\n /**\n * Selections are Selection-only now.\n * Keep empty map for snapshot builder signature.\n */\n const optionSelectionsByFieldId = useMemo(\n () => ({}) as Record<string, string[]>,\n [],\n );\n\n /**\n * Preview snapshot uses form.values() (no validation) + Selection context.\n */\n const previewSnapshot: OrderSnapshot = useMemo(() => {\n if (!ready) {\n return {\n version: \"1\",\n mode: \"prod\",\n builtAt: new Date().toISOString(),\n selection: { tag: \"unknown\", fields: [], buttons: [] },\n inputs: { form: {}, selections: {} },\n quantity: 1,\n quantitySource: { kind: \"default\", defaultedFromHost: true },\n services: [],\n min: 1,\n max: 1,\n serviceMap: {},\n meta: {\n schema_version: propsRef.current?.schema_version,\n context: {\n tag: \"unknown\",\n constraints: {},\n nodeContexts: {},\n policy: {\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n requireConstraintFit: true,\n },\n },\n },\n };\n }\n\n const { builder, init, selection } = ctx.ensureReady(\"previewSnapshot\");\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n /// console.log(formValuesByFieldId)\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: activeTagId ?? ROOT_TAG_ID,\n formValuesByFieldId,\n selectedKeys: selection.selectedButtons(),\n optionSelectionsByFieldId, // Selection-owned now\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [\n ready,\n ctx,\n activeTagId,\n formValuesByFieldId,\n optionSelectionsByFieldId,\n selTick,\n ]);\n\n /**\n * Pricing preview unchanged (driven from previewSnapshot)\n */\n const pricingPreview: PricingPreview = useMemo(() => {\n const empty: PricingPreview = {\n unitRate: 0,\n base: 0,\n utilities: 0,\n total: 0,\n utilityBreakdown: [],\n };\n\n if (!ready) return empty;\n\n const { init } = ctx.ensureReady(\"pricingPreview\");\n const normalizeRate: NormalizeRateFn =\n ((init as unknown as { normalizeRate?: NormalizeRateFn })\n .normalizeRate as NormalizeRateFn) ??\n ((s: any) => Number(s?.rate));\n\n const quantity = Number(previewSnapshot.quantity ?? 1) || 1;\n\n let bestId: string | number | undefined;\n let bestRate = 0;\n\n const selectedIds = (previewSnapshot.services ?? []) as Array<\n string | number\n >;\n const svcMap = (init as any).services as Record<\n string | number,\n unknown\n >;\n\n for (const id of selectedIds) {\n const svc = svcMap?.[id];\n if (!svc) continue;\n\n const r = Number(normalizeRate(svc));\n if (!Number.isFinite(r)) continue;\n\n if (r > bestRate) {\n bestRate = r;\n bestId = id;\n }\n }\n\n const base = bestRate * quantity;\n\n const breakdown: PricingPreview[\"utilityBreakdown\"] = [];\n let utilitiesTotal = 0;\n\n const utils = ((previewSnapshot as any).utilities ?? []) as Array<any>;\n for (const u of utils) {\n const rate = Number(u?.rate);\n if (!Number.isFinite(rate)) continue;\n\n let amount = 0;\n const mode = String(u?.mode ?? \"\");\n\n switch (mode) {\n case \"flat\":\n amount = rate;\n break;\n case \"per_quantity\":\n amount = rate * quantity;\n break;\n case \"percent\":\n amount = base * (rate / 100);\n break;\n default:\n amount = 0;\n }\n\n if (Number.isFinite(amount) && amount !== 0) {\n utilitiesTotal += amount;\n breakdown.push({\n nodeId: String(u?.nodeId ?? \"\"),\n mode,\n amount,\n });\n }\n }\n\n return {\n serviceId: bestId,\n unitRate: bestRate,\n base,\n utilities: utilitiesTotal,\n total: base + utilitiesTotal,\n utilityBreakdown: breakdown,\n };\n }, [ready, ctx, previewSnapshot]);\n\n const selectTag = useCallback(\n (tagId: string) => {\n ctx.ensureReady(\"selectTag\");\n ctx.selection?.replace?.(tagId);\n ctx.setActiveTag(tagId);\n },\n [ctx],\n );\n\n /**\n * Selection-only toggles.\n * (No form selections.)\n */\n const toggleOption = useCallback(\n (fieldId: string, optionId?: string) => {\n const token = optionId ?? fieldId;\n ctx.selection?.toggle?.(token);\n },\n [ctx],\n );\n\n const setValue = useCallback(\n (fieldId: string, value: Scalar | Scalar[]) => {\n // programmatic, goes into form memory (core bucket)\n ctx.formApi.set(fieldId, value);\n },\n [ctx],\n );\n\n const clearField = useCallback(\n (fieldId: string) => {\n ctx.formApi.set(fieldId, undefined);\n ctx.selection?.remove?.(fieldId);\n },\n [ctx],\n );\n\n const reset = useCallback(\n (opts?: { keepTag?: boolean }) => {\n ctx.ensureReady(\"reset\");\n ctx.reset(opts);\n },\n [ctx],\n );\n\n const setSnapshot = useCallback(\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\n ctx.ensureReady(\"setSnapshot\");\n ctx.setSnapshot(snap, opts);\n },\n [ctx],\n );\n\n /**\n * Build snapshot must VALIDATE.\n * This is where form.submit() belongs.\n */\n const buildSnapshot = useCallback((): OrderSnapshot | undefined => {\n const { builder, selection, init } = ctx.ensureReady(\"buildSnapshot\");\n\n const tagId = selection.currentTag();\n const selectedKeys = selection.selectedButtons();\n if (!tagId) {\n throw new Error(\"OrderFlow: no active tag/context selected\");\n }\n\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n const submitted = ctx.formApi.submit();\n const values = submitted.values as Record<string, Scalar | Scalar[]>;\n\n if (!submitted.valid) return;\n\n const visibleFieldIds =\n builder.visibleFields?.(tagId, selectedKeys) ??\n builder\n .getProps()\n .fields.filter((f) => f.bind_id === tagId)\n .map((f) => f.id);\n\n const fieldById = new Map(\n builder.getProps().fields.map((field) => [field.id, field]),\n );\n\n const customIssues = validateVisibleFields(\n visibleFieldIds,\n fieldById,\n values,\n );\n\n if (customIssues.length > 0) {\n ctx.formApi.setErrors?.(\n Object.fromEntries(\n customIssues.map((issue) => [issue.fieldId, issue.message]),\n ),\n );\n\n return;\n }\n\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: tagId,\n formValuesByFieldId: values,\n selectedKeys,\n optionSelectionsByFieldId,\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [ctx, optionSelectionsByFieldId]);\n\n const raw = useMemo(() => {\n if (!ready) return propsRef.current ?? ({} as ServiceProps);\n return ctx.ensureReady(\"raw\").builder.getProps();\n }, [ctx, ready, selTick]);\n\n const notices = useMemo(() => raw.notices ?? [], [raw]);\n\n return {\n ready,\n initialize,\n\n activeTagId,\n raw,\n notices,\n\n visibleGroup,\n\n formValuesByFieldId,\n optionSelectionsByFieldId,\n\n quantityPreview: previewSnapshot.quantity,\n services: previewSnapshot.services,\n serviceMap: previewSnapshot.serviceMap,\n\n pricingPreview,\n\n min: previewSnapshot.min ?? 1,\n max: previewSnapshot.max ?? previewSnapshot.min ?? 1,\n\n selectTag,\n toggleOption,\n setValue,\n clearField,\n\n reset,\n setSnapshot,\n\n buildSnapshot,\n\n fallbackPolicy: ctx.fallbackPolicy,\n setFallbackPolicy: ctx.setFallbackPolicy,\n };\n}\n","// src/react/hooks/order-flow-provider.tsx\r\nimport React, {\r\n createContext,\r\n forwardRef,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { FormProvider, Provider, useFormApi } from \"@/react\";\r\nimport type { Registry as InputRegistryConfig } from \"../inputs/registry\";\r\n\r\nimport { type Builder, type BuilderOptions, createBuilder } from \"@/core\";\r\n\r\nimport type { ServiceProps, Tag } from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\r\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\nimport { Selection } from \"../canvas/selection\";\r\n\r\nconst ROOT_TAG_ID = \"t:root\";\r\n\r\n/* ───────────────────────── Types ───────────────────────── */\r\n\r\nexport type OrderFlowInit = {\r\n mode?: \"prod\" | \"dev\";\r\n /** required service map used for snapshot building / rules */\r\n services: DgpServiceMap;\r\n /** fallback policy overrides */\r\n fallback?: FallbackSettings;\r\n /** hydrate initial state from snapshot */\r\n hydrateFrom?: OrderSnapshot;\r\n /** initial tag (ignored if hydrateFrom exists and provides tag) */\r\n initialTagId?: string;\r\n /** default quantity used by snapshot builder (default 1) */\r\n hostDefaultQuantity?: number;\r\n /** selection resolver (optional) */\r\n resolveService?: (id: number | string) => DgpServiceCapability | undefined;\r\n /**\r\n * Host props provided to further enhance the nodes data\r\n */\r\n ctx?: Record<string, unknown>;\r\n\r\n normalizeRate?(svc: DgpServiceCapability): number;\r\n};\r\n\r\ntype ProviderFlow = {\r\n builder: Builder;\r\n selection?: Selection;\r\n};\r\n\r\nexport type OrderFlowProviderProps = {\r\n /**\r\n * Optional at mount time.\r\n * If absent, call initialize(...) later (via ref OR hook API).\r\n */\r\n serviceProps?: ServiceProps;\r\n builder?: Builder;\r\n flow?: ProviderFlow;\r\n\r\n builderOptions?: BuilderOptions;\r\n\r\n /** optional selection override (if not passed in flow) */\r\n selection?: Selection;\r\n\r\n /** Host input registry (maps kind/variant → components) */\r\n registry?: InputRegistryConfig;\r\n\r\n /** Optional now (deferred init supported). */\r\n init?: OrderFlowInit;\r\n\r\n children?: ReactNode;\r\n};\r\n\r\nexport type OrderFlowInitializeParams = {\r\n serviceProps?: ServiceProps;\r\n builder?: Builder;\r\n flow?: ProviderFlow;\r\n\r\n builderOptions?: BuilderOptions;\r\n selection?: Selection;\r\n\r\n init: OrderFlowInit;\r\n};\r\n\r\nexport type OrderFlowHandle = {\r\n /** whether provider has enough info to run */\r\n ready: () => boolean;\r\n\r\n /** (re)initialize the provider */\r\n initialize: (params: OrderFlowInitializeParams) => void;\r\n\r\n getActiveTag: () => string | undefined;\r\n selectTag: (tagId: string) => void;\r\n\r\n getVisibleGroup: () => ReturnType<Selection[\"visibleGroup\"]>;\r\n getSelectionIds: () => string[];\r\n clearSelection: () => void;\r\n\r\n /** Apply snapshot into selection + form values/selections */\r\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\r\n\r\n /** Reset tag + clear fields */\r\n reset: (opts?: { keepTag?: boolean }) => void;\r\n\r\n refresh: () => void;\r\n};\r\n\r\n/* ───────────────────────── Context ───────────────────────── */\r\n\r\ntype NormalizedInit = Required<\r\n Pick<OrderFlowInit, \"mode\" | \"hostDefaultQuantity\">\r\n> &\r\n OrderFlowInit;\r\n\r\ntype EnsureReadyResult = {\r\n builder: Builder;\r\n selection: Selection;\r\n init: NormalizedInit;\r\n};\r\n\r\ntype CtxShape = {\n builder: Builder | null;\n selection: Selection | null;\n\n activeTagId?: string;\n setActiveTag: (id: string) => void;\n\r\n init: NormalizedInit | null;\r\n\r\n /** Form API from FormProvider (always available) */\r\n formApi: ReturnType<typeof useFormApi>;\r\n\r\n /** fallback policy (owned here; used by hook) */\r\n fallbackPolicy: FallbackSettings;\r\n setFallbackPolicy: (next: FallbackSettings) => void;\r\n\r\n /** imperative helpers exposed to hook */\r\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\r\n reset: (opts?: { keepTag?: boolean }) => void;\r\n\r\n /** guards */\r\n ready: () => boolean;\r\n ensureReady: (op?: string) => EnsureReadyResult;\r\n\r\n /** init API */\r\n initialize: (params: OrderFlowInitializeParams) => void;\r\n};\r\n\r\nconst OrderFlowCtx = createContext<CtxShape | null>(null);\r\n\r\nexport function useOrderFlowContext(): CtxShape {\r\n const ctx = useContext(OrderFlowCtx);\r\n if (!ctx)\r\n throw new Error(\r\n \"useOrderFlowContext must be used within <OrderFlowProvider>\",\r\n );\r\n return ctx;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction findDefaultTagId(tags: Tag[]): string | undefined {\r\n if (!tags?.length) return undefined;\r\n const hasRoot = tags.some((t) => t.id === ROOT_TAG_ID);\r\n return hasRoot ? ROOT_TAG_ID : tags[0]!.id;\r\n}\r\n\r\n/** Snapshot.inputs.form is keyed by field.name; map -> fieldId for FormProvider initial */\r\nfunction mapSnapshotFormToFieldIds(\r\n builder: Builder,\r\n snap: OrderSnapshot,\r\n): Record<string, Scalar | Scalar[]> {\r\n const byFieldId: Record<string, Scalar | Scalar[]> = {};\r\n const form = snap.inputs?.form ?? {};\r\n const fields = builder.getProps().fields ?? [];\r\n\r\n const nameToIds = new Map<string, string[]>();\r\n for (const f of fields) {\r\n if (!f.name) continue;\r\n const arr = nameToIds.get(f.name) ?? [];\r\n arr.push(f.id);\r\n nameToIds.set(f.name, arr);\r\n }\r\n\r\n for (const [name, value] of Object.entries(form)) {\r\n for (const fid of nameToIds.get(name) ?? []) {\r\n byFieldId[fid] = value as Scalar | Scalar[];\r\n }\r\n }\r\n\r\n return byFieldId;\r\n}\r\n\r\nfunction makeDefaultFallback(\n mode: \"prod\" | \"dev\",\n patch?: FallbackSettings,\n): FallbackSettings {\n return {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(patch ?? {}),\n };\r\n}\r\n\r\nfunction normalizeInit(init: OrderFlowInit): NormalizedInit {\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number.isFinite(init.hostDefaultQuantity ?? 1)\n ? Number(init.hostDefaultQuantity ?? 1)\n : 1;\n return { ...init, mode, hostDefaultQuantity };\n}\n\nfunction sameNormalizedInit(\n a: NormalizedInit | null,\n b: NormalizedInit | null,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n return (\n a.mode === b.mode &&\n a.hostDefaultQuantity === b.hostDefaultQuantity &&\n a.services === b.services &&\n a.fallback === b.fallback &&\n a.hydrateFrom === b.hydrateFrom &&\n a.initialTagId === b.initialTagId &&\n a.resolveService === b.resolveService &&\n a.ctx === b.ctx &&\n a.normalizeRate === b.normalizeRate\n );\n}\n\nfunction sameServiceProps(\n a: ServiceProps | null | undefined,\n b: ServiceProps | null | undefined,\n): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n}\n\r\n/* ───────────────────────── Bridge ───────────────────────── */\r\n/**\r\n * This component MUST live inside <FormProvider> so it can call useFormApi()\r\n * and provide OrderFlowCtx synchronously on the first render.\r\n */\r\nfunction OrderFlowCtxBridge(props: {\r\n ctxValue: Omit<CtxShape, \"formApi\">;\r\n formApiRef: React.MutableRefObject<ReturnType<typeof useFormApi> | null>;\r\n children?: ReactNode;\r\n}) {\r\n const formApi = useFormApi();\r\n props.formApiRef.current = formApi; // sync (render-time) ref\r\n\r\n return (\r\n <OrderFlowCtx.Provider value={{ ...props.ctxValue, formApi }}>\r\n {props.children}\r\n </OrderFlowCtx.Provider>\r\n );\r\n}\r\n\r\n/* ───────────────────────── Component ───────────────────────── */\r\n\r\nexport const OrderFlowProvider = forwardRef<\r\n OrderFlowHandle,\r\n OrderFlowProviderProps\r\n>(function OrderFlowProvider(\r\n {\r\n flow,\r\n builder: builderProp,\r\n serviceProps,\r\n builderOptions,\r\n selection: selectionProp,\r\n registry,\r\n init,\r\n children,\r\n },\r\n ref,\r\n) {\r\n // deferred init storage\r\n const builderRef = useRef<Builder | null>(null);\n const selectionRef = useRef<Selection | null>(null);\n const initRef = useRef<NormalizedInit | null>(null);\n const unsubRef = useRef<null | (() => void)>(null);\n\r\n // Form API ref (render-time set by bridge)\r\n const formApiRef = useRef<ReturnType<typeof useFormApi> | null>(null);\r\n\r\n // active tag tracking\r\n const [activeTagId, setActiveTagId] = useState<string | undefined>(\r\n undefined,\r\n );\r\n\r\n // fallback policy state\r\n const [fallbackPolicy, setFallbackPolicy] = useState<FallbackSettings>(() =>\r\n makeDefaultFallback(\"prod\"),\r\n );\r\n\r\n // to re-render when initialize() is called\r\n const [, force] = useState(0);\r\n const bump = () => force((x) => x + 1);\r\n\r\n const resolveBuilder = useCallback(\n (p: {\n flow?: ProviderFlow;\n builder?: Builder;\r\n serviceProps?: ServiceProps;\r\n builderOptions?: BuilderOptions;\r\n }) => {\r\n if (p.flow?.builder) return p.flow.builder;\r\n if (p.builder) return p.builder;\r\n\r\n if (p.serviceProps) {\r\n const b = createBuilder(p.builderOptions ?? {});\r\n b.load(p.serviceProps);\r\n return b;\r\n }\r\n\r\n return null;\r\n },\r\n [],\n );\n\n const resolvedBuilder = useMemo(\n () =>\n resolveBuilder({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n }),\n [builderOptions, builderProp, flow, resolveBuilder, serviceProps],\n );\n\n const effectiveInit = useMemo<NormalizedInit | null>(() => {\n if (init) return normalizeInit(init);\n if (!resolvedBuilder) return null;\n return normalizeInit({\n services: {},\n mode: \"prod\",\n hostDefaultQuantity: 1,\n });\n }, [init, resolvedBuilder]);\n\n useEffect(() => {\n return () => {\n if (unsubRef.current) unsubRef.current();\n };\r\n }, []);\r\n\r\n const resolveSelection = useCallback(\r\n (\r\n b: Builder,\r\n nInit: NormalizedInit,\r\n p: { flow?: ProviderFlow; selection?: Selection },\r\n ) => {\r\n return (\r\n p.flow?.selection ??\r\n p.selection ??\r\n new Selection(b, {\r\n env: \"client\",\r\n rootTagId: ROOT_TAG_ID,\r\n resolveService: nInit.resolveService,\r\n })\r\n );\r\n },\r\n [],\r\n );\r\n\r\n const ready = useCallback(\r\n () =>\r\n !!builderRef.current && !!selectionRef.current && !!initRef.current,\r\n [],\r\n );\r\n\r\n const ensureReady = useCallback((op?: string): EnsureReadyResult => {\r\n const b = builderRef.current;\r\n const s = selectionRef.current;\r\n const i = initRef.current;\r\n\r\n if (!b || !s || !i) {\r\n const hint = op ? ` (${op})` : \"\";\r\n throw new Error(\r\n `OrderFlowProvider is not initialized${hint}. Call initialize(...) or pass init + serviceProps/builder.`,\r\n );\r\n }\r\n return { builder: b, selection: s, init: i };\r\n }, []);\r\n\r\n const wireSelectionListener = useCallback((sel: Selection) => {\r\n setActiveTagId(sel.currentTag());\r\n return sel.onChange(() => setActiveTagId(sel.currentTag()));\r\n }, []);\r\n\r\n const initialize = useCallback(\r\n (params: OrderFlowInitializeParams) => {\r\n const b = resolveBuilder(params);\r\n if (!b) {\r\n throw new Error(\r\n \"OrderFlowProvider.initialize: requires `serviceProps` or `builder`/`flow.builder`.\",\r\n );\r\n }\r\n\r\n const nInit = normalizeInit(params.init);\r\n const sel = resolveSelection(b, nInit, {\r\n flow: params.flow,\r\n selection: params.selection,\r\n });\r\n\r\n builderRef.current = b;\r\n selectionRef.current = sel;\r\n initRef.current = nInit;\r\n\r\n setFallbackPolicy(makeDefaultFallback(nInit.mode, nInit.fallback));\r\n\r\n // ✅ bind listener immediately (and replace any previous listener)\r\n if (unsubRef.current) unsubRef.current();\r\n unsubRef.current = sel.onChange(() =>\r\n setActiveTagId(sel.currentTag()),\r\n );\r\n\r\n // ✅ choose initial tag (hydrate -> init -> root -> first)\r\n const tags = b.getProps().filters ?? [];\r\n const hydratedTag = nInit.hydrateFrom?.selection?.tag;\r\n const initialTag = nInit.hydrateFrom\r\n ? hydratedTag\r\n : (nInit.initialTagId ?? findDefaultTagId(tags));\r\n\r\n if (initialTag) sel.replace(initialTag);\r\n else if (tags.length) sel.replace(tags[0]!.id);\r\n\r\n // ✅ set activeTagId synchronously right now\r\n setActiveTagId(sel.currentTag());\r\n\r\n // ✅ late-init hydration: MUST be imperative (FormProvider.initial won't re-run)\r\n const api = formApiRef.current;\r\n\r\n if (api && nInit.hydrateFrom) {\r\n // selections are already fieldId-keyed\r\n const selMap = nInit.hydrateFrom.inputs?.selections ?? {};\r\n for (const [fid, oids] of Object.entries(selMap)) {\r\n api.setSelections(fid, oids ?? []);\r\n }\r\n\r\n // form is keyed by field.name -> map to fieldId(s)\r\n const valuesByFieldId = mapSnapshotFormToFieldIds(\r\n b,\r\n nInit.hydrateFrom,\r\n );\r\n for (const [fid, v] of Object.entries(valuesByFieldId)) {\r\n api.set(fid, v as Scalar | Scalar[]);\r\n }\r\n }\r\n\r\n bump();\r\n },\r\n [resolveBuilder, resolveSelection],\r\n );\r\n\r\n // auto initialize from mount props or reactively resync when sources change\n useEffect(() => {\n if (!resolvedBuilder || !effectiveInit) return;\n\n const nextSelection = resolveSelection(resolvedBuilder, effectiveInit, {\n flow,\n selection: selectionProp,\n });\n\n if (\n !ready() ||\n builderRef.current !== resolvedBuilder ||\n selectionRef.current !== nextSelection ||\n !sameNormalizedInit(initRef.current, effectiveInit)\n ) {\n initialize({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n init: effectiveInit,\n });\n }\n }, [\n builderOptions,\n builderProp,\n effectiveInit,\n flow,\n initialize,\n ready,\n resolveSelection,\n resolvedBuilder,\n selectionProp,\n serviceProps,\n ]);\n\n useEffect(() => {\n if (!serviceProps) return;\n if (!ready()) return;\n\n const currentBuilder = builderRef.current;\n if (!currentBuilder || currentBuilder !== resolvedBuilder) return;\n if (!sameServiceProps(currentBuilder.getProps(), serviceProps)) {\n currentBuilder.load(serviceProps);\n\n const currentTag = selectionRef.current?.currentTag();\n if (\n selectionRef.current &&\n currentTag &&\n !currentBuilder.isTagId(currentTag)\n ) {\n const nextTag =\n findDefaultTagId(currentBuilder.getProps().filters ?? []) ??\n currentBuilder.getProps().filters?.[0]?.id;\n if (nextTag) selectionRef.current.replace(nextTag);\n }\n\n bump();\n }\n }, [ready, resolvedBuilder, serviceProps]);\n\r\n // attach selection listener whenever selection changes\r\n useEffect(() => {\r\n const sel = selectionRef.current;\r\n if (!sel) return;\r\n return wireSelectionListener(sel);\r\n }, [wireSelectionListener, force]);\r\n\r\n const setActiveTag = useCallback(\r\n (id: string) => {\r\n const { selection } = ensureReady(\"setActiveTag\");\r\n selection.replace(id);\r\n setActiveTagId(id);\r\n },\r\n [ensureReady],\r\n );\r\n\r\n const clearAllFields = useCallback(() => {\r\n const api = formApiRef.current;\r\n if (!api) return;\r\n\r\n const b = builderRef.current;\r\n if (!b) return;\r\n\r\n const fields = b.getProps().fields ?? [];\r\n for (const f of fields) {\r\n api.set(f.id, undefined as unknown as Scalar);\r\n api.setSelections(f.id, []);\r\n }\r\n }, []);\r\n\r\n const setSnapshot = useCallback(\r\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\r\n const api = formApiRef.current;\r\n if (!api) return;\r\n\r\n const { builder, selection } = ensureReady(\"setSnapshot\");\r\n\r\n const clearFirst = opts?.clearFirst ?? true;\r\n\r\n const tag = snap.selection?.tag;\r\n if (tag) selection.replace(tag);\r\n\r\n if (clearFirst) clearAllFields();\r\n\r\n const sel = snap.inputs?.selections ?? {};\r\n for (const [fid, oids] of Object.entries(sel))\r\n api.setSelections(fid, oids ?? []);\r\n\r\n const valuesByFieldId = mapSnapshotFormToFieldIds(builder, snap);\r\n for (const [fid, v] of Object.entries(valuesByFieldId))\r\n api.set(fid, v as Scalar | Scalar[]);\r\n },\r\n [clearAllFields, ensureReady],\r\n );\r\n\r\n const reset = useCallback(\r\n (opts?: { keepTag?: boolean }) => {\r\n const keepTag = opts?.keepTag ?? false;\r\n\r\n const { builder, selection } = ensureReady(\"reset\");\r\n\r\n if (!keepTag) {\r\n const tags = builder.getProps().filters ?? [];\r\n const def = findDefaultTagId(tags) ?? tags[0]?.id;\r\n if (def) selection.replace(def);\r\n }\r\n\r\n clearAllFields();\r\n },\r\n [clearAllFields, ensureReady],\r\n );\r\n\r\n const getVisibleGroup = useCallback(\r\n () => ensureReady(\"getVisibleGroup\").selection.visibleGroup(),\r\n [ensureReady],\r\n );\r\n const getSelectionIds = useCallback(\r\n () => Array.from(ensureReady(\"getSelectionIds\").selection.all()),\r\n [ensureReady],\r\n );\r\n const clearSelection = useCallback(\r\n () => ensureReady(\"clearSelection\").selection.clear(),\r\n [ensureReady],\r\n );\r\n\r\n // initial FormProvider state (only if initialized + hydrateFrom exists)\r\n const initialValues = useMemo(() => {\r\n const b = builderRef.current;\r\n const i = initRef.current;\r\n if (!b || !i?.hydrateFrom) return {};\r\n return mapSnapshotFormToFieldIds(b, i.hydrateFrom);\r\n }, [force]);\r\n\r\n const initialSelections = useMemo(() => {\r\n const i = initRef.current;\r\n if (!i?.hydrateFrom) return {};\r\n return i.hydrateFrom.inputs?.selections ?? {};\r\n }, [force]);\r\n\r\n useImperativeHandle(\r\n ref,\r\n (): OrderFlowHandle => ({\r\n ready,\r\n initialize,\r\n\r\n getActiveTag: () => activeTagId,\r\n selectTag: (id: string) => setActiveTag(id),\r\n\r\n getVisibleGroup,\r\n getSelectionIds,\r\n clearSelection,\r\n\r\n setSnapshot,\r\n reset,\r\n refresh: () => setActiveTagId(selectionRef.current?.currentTag()),\r\n }),\r\n [\r\n activeTagId,\r\n clearSelection,\r\n getSelectionIds,\r\n getVisibleGroup,\r\n initialize,\r\n ready,\r\n reset,\r\n setActiveTag,\r\n setSnapshot,\r\n ],\r\n );\r\n\r\n return (\r\n <Provider initialRegistry={registry}>\r\n <FormProvider\r\n initial={{\r\n values: initialValues,\r\n selections: initialSelections,\r\n }}\r\n >\r\n <OrderFlowCtxBridge\r\n formApiRef={formApiRef}\r\n ctxValue={{\n builder: builderRef.current,\n selection: selectionRef.current,\n\n activeTagId,\n setActiveTag,\n\r\n init: initRef.current,\r\n\r\n fallbackPolicy,\r\n setFallbackPolicy,\r\n\r\n setSnapshot,\r\n reset,\r\n\r\n ready,\r\n ensureReady,\r\n\r\n initialize,\r\n }}\r\n >\r\n {children}\r\n </OrderFlowCtxBridge>\r\n </FormProvider>\r\n </Provider>\r\n );\r\n});\r\n","import { Field, FieldValidationRule, Scalar } from \"@/schema\";\n\nexport type FieldValidationIssue = {\n fieldId: string;\n message: string;\n rule: FieldValidationRule;\n};\n\nexport function evaluateFieldValidationRule(\n rule: FieldValidationRule,\n raw: Scalar | Scalar[] | undefined,\n): boolean {\n const valueBy = rule.valueBy ?? \"value\";\n\n let subject: unknown = raw;\n\n if (valueBy === \"length\") {\n if (typeof raw === \"string\" || Array.isArray(raw)) subject = raw.length;\n else subject = 0;\n }\n\n if (valueBy === \"eval\") {\n if (typeof rule.code !== \"string\" || !rule.code.trim()) return true;\n try {\n const fn = new Function(\"value\", \"values\", rule.code);\n subject = fn(raw, Array.isArray(raw) ? raw : [raw]);\n } catch {\n return true;\n }\n }\n\n switch (rule.op) {\n case \"eq\":\n return subject === rule.value;\n case \"neq\":\n return subject !== rule.value;\n case \"gt\":\n return Number(subject) > Number(rule.value);\n case \"gte\":\n return Number(subject) >= Number(rule.value);\n case \"lt\":\n return Number(subject) < Number(rule.value);\n case \"lte\":\n return Number(subject) <= Number(rule.value);\n case \"between\":\n return (\n Number(subject) >= Number(rule.min) &&\n Number(subject) <= Number(rule.max)\n );\n case \"in\":\n return Array.isArray(rule.values) && rule.values.includes(subject);\n case \"nin\":\n return Array.isArray(rule.values) && !rule.values.includes(subject);\n case \"truthy\":\n return !!subject;\n case \"falsy\":\n return !subject;\n case \"match\":\n return typeof subject === \"string\" &&\n typeof rule.pattern === \"string\"\n ? new RegExp(rule.pattern, rule.flags ?? \"\").test(subject)\n : false;\n default:\n return true;\n }\n}\n\nexport function validateVisibleFields(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n formValuesByFieldId: Record<string, Scalar | Scalar[]>,\n): FieldValidationIssue[] {\n const out: FieldValidationIssue[] = [];\n\n for (const fid of visibleFieldIds) {\n const field = fieldById.get(fid);\n if (!field?.validation?.length) continue;\n\n const value = formValuesByFieldId[fid];\n\n for (const rule of field.validation) {\n const ok = evaluateFieldValidationRule(rule, value);\n if (!ok) {\n out.push({\n fieldId: fid,\n message: rule.message || `${field.label} is invalid`,\n rule,\n });\n break;\n }\n }\n }\n\n return out;\n}\n","// src/react/inputs/registry/entries/text.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"text\",\n stripPrefix: true,\n stripSuffix: true,\n slotChar: \"_\",\n },\n\n ui: {\n // shared box tuning (text supports these)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n // behavior\n trim: {\n type: \"boolean\",\n label: \"Trim\",\n description: \"If enabled, the value is trimmed before validation.\",\n },\n\n minLength: {\n type: \"number\",\n label: \"Min length\",\n minimum: 0,\n description: \"Minimum allowed string length.\",\n },\n\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum allowed string length.\",\n },\n\n // affixes\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description: \"Fixed prefix rendered as part of the input value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description: \"Fixed suffix rendered as part of the input value.\",\n },\n\n stripPrefix: {\n type: \"boolean\",\n label: \"Strip prefix\",\n description:\n \"If enabled, remove the prefix from the emitted model value.\",\n },\n\n stripSuffix: {\n type: \"boolean\",\n label: \"Strip suffix\",\n description:\n \"If enabled, remove the suffix from the emitted model value.\",\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // shared masking knobs\n ...sharedUi.textMask,\n },\n}; \n","// src/react/inputs/registry/shared.ts\nimport type { Ui } from \"@/schema\";\n\nexport const sharedUi = {\n // ─────────────────────────────────────────────\n // Layout: join controls (text + select)\n // ─────────────────────────────────────────────\n joinControls: {\n type: \"boolean\",\n label: \"Join controls\",\n description:\n \"If enabled and there are controls, the input and controls share one visual box (borders, radius, focus states).\",\n } satisfies Ui,\n\n extendBoxToControls: {\n type: \"boolean\",\n label: \"Extend box to controls\",\n description:\n \"When joinControls is enabled: extend the styling over the controls (true) or keep them visually separate (false).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Masking (text family)\n // ─────────────────────────────────────────────\n textMask: {\n mask: {\n type: \"string\",\n label: \"Mask pattern\",\n description:\n 'Mask pattern for formatted input (e.g. \"99/99/9999\", \"(999) 999-9999\").',\n } satisfies Ui,\n\n slotChar: {\n type: \"string\",\n label: \"Slot character\",\n description: 'Mask placeholder character (default is \"_\").',\n minLength: 1,\n maxLength: 1,\n } satisfies Ui,\n\n autoClear: {\n type: \"boolean\",\n label: \"Auto clear\",\n description:\n 'If enabled, empty masked values emit \"\" instead of placeholder slots.',\n } satisfies Ui,\n\n unmask: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls whether the emitted value is raw (unmasked) or masked.\",\n items: [\n { type: \"string\", title: \"Masked\", value: \"masked\" },\n { type: \"string\", title: \"Raw\", value: \"raw\" },\n ],\n } satisfies Ui,\n\n maskInsertMode: {\n type: \"anyOf\",\n label: \"Mask insert mode\",\n description:\n \"Reserved for future caret-mode logic (kept for compatibility).\",\n items: [\n { type: \"string\", title: \"Stream\", value: \"stream\" },\n { type: \"string\", title: \"Caret\", value: \"caret\" },\n ],\n } satisfies Ui,\n \n maskDefinitions: {\n type: \"object\",\n label: \"Mask definitions\",\n description:\n \"Per-symbol definitions for mask slots. Add a symbol key, then choose the definition shape.\",\n editable: true,\n fields: {},\n\n shape: {\n \"Regex pattern\": {\n type: \"string\",\n label: \"Pattern\",\n description:\n \"A regex pattern describing what this slot accepts.\",\n pattern: \".*\",\n },\n\n \"Boolean toggle\": {\n type: \"boolean\",\n label: \"Enabled\",\n description:\n \"Simple on/off definition (rare, but supported).\",\n },\n\n \"Choice list\": {\n type: \"anyOf\",\n label: \"Allowed values\",\n description: \"Explicit allowed values for this slot.\",\n items: [{ type: \"string\", title: \"Example\", value: \"X\" }],\n },\n },\n } satisfies Ui,\n },\n\n // ─────────────────────────────────────────────\n // Options mapping + search UX (select / multi-select family)\n // ─────────────────────────────────────────────\n optionMapping: {\n options: {\n type: \"array\",\n label: \"Options\",\n description: \"List of options to render.\",\n item: {\n type: \"object\",\n label: \"Option\",\n description: \"Option entry (object).\",\n fields: {},\n } as Ui,\n } satisfies Ui,\n\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise the first letter when the resolved label is a string.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the label from option objects.\",\n } satisfies Ui,\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value from option objects.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description:\n \"Key to read the description line from option objects.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n 'Key to read the icon from option objects (often \"icon\").',\n } satisfies Ui,\n\n optionKey: {\n type: \"string\",\n label: \"Option key\",\n description: \"Stable key used as the identity for each option.\",\n } satisfies Ui,\n },\n\n searchUx: {\n searchable: {\n type: \"boolean\",\n label: \"Searchable\",\n description: \"Enable searching inside the dropdown.\",\n } satisfies Ui,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description: \"Placeholder text for the search input.\",\n } satisfies Ui,\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when the search returns no results.\",\n } satisfies Ui,\n },\n\n pickerCommon: {\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n },\n\n // -----------------------------\n // Box sizing / density (text + textarea, etc.)\n // -----------------------------\n size: {\n type: \"anyOf\",\n label: \"Size\",\n description: \"Size preset for the input.\",\n items: [\n { type: \"string\", title: \"Small\", value: \"sm\" },\n { type: \"string\", title: \"Medium\", value: \"md\" },\n { type: \"string\", title: \"Large\", value: \"lg\" },\n ],\n } satisfies Ui,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Controls vertical compactness / line-height preset.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Normal\", value: \"normal\" },\n { type: \"string\", title: \"Relaxed\", value: \"relaxed\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n } satisfies Ui,\n\n // -----------------------------\n // Padding (text + textarea, etc.)\n // -----------------------------\n padding: {\n px: {\n type: \"number\",\n label: \"Padding X\",\n description: \"Horizontal padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n py: {\n type: \"number\",\n label: \"Padding Y\",\n description: \"Vertical padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n ps: {\n type: \"number\",\n label: \"Padding start\",\n description:\n \"Start-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pe: {\n type: \"number\",\n label: \"Padding end\",\n description: \"End-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pb: {\n type: \"number\",\n label: \"Padding bottom\",\n description: \"Bottom padding override in pixels (overrides py).\",\n minimum: 0,\n } satisfies Ui,\n },\n} as const;\n","// src/react/inputs/registry/entries/textarea.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textareaDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: {\n variant: \"textarea\",\n },\n ui: {\n // box tuning shared with text\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n \n autoResize: {\n type: \"boolean\",\n label: \"Auto resize\",\n description: \"Automatically grows/shrinks height based on content.\",\n },\n\n rows: {\n type: \"number\",\n label: \"Min rows\",\n description:\n \"Minimum number of visible rows (used when auto-resize is enabled).\",\n minimum: 1,\n },\n\n maxRows: {\n type: \"number\",\n label: \"Max rows\",\n description:\n \"Maximum number of visible rows (leave unset for unlimited).\",\n minimum: 1,\n },\n\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n extendBoxToToolbox: {\n type: \"boolean\",\n label: \"Extend box to toolbox\",\n description:\n \"Extend the textarea box styling to the upper toolbox area when present.\",\n },\n },\n};\n","// src/react/inputs/registry/entries/phone.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const phoneDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"phone\", // MUST\n\n // (optional) you can omit these since the component already defaults them:\n // showCountry: true,\n // showFlag: true,\n // showSelectedLabel: false,\n // showSelectedDial: false,\n // showDialInList: true,\n // valueMode: \"e164\",\n // keepCharPositions: false,\n },\n\n ui: {\n // shared text-like tuning supported by phone (since it types against Text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // ─────────────────────────────────────────────\n // Phone-specific configuration\n // ─────────────────────────────────────────────\n\n defaultCountry: {\n type: \"string\",\n label: \"Default country\",\n description:\n 'ISO 3166-1 alpha-2 code for the initial country (e.g. \"NG\", \"US\", \"GB\").',\n },\n\n // Countries list is optional; if omitted, runtime uses global list.\n // editable=true lets admins add custom countries if you want.\n countries: {\n type: \"array\",\n label: \"Countries\",\n description:\n \"Optional custom country list. If omitted, the global country list is used.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Country\",\n description:\n \"A single country entry: code, label, dial code, and national mask.\",\n editable: false,\n fields: {\n code: {\n type: \"string\",\n label: \"ISO code\",\n description: 'ISO alpha-2 (e.g. \"NG\").',\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: 'Display label (e.g. \"Nigeria\").',\n },\n dial: {\n type: \"string\",\n label: \"Dial code\",\n description: 'Dial code without \"+\" (e.g. \"234\").',\n },\n mask: {\n type: \"string\",\n label: \"National mask\",\n description:\n 'Mask for the NATIONAL portion only (no dial). Example: \"999 999 9999\".',\n },\n // flag is ReactNode in the variant; not builder-editable, so excluded.\n },\n order: [\"code\", \"label\", \"dial\", \"mask\"],\n },\n }, \n\n valueMode: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls how the form value is emitted (masked, e164, or national digits only).\",\n items: [\n {\n type: \"string\",\n title: \"Masked (+234 801 234 5678)\",\n value: \"masked\",\n },\n {\n type: \"string\",\n title: \"E164 (dial+digits, no +)\",\n value: \"e164\",\n },\n {\n type: \"string\",\n title: \"National (digits only)\",\n value: \"national\",\n },\n ],\n },\n\n keepCharPositions: {\n type: \"boolean\",\n label: \"Keep character positions\",\n description:\n \"If enabled, the national mask keeps placeholder characters for not-yet-filled positions.\",\n },\n\n // ─────────────────────────────────────────────\n // Country selector UX (allowed; not InputField placeholder)\n // ─────────────────────────────────────────────\n\n showCountry: {\n type: \"boolean\",\n label: \"Show country selector\",\n description: \"Show or hide the country selector control.\",\n },\n\n countryPlaceholder: {\n type: \"string\",\n label: \"Country placeholder\",\n description:\n \"Placeholder shown on the country selector when nothing is selected.\",\n },\n\n showFlag: {\n type: \"boolean\",\n label: \"Show flag\",\n description: \"Show or hide the country flag in the selector.\",\n },\n\n showSelectedLabel: {\n type: \"boolean\",\n label: \"Show selected label\",\n description: \"Show the selected country label in the trigger.\",\n },\n\n showSelectedDial: {\n type: \"boolean\",\n label: \"Show selected dial code\",\n description: \"Show the selected country dial code in the trigger.\",\n },\n\n showDialInList: {\n type: \"boolean\",\n label: \"Show dial code in list\",\n description:\n \"Show dial codes alongside country names in the dropdown list.\",\n },\n\n // onCountryChange is a callback; not builder-editable, so excluded.\n // country*ClassName props are forbidden; excluded.\n },\n};\n","// src/react/inputs/registry/entries/toggle-group.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleGroupDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle-group\", // MUST\n multiple: false,\n variantStyle: \"default\",\n layout: \"horizontal\",\n gridCols: 2,\n fillWidth: false,\n autoCap: false,\n },\n\n ui: {\n // (toggle-group supports these via VariantBaseProps)\n size: sharedUi.size,\n density: sharedUi.density,\n\n /**\n * Options\n * - supports primitive shorthand + objects + option* mapping keys\n */\n options: {\n type: \"array\",\n label: \"Options\",\n description:\n \"Toggle options. Can be primitive values (string/number/boolean) or objects. Uses option* keys when provided.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Option\",\n description:\n \"Option object (used when you want label/value/icon/disabled/tooltip/meta).\",\n editable: true,\n fields: {\n // Keep this minimal; the variant can also read via option* keys.\n value: {\n type: \"string\",\n label: \"Value\",\n description: \"Unique option value (string).\",\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Display label for the option.\",\n },\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable this option.\",\n },\n tooltip: {\n type: \"string\",\n label: \"Tooltip\",\n description: \"Optional tooltip text for this option.\",\n },\n },\n } as any,\n },\n\n // option mapping keys (shared)\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise labels when the resolved label is a string.\",\n },\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description:\n \"Property name to read the option value from when using custom option objects.\",\n },\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description:\n \"Property name to read the option label from when using custom option objects.\",\n },\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n \"Property name to read an icon from (runtime-only; builder typically won’t author icons).\",\n },\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description:\n \"Property name to read the disabled flag from when using custom option objects.\",\n },\n\n optionTooltip: {\n type: \"string\",\n label: \"Option tooltip key\",\n description:\n \"Property name to read tooltip content from when using custom option objects.\",\n },\n\n optionMeta: {\n type: \"string\",\n label: \"Option meta key\",\n description:\n \"Property name to read meta from (opaque payload for host logic).\",\n },\n\n // selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple options can be selected (emits a string array).\",\n },\n\n // visuals/layout\n variant: {\n type: \"anyOf\",\n label: \"Variant style\",\n description:\n 'Visual style for the toggle buttons (\"default\" or \"outline\").',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Outline\", value: \"outline\" },\n ],\n },\n\n layout: {\n type: \"anyOf\",\n label: \"Layout\",\n description: \"How the toggle items are arranged.\",\n items: [\n { type: \"string\", title: \"Horizontal\", value: \"horizontal\" },\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\n { type: \"string\", title: \"Grid\", value: \"grid\" },\n ],\n },\n\n gridCols: {\n type: \"number\",\n label: \"Grid columns\",\n description: \"Number of columns when layout is set to grid.\",\n minimum: 1,\n },\n\n fillWidth: {\n type: \"boolean\",\n label: \"Fill width\",\n description:\n \"If enabled, the group stretches to full width and items expand to fill available space.\",\n },\n\n gap: {\n type: \"number\",\n label: \"Item gap\",\n description:\n \"Spacing between items in pixels (applies in grid/horizontal/vertical layouts).\",\n minimum: 0,\n },\n },\n};\n","// src/react/inputs/registry/entries/number.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const numberDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"number\", // MUST\n\n // sensible defaults (optional — you can remove if you prefer)\n mode: \"decimal\",\n useGrouping: true,\n format: true,\n allowEmpty: true,\n step: 1,\n\n // for ShadcnNumberVariant\n showButtons: false,\n buttonLayout: \"stacked\",\n },\n\n ui: {\n // shared (supported via text base)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // numeric mode\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Number formatting mode (decimal or currency).\",\n items: [\n { type: \"string\", title: \"Decimal\", value: \"decimal\" },\n { type: \"string\", title: \"Currency\", value: \"currency\" },\n ],\n },\n\n currency: {\n type: \"string\",\n label: \"Currency code\",\n description:\n 'ISO currency code used when mode is \"currency\" (e.g. \"USD\", \"NGN\").',\n },\n\n currencyDisplay: {\n type: \"anyOf\",\n label: \"Currency display\",\n description: \"How currency is displayed when mode is currency.\",\n items: [\n { type: \"string\", title: \"Symbol\", value: \"symbol\" },\n {\n type: \"string\",\n title: \"Narrow symbol\",\n value: \"narrowSymbol\",\n },\n { type: \"string\", title: \"Code\", value: \"code\" },\n { type: \"string\", title: \"Name\", value: \"name\" },\n ],\n },\n\n // locale + grouping\n locale: {\n type: \"string\",\n label: \"Locale\",\n description:\n 'Locale used for formatting (e.g. \"en-US\", \"en-GB\"). If unset, runtime uses browser locale.',\n },\n\n useGrouping: {\n type: \"boolean\",\n label: \"Use grouping\",\n description: \"If enabled, format with thousands separators.\",\n },\n\n // fraction digits\n minFractionDigits: {\n type: \"number\",\n label: \"Min fraction digits\",\n description: \"Minimum number of fractional digits to show.\",\n minimum: 0,\n },\n\n maxFractionDigits: {\n type: \"number\",\n label: \"Max fraction digits\",\n description: \"Maximum number of fractional digits to show.\",\n minimum: 0,\n },\n\n // limits + stepping\n min: {\n type: \"number\",\n label: \"Minimum\",\n description: \"Minimum allowed numeric value.\",\n },\n\n max: {\n type: \"number\",\n label: \"Maximum\",\n description: \"Maximum allowed numeric value.\",\n },\n\n step: {\n type: \"number\",\n label: \"Step\",\n description: \"Step increment used for arrow keys and +/- buttons.\",\n },\n\n // behavior\n allowEmpty: {\n type: \"boolean\",\n label: \"Allow empty\",\n description:\n \"If enabled, the field can be cleared to an empty state (null).\",\n },\n\n format: {\n type: \"boolean\",\n label: \"Format\",\n description:\n \"If enabled, uses Intl formatting (grouping/currency) when blurred. If disabled, shows raw text.\",\n },\n\n // affixes (allowed — not InputField props)\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description:\n \"Fixed prefix rendered as part of the displayed value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description:\n \"Fixed suffix rendered as part of the displayed value.\",\n },\n\n // ShadcnNumberVariant extras (buttons)\n showButtons: {\n type: \"boolean\",\n label: \"Show +/- buttons\",\n description:\n \"Show increment/decrement buttons around the number field.\",\n },\n\n buttonLayout: {\n type: \"anyOf\",\n label: \"Button layout\",\n description:\n 'How +/- buttons are arranged when \"Show +/- buttons\" is enabled.',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Stacked\", value: \"stacked\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/password.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const passwordDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"password\", // MUST\n\n // sensible defaults (optional)\n revealToggle: true,\n meterStyle: \"simple\",\n },\n\n ui: {\n // shared text-like tuning supported by password (it types against text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // password-specific\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum number of characters permitted.\",\n },\n\n autoComplete: {\n type: \"string\",\n label: \"Autocomplete\",\n description:\n 'Browser autocomplete hint (e.g. \"current-password\", \"new-password\").',\n },\n\n revealToggle: {\n type: \"boolean\",\n label: \"Reveal toggle\",\n description:\n \"Show an eye button to toggle between obscured/plain text.\",\n },\n\n defaultRevealed: {\n type: \"boolean\",\n label: \"Default revealed\",\n description: \"Start in the revealed (plain text) state.\",\n },\n\n meterStyle: {\n type: \"anyOf\",\n label: \"Meter style\",\n description:\n 'Built-in meter style: \"simple\" (bar + label) or \"rules\" (bar + checklist).',\n items: [\n { type: \"string\", title: \"Simple\", value: \"simple\" },\n { type: \"string\", title: \"Rules\", value: \"rules\" },\n ],\n },\n\n /**\n * Strength meter config\n * - Runtime accepts: boolean | StrengthOptions\n * - We expose it as an object; if present (even empty), it enables the meter\n * and merges with defaults.\n *\n * NOTE: we intentionally do NOT expose `calc` (function).\n */\n strengthMeter: {\n type: \"object\",\n label: \"Strength meter\",\n description:\n \"Configure the built-in strength meter. If set (even partially), the meter is enabled and defaults are merged.\",\n editable: false,\n fields: {\n labels: {\n type: \"array\",\n label: \"Labels\",\n description: \"Labels for each score bucket (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"string\",\n label: \"Label\",\n description: \"Label for a score bucket.\",\n },\n },\n\n thresholds: {\n type: \"array\",\n label: \"Thresholds\",\n description:\n \"Thresholds for score steps using a 0–100 bar (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"number\",\n label: \"Threshold\",\n description: \"Threshold value (0–100).\",\n minimum: 0,\n maximum: 100,\n },\n },\n\n minScore: {\n type: \"number\",\n label: \"Minimum score\",\n description:\n \"Minimum score required to consider the password acceptable (visual only unless enforced elsewhere).\",\n minimum: 0,\n maximum: 4,\n },\n\n showLabel: {\n type: \"boolean\",\n label: \"Show label\",\n description:\n \"Show the textual label next to/under the bar.\",\n },\n\n display: {\n type: \"anyOf\",\n label: \"Display\",\n description:\n 'Where to render the meter: \"inline\" (compact) or \"block\" (stacked).',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Block\", value: \"block\" },\n ],\n },\n },\n order: [\"display\", \"showLabel\", \"minScore\", \"labels\", \"thresholds\"],\n },\n\n ruleUses: {\n type: \"array\",\n label: \"Rule uses\",\n description:\n 'Selection of rule aliases to apply. Prefix with \"!\" to mark a rule as important.',\n editable: true,\n item: {\n type: \"string\",\n label: \"Rule\",\n description: 'Rule alias (e.g. \"length\" or \"!length\").',\n },\n },\n },\n};\n","// src/react/inputs/registry/entries/slider.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const sliderDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"slider\", // MUST\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: true,\r\n valuePlacement: \"end\",\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n controlVariant: \"none\",\r\n },\r\n\r\n ui: {\r\n // slider supports size + density but its density enum is compact/comfortable/loose\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical padding preset for the slider container.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n min: {\r\n type: \"number\",\r\n label: \"Minimum\",\r\n description: \"Minimum value for the slider.\",\r\n },\r\n\r\n max: {\r\n type: \"number\",\r\n label: \"Maximum\",\r\n description: \"Maximum value for the slider.\",\r\n },\r\n\r\n step: {\r\n type: \"number\",\r\n label: \"Step\",\r\n description: \"Step between values.\",\r\n },\r\n\r\n showValue: {\r\n type: \"boolean\",\r\n label: \"Show value\",\r\n description: \"Show the current value as text next to the slider.\",\r\n },\r\n\r\n valuePlacement: {\r\n type: \"anyOf\",\r\n label: \"Value placement\",\r\n description: 'Where the value label appears (\"start\" or \"end\").',\r\n items: [\r\n { type: \"string\", title: \"Start\", value: \"start\" },\r\n { type: \"string\", title: \"End\", value: \"end\" },\r\n ],\r\n },\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n controlVariant: {\r\n type: \"anyOf\",\r\n label: \"Built-in +/- controls\",\r\n description:\r\n 'Built-in step buttons around the slider (\"none\", \"boxed\", or \"edge\").',\r\n items: [\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n { type: \"string\", title: \"Boxed\", value: \"boxed\" },\r\n { type: \"string\", title: \"Edge\", value: \"edge\" },\r\n ],\r\n },\r\n\r\n controlStep: {\r\n type: \"number\",\r\n label: \"Control step\",\r\n description:\r\n \"Step used when clicking the +/- controls. If unset, falls back to Step.\",\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/toggle.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle\", // MUST\n // optional defaults (the variant already defaults these)\n // size: \"md\",\n // density: \"default\",\n // controlPlacement: \"left\",\n },\n\n ui: {\n // toggle supports the same size union as text\n size: sharedUi.size,\n\n // but density is different from your text density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Row density (vertical padding & gap).\",\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n ],\n },\n\n controlPlacement: {\n type: \"anyOf\",\n label: \"Control placement\",\n description:\n \"Place the switch on the left or right of the state text.\",\n items: [\n { type: \"string\", title: \"Left\", value: \"left\" },\n { type: \"string\", title: \"Right\", value: \"right\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/treeselect.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const treeSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"treeselect\", // MUST\n\n // sensible defaults (optional; component already has these defaults)\n multiple: true,\n searchable: true,\n clearable: true,\n expandAll: false,\n leafOnly: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options + mapping (no className-related stuff)\n ...sharedUi.optionMapping,\n\n // treeselect-specific: selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple nodes can be selected (emits a string array). If disabled, emits a single string.\",\n },\n\n // shared: search UX\n ...sharedUi.searchUx,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description:\n \"Placeholder text for the search input within the tree dropdown.\",\n },\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when search returns no matching nodes.\",\n },\n\n // tree-only UX text (not an InputField placeholder)\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description:\n \"Text shown when there are no options/nodes available.\",\n },\n\n // shared-ish picker toggle (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n },\n\n // tree expansion behavior\n expandAll: {\n type: \"boolean\",\n label: \"Expand all\",\n description:\n \"If enabled, expands all nodes by default when the dropdown opens.\",\n },\n\n defaultExpandedValues: {\n type: \"array\",\n label: \"Default expanded values\",\n description:\n \"List of node values to expand initially (useful when not expanding everything).\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Node value\",\n description: \"The node value to expand on load.\",\n },\n },\n\n leafOnly: {\n type: \"boolean\",\n label: \"Leaf only\",\n description: \"If enabled, only leaf nodes can be selected.\",\n },\n\n // shared layout knobs (default-mode only; we keep them since they're booleans)\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/multi-select.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const multiSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"multi-select\", // MUST\n\n // sensible defaults (optional)\n searchable: true,\n clearable: true,\n autoCap: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options mapping\n ...sharedUi.optionMapping,\n\n // shared: search ux\n ...sharedUi.searchUx,\n\n // common picker knobs (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing all selected values.\",\n },\n\n // multi-select behavior knobs (safe)\n closeOnSelect: {\n type: \"boolean\",\n label: \"Close on select\",\n description:\n \"If enabled, the dropdown closes after selecting an option.\",\n },\n\n maxSelected: {\n type: \"number\",\n label: \"Max selected\",\n description:\n \"Maximum number of selections allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/select.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const selectDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"select\", // MUST\r\n\r\n // sensible defaults (optional)\r\n searchable: true,\r\n clearable: true,\r\n autoCap: false,\r\n\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // common tuning\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n // options + mapping\r\n ...sharedUi.optionMapping,\r\n\r\n // search UX\r\n ...sharedUi.searchUx,\r\n\r\n // picker basics (allowed)\r\n clearable: {\r\n type: \"boolean\",\r\n label: \"Clearable\",\r\n description: \"Allow clearing the current selection.\",\r\n },\r\n\r\n // layout knobs (allowed)\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/radio.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const radioDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"radio\", // MUST\r\n autoCap: false,\r\n },\r\n\r\n ui: {\r\n // common tuning (radio supports these in your palette variants)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n /**\r\n * Options\r\n * Radio supports primitive shorthands + objects, using option* mapping keys.\r\n */\r\n ...sharedUi.optionMapping,\r\n\r\n // small radio-only behavior knobs (safe)\r\n multiple: {\r\n type: \"boolean\",\r\n label: \"Multiple\",\r\n description:\r\n \"If enabled, behaves like a multi-pick radio group (emits a string array). Leave off for classic single-choice radio.\",\r\n },\r\n\r\n // Note: no placeholder (InputField prop), no className props, no render/callback props.\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/checkbox.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const checkboxDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"checkbox\", // MUST\r\n\r\n single: false,\r\n tristate: false,\r\n layout: \"list\",\r\n columns: 2,\r\n itemGapPx: 8,\r\n size: \"md\",\r\n density: \"comfortable\",\r\n autoCap: false,\r\n },\r\n adapter: {\r\n\r\n },\r\n\r\n ui: {\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical density of each option row.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n // group vs single behavior\r\n single: {\r\n type: \"boolean\",\r\n label: \"Single\",\r\n description:\r\n \"If enabled, behaves like a single checkbox (boolean). Otherwise renders a group (array).\",\r\n },\r\n\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state\",\r\n description:\r\n 'Enable tri-state behaviour (supports an internal \"none\" state).',\r\n },\r\n\r\n // layout\r\n layout: {\r\n type: \"anyOf\",\r\n label: \"Layout\",\r\n description: \"Arrange options as a vertical list or grid.\",\r\n items: [\r\n { type: \"string\", title: \"List\", value: \"list\" },\r\n { type: \"string\", title: \"Grid\", value: \"grid\" },\r\n ],\r\n },\r\n\r\n columns: {\r\n type: \"number\",\r\n label: \"Columns\",\r\n description: \"Number of columns when layout is grid.\",\r\n minimum: 1,\r\n },\r\n\r\n itemGapPx: {\r\n type: \"number\",\r\n label: \"Item gap (px)\",\r\n description: \"Gap between option rows/items in pixels.\",\r\n minimum: 0,\r\n },\r\n\r\n autoCap: {\r\n type: \"boolean\",\r\n label: \"Auto capitalise\",\r\n description:\r\n \"Capitalise the first letter of labels (only when label resolves to a string).\",\r\n },\r\n\r\n // options (primitive arrays or object arrays)\r\n options: {\r\n type: \"array\",\r\n label: \"Options\",\r\n description:\r\n \"Checkbox options. Can be primitives (string/number/boolean) or objects (label/value/description/disabled/tristate).\",\r\n editable: true,\r\n item: {\r\n type: \"object\",\r\n label: \"Option\",\r\n description: \"An option item for group mode.\",\r\n editable: true,\r\n fields: {\r\n value: {\r\n type: \"string\",\r\n label: \"Value\",\r\n description: \"Unique option value (string).\",\r\n },\r\n label: {\r\n type: \"string\",\r\n label: \"Label\",\r\n description: \"Display label for the option.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n label: \"Description\",\r\n description: \"Optional helper text under the label.\",\r\n },\r\n disabled: {\r\n type: \"boolean\",\r\n label: \"Disabled\",\r\n description: \"Disable this option.\",\r\n },\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state override\",\r\n description:\r\n \"Override tri-state behaviour for this option (if unset, uses variant tristate).\",\r\n },\r\n },\r\n order: [\r\n \"value\",\r\n \"label\",\r\n \"description\",\r\n \"disabled\",\r\n \"tristate\",\r\n ],\r\n } as any,\r\n },\r\n\r\n // mapping keys (for custom item shapes)\r\n optionValue: {\r\n type: \"string\",\r\n label: \"Option value key\",\r\n description:\r\n \"Property name to read the option value from when using custom option objects.\",\r\n },\r\n\r\n optionLabel: {\r\n type: \"string\",\r\n label: \"Option label key\",\r\n description:\r\n \"Property name to read the option label from when using custom option objects.\",\r\n },\r\n\r\n // intentionally excluded:\r\n // - items (alias to options; keeping one is enough for builder)\r\n // - mappers (functions)\r\n // - renderOption (function)\r\n // - singleLabel/singleDescription (ReactNode)\r\n // - all *ClassName props (not allowed)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/chips.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const chipsDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"chips\", // MUST\n\n // sensible defaults (these match the variant defaults)\n addOnEnter: true,\n addOnTab: true,\n addOnBlur: true,\n allowDuplicates: false,\n backspaceRemovesLast: true,\n clearable: false,\n textareaMode: false,\n placement: \"inline\",\n },\n\n ui: {\n // chips \"also supports most ShadcnTextVariantProps\" (size/density/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // NOTE: placeholder is an InputField prop in your system — exclude it here.\n\n separators: {\n type: \"array\",\n label: \"Separators\",\n description:\n 'Separators used to split raw input into chips (strings only in builder UI). Runtime default: [\",\", \";\"].',\n editable: true,\n item: {\n type: \"string\",\n label: \"Separator\",\n description: 'A string separator (e.g. \",\" or \";\").',\n },\n },\n\n addOnEnter: {\n type: \"boolean\",\n label: \"Add on Enter\",\n description: \"Commit chips when the user presses Enter.\",\n },\n\n addOnTab: {\n type: \"boolean\",\n label: \"Add on Tab\",\n description: \"Commit chips when the user presses Tab.\",\n },\n\n addOnBlur: {\n type: \"boolean\",\n label: \"Add on blur\",\n description: \"Commit chips when the input loses focus.\",\n },\n\n allowDuplicates: {\n type: \"boolean\",\n label: \"Allow duplicates\",\n description: \"If disabled, duplicate chips are ignored.\",\n },\n\n maxChips: {\n type: \"number\",\n label: \"Max chips\",\n description:\n \"Maximum number of chips allowed. Leave unset for unlimited.\",\n minimum: 1,\n },\n\n backspaceRemovesLast: {\n type: \"boolean\",\n label: \"Backspace removes last\",\n description:\n \"If enabled, Backspace on an empty input removes the last chip.\",\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear-all button.\",\n },\n\n maxVisibleChips: {\n type: \"number\",\n label: \"Max visible chips\",\n description:\n 'Maximum number of chips to render before summarizing the rest as \"+N more\".',\n minimum: 1,\n },\n\n maxChipChars: {\n type: \"number\",\n label: \"Max chip chars\",\n description:\n \"Soft cap for chip display label length (UI-only; value is not truncated).\",\n minimum: 1,\n },\n\n maxChipWidth: {\n type: \"string\",\n label: \"Max chip width\",\n description:\n 'Soft cap for chip label width (CSS value, e.g. \"160px\" or \"12rem\").',\n },\n\n textareaMode: {\n type: \"boolean\",\n label: \"Textarea mode\",\n description:\n \"Use a textarea entry control instead of a single-line input.\",\n },\n\n placement: {\n type: \"anyOf\",\n label: \"Placement\",\n description:\n \"Where chips are rendered relative to the entry control.\",\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Below\", value: \"below\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/color.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const colorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"color\", // MUST\r\n\r\n // sensible defaults (matches variant defaults)\r\n showPreview: true,\r\n showPickerToggle: true,\r\n previewSize: 18,\r\n\r\n // forwarded from text UI\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // color inherits most text UI props (but we still only expose the shared-safe ones)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n ...sharedUi.padding,\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n showPreview: {\r\n type: \"boolean\",\r\n label: \"Show preview\",\r\n description: \"Show the color swatch preview control.\",\r\n },\r\n\r\n showPickerToggle: {\r\n type: \"boolean\",\r\n label: \"Show picker toggle\",\r\n description: \"Show the picker toggle control/icon.\",\r\n },\r\n\r\n previewSize: {\r\n type: \"number\",\r\n label: \"Preview size\",\r\n description: \"Size of the color swatch in pixels.\",\r\n minimum: 8,\r\n maximum: 64,\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/date.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const dateDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"date\", // MUST\n\n // sensible defaults (matches the variant defaults shown in code)\n mode: \"single\",\n kind: \"date\",\n clearable: true,\n\n // text-ui bits that date supports\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared text-like tuning (date reuses ShadcnTextVariantProps minus value/onValue/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Single date input or a date range picker.\",\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Range\", value: \"range\" },\n ],\n },\n\n kind: {\n type: \"anyOf\",\n label: \"Kind\",\n description:\n \"Logical temporal kind. Controls default mask + formatting/parsing.\",\n items: [\n { type: \"string\", title: \"Date\", value: \"date\" },\n { type: \"string\", title: \"Date & time\", value: \"datetime\" },\n { type: \"string\", title: \"Time\", value: \"time\" },\n { type: \"string\", title: \"Hour\", value: \"hour\" },\n { type: \"string\", title: \"Month/Year\", value: \"monthYear\" },\n { type: \"string\", title: \"Year\", value: \"year\" },\n ],\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear control to remove the selected value.\",\n },\n\n showCalendar: {\n type: \"boolean\",\n label: \"Show calendar\",\n description:\n \"Render the calendar popover. Defaults to true for date/datetime, false for time-only kinds.\",\n },\n\n // Formatting / display\n formatSingle: {\n type: \"string\",\n label: \"Single format\",\n description:\n 'Display pattern for single values (e.g. \"yyyy-MM-dd\", \"yyyy-MM-dd HH:mm\", \"HH:mm\").',\n },\n\n // NOTE: DateVariantProps allows formatRange as function too; builder exposes string only.\n formatRange: {\n type: \"string\",\n label: \"Range format\",\n description:\n \"Pattern applied to both ends of the range (string form only).\",\n },\n\n rangeSeparator: {\n type: \"string\",\n label: \"Range separator\",\n description:\n 'Separator between from/to in range display (default \" – \").',\n },\n\n stayOpenOnSelect: {\n type: \"boolean\",\n label: \"Stay open on select\",\n description:\n \"Keep the calendar open after selection (range stays open until both ends are picked).\",\n },\n\n inputMask: {\n type: \"string\",\n label: \"Input mask\",\n description:\n \"Optional explicit mask for typed input. Uses mask tokens: 9=digit, a=letter, *=alphanumeric.\",\n },\n\n // Intentionally excluded (non-builder-safe / non-serializable):\n // - placeholder (ReactNode)\n // - minDate/maxDate (Date objects)\n // - disabledDays (complex Calendar disabled type)\n // - open/onOpenChange (controlled popover)\n },\n};\n","// src/react/inputs/registry/entries/keyvalue.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const keyValueDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"keyvalue\", // MUST\n\n min: 0,\n max: Infinity,\n\n // legacy (optional)\n // minVisible: undefined,\n // maxVisible: undefined,\n\n showValue: false,\n\n // text labels (strings are fine; variant accepts ReactNode)\n dialogTitle: \"Edit Item\",\n keyLabel: \"Key\",\n valueLabel: \"Value\",\n submitLabel: \"Save Changes\",\n emptyLabel: \"No items added\",\n },\n\n ui: {\n // keyvalue has its own density union (compact/comfortable/loose)\n size: sharedUi.size,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Vertical spacing preset for chips and controls.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n min: {\n type: \"number\",\n label: \"Min items\",\n description:\n \"Minimum number of entries allowed (prevents deletion below this).\",\n minimum: 0,\n },\n\n max: {\n type: \"number\",\n label: \"Max items\",\n description:\n \"Maximum number of entries allowed (prevents adding above this).\",\n minimum: 0,\n },\n\n // legacy compatibility knobs\n minVisible: {\n type: \"number\",\n label: \"Min visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n maxVisible: {\n type: \"number\",\n label: \"Max visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n showValue: {\n type: \"boolean\",\n label: \"Show value inline\",\n description:\n 'If enabled, inline chips show \"key : value\". In the dropdown, values are still available via info.',\n },\n\n dialogTitle: {\n type: \"string\",\n label: \"Dialog title\",\n description: \"Title shown at the top of the edit dialog.\",\n },\n\n keyLabel: {\n type: \"string\",\n label: \"Key label\",\n description: \"Label for the key input in the dialog.\",\n },\n\n valueLabel: {\n type: \"string\",\n label: \"Value label\",\n description: \"Label for the value input in the dialog.\",\n },\n\n submitLabel: {\n type: \"string\",\n label: \"Submit label\",\n description: \"Text for the dialog submit button.\",\n },\n\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description: \"Text shown when there are no entries.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop; injected by registry helper)\n // - moreLabel (function)\n // - className/chipsClassName/chipClassName\n // - renderChip (render function)\n },\n};\n","// src/react/inputs/registry/entries/editor.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const editorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"editor\", // MUST\r\n\r\n height: \"400px\",\r\n previewStyle: \"vertical\",\r\n editType: \"wysiwyg\",\r\n useCommandShortcut: true,\r\n\r\n // stored value format\r\n format: \"html\",\r\n\r\n // toolbar mode (we only support the safe enum values here)\r\n toolbar: \"default\",\r\n\r\n pastePlainText: false,\r\n },\r\n\r\n ui: {\r\n // editor supports size + density from VariantBaseProps\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n height: {\r\n type: \"string\",\r\n label: \"Height\",\r\n description: 'Editor height (CSS value, e.g. \"400px\", \"60vh\").',\r\n },\r\n\r\n previewStyle: {\r\n type: \"anyOf\",\r\n label: \"Preview style\",\r\n description: \"How the preview is displayed (for markdown mode).\",\r\n items: [\r\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\r\n { type: \"string\", title: \"Tab\", value: \"tab\" },\r\n ],\r\n },\r\n\r\n editType: {\r\n type: \"anyOf\",\r\n label: \"Edit mode\",\r\n description: \"Initial editor mode.\",\r\n items: [\r\n { type: \"string\", title: \"WYSIWYG\", value: \"wysiwyg\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n useCommandShortcut: {\r\n type: \"boolean\",\r\n label: \"Command shortcuts\",\r\n description: \"Enable editor keyboard shortcuts.\",\r\n },\r\n\r\n format: {\r\n type: \"anyOf\",\r\n label: \"Stored format\",\r\n description: \"Which format is stored in the form value.\",\r\n items: [\r\n { type: \"string\", title: \"HTML\", value: \"html\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n toolbar: {\r\n type: \"anyOf\",\r\n label: \"Toolbar\",\r\n description:\r\n 'Toolbar mode. \"default\" uses built-in tools; \"none\" hides tools and mode switch.',\r\n items: [\r\n { type: \"string\", title: \"Default\", value: \"default\" },\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n ],\r\n },\r\n\r\n pastePlainText: {\r\n type: \"boolean\",\r\n label: \"Paste as plain text\",\r\n description: \"If enabled, paste is inserted as plain text only.\",\r\n },\r\n\r\n // excluded on purpose:\r\n // - placeholder (InputField prop; injected by registry helper)\r\n // - className (not allowed)\r\n // - toolbar as array (ToastToolbarItem[][] not builder-safe)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/lister.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\nimport type { Ui } from \"@/schema\";\n\nconst listerUi = {\n // ─────────────────────────────────────────────\n // Selection behaviour\n // ─────────────────────────────────────────────\n mode: {\n type: \"anyOf\",\n label: \"Selection mode\",\n description: 'Whether the lister selects one value (\"single\") or many (\"multiple\").',\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Multiple\", value: \"multiple\" },\n ],\n } satisfies Ui,\n\n confirm: {\n type: \"boolean\",\n label: \"Confirm\",\n description:\n 'When enabled (single-mode only), require confirmation before committing selection.',\n } satisfies Ui,\n\n remoteDebounceMs: {\n type: \"number\",\n label: \"Remote debounce (ms)\",\n description: \"Debounce duration for remote search requests.\",\n minimum: 0,\n } satisfies Ui,\n\n // permissions?: string[] (primitive array)\n permissions: {\n type: \"array\",\n label: \"Permissions\",\n description: \"Optional permission keys passed to the lister provider/open UI.\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Permission\",\n description: \"One permission key.\",\n } satisfies Ui,\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Inline source (when not using a base `def`)\n // ─────────────────────────────────────────────\n endpoint: {\n type: \"string\",\n label: \"Endpoint\",\n description: \"Inline endpoint for fetching options (standalone mode).\",\n } satisfies Ui,\n\n method: {\n type: \"anyOf\",\n label: \"HTTP method\",\n description: \"HTTP method for inline endpoint requests.\",\n items: [\n { type: \"string\", title: \"GET\", value: \"GET\" },\n { type: \"string\", title: \"POST\", value: \"POST\" },\n ],\n } satisfies Ui,\n\n selector: {\n type: \"string\",\n label: \"Selector\",\n description:\n 'Selector key/path for extracting the list from a response (e.g. \"data\").',\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Mapping (ctx-aware in code, but schema-configurable as keys)\n // ─────────────────────────────────────────────\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value/id from each raw option object.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the display label from each raw option object.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description: \"Key to read the description line from each raw option object.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description: \"Key to read an icon value from each raw option object.\",\n } satisfies Ui,\n\n optionGroup: {\n type: \"string\",\n label: \"Option group key\",\n description: \"Key used to group options (if grouping is supported by the open UI).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Search spec / open options (primitive-friendly subset)\n // ─────────────────────────────────────────────\n title: {\n type: \"string\",\n label: \"Title\",\n description: \"Title shown on the open/picker UI.\",\n } satisfies Ui,\n\n searchMode: {\n type: \"string\",\n label: \"Search mode\",\n description: \"Search behaviour/mode for the open UI (provider-defined).\",\n } satisfies Ui,\n\n initialQuery: {\n type: \"string\",\n label: \"Initial query\",\n description: \"Initial query state for the open UI.\",\n } satisfies Ui,\n\n showRefresh: {\n type: \"boolean\",\n label: \"Show refresh\",\n description: \"Show refresh button in the open UI.\",\n } satisfies Ui,\n\n refreshMode: {\n type: \"string\",\n label: \"Refresh mode\",\n description: \"Refresh behaviour/mode (provider-defined).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Trigger display (primitive subset)\n // ─────────────────────────────────────────────\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n maxDisplayItems: {\n type: \"number\",\n label: \"Max display items\",\n description:\n \"Maximum number of selected items to render in the closed trigger summary.\",\n minimum: 0,\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n\n // IMPORTANT: trigger style is documented in README as `mode`,\n // but `mode` is already selection mode in the real prop surface.\n triggerMode: {\n type: \"anyOf\",\n label: \"Trigger style\",\n description: 'Trigger style: \"default\" (input-like) or \"button\" (custom trigger).',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Button\", value: \"button\" },\n ],\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Shared layout knobs you *do* want exposed\n // ─────────────────────────────────────────────\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n size: sharedUi.size,\n density: sharedUi.density,\n padding: {\n type: \"object\",\n label: \"Padding\",\n description: \"Padding overrides.\",\n editable: false,\n fields: {\n px: sharedUi.padding.px,\n py: sharedUi.padding.py,\n ps: sharedUi.padding.ps,\n pe: sharedUi.padding.pe,\n pb: sharedUi.padding.pb,\n },\n } satisfies Ui,\n} as const;\n\nexport const listerDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: { variant: \"lister\" },\n ui: listerUi,\n};","// src/react/inputs/registry/entries/file.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const fileDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"file\", // MUST\n\n // sensible defaults (optional)\n multiple: false,\n mergeMode: \"append\",\n showDropArea: false,\n showCheckboxes: true,\n custom: false,\n // placeholder exists on the variant, but per your rule we DON'T declare it here\n },\n\n ui: {\n size: sharedUi.size,\n\n // file has its own density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Spacing preset for the trigger + list UI.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description: \"Allow selecting multiple files.\",\n },\n\n accept: {\n type: \"array\",\n label: \"Accepted types\",\n description:\n 'Accepted MIME types / extensions (e.g. \"image/*\", \".png\", \"application/pdf\").',\n editable: true,\n item: {\n type: \"string\",\n label: \"Type\",\n description: \"A MIME type or extension.\",\n },\n },\n\n maxFiles: {\n type: \"number\",\n label: \"Max files\",\n description:\n \"Maximum number of files allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n maxTotalSize: {\n type: \"number\",\n label: \"Max total size (bytes)\",\n description:\n \"Maximum total size across all selected files in bytes (leave unset for unlimited).\",\n minimum: 1,\n },\n\n mergeMode: {\n type: \"anyOf\",\n label: \"Merge mode\",\n description:\n 'How new picks are merged into the current selection (\"append\" or \"replace\").',\n items: [\n { type: \"string\", title: \"Append\", value: \"append\" },\n { type: \"string\", title: \"Replace\", value: \"replace\" },\n ],\n },\n\n showDropArea: {\n type: \"boolean\",\n label: \"Show drop area\",\n description: \"Show a drag-and-drop area inside the picker.\",\n },\n\n // these are ReactNode in the variant, but strings are safe + useful in builder\n dropTitle: {\n type: \"string\",\n label: \"Drop title\",\n description: \"Title text shown in the drop area.\",\n },\n\n dropDescription: {\n type: \"string\",\n label: \"Drop description\",\n description: \"Supporting text shown in the drop area.\",\n },\n\n custom: {\n type: \"boolean\",\n label: \"Custom loader\",\n description:\n \"Enable a host-provided custom loader (host must wire customLoader at runtime).\",\n },\n\n showCheckboxes: {\n type: \"boolean\",\n label: \"Show checkboxes\",\n description:\n \"Show selection checkboxes for file rows inside the picker.\",\n },\n\n asRaw: {\n type: \"boolean\",\n label: \"As raw (legacy)\",\n description:\n \"Legacy compatibility flag. The submitted value is still File|string; raw items are available via change detail meta.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop, injected by your registry helper)\n // - dropIcon (ReactNode)\n // - renderDropArea / renderFileItem (functions)\n // - customLoader (function)\n // - formatFileName / formatFileSize (functions)\n // - all *ClassName props (not allowed)\n // - button mode trigger props (ReactNode/functions)\n },\n};\n","// src/react/inputs/registry/entries/index.ts\nimport type {InputDescriptor, Registry} from \"@/react\";\n\nimport {textDescriptor} from \"./text\";\nimport {textareaDescriptor} from \"./textarea\";\nimport {phoneDescriptor} from \"./phone\";\nimport {toggleGroupDescriptor} from \"./toggle-group\";\nimport {numberDescriptor} from \"./number\";\nimport {passwordDescriptor} from \"./password\";\nimport {sliderDescriptor} from \"./slider\";\nimport {toggleDescriptor} from \"./toggle\";\nimport {treeSelectDescriptor} from \"./treeselect\";\nimport {multiSelectDescriptor} from \"./multiselect\";\nimport {selectDescriptor} from \"./select\";\nimport {radioDescriptor} from \"./radio\";\nimport {checkboxDescriptor} from \"./checkbox\";\nimport {chipsDescriptor} from \"./chips\";\nimport {colorDescriptor} from \"./color\";\nimport {dateDescriptor} from \"./date\";\nimport {keyValueDescriptor} from \"./keyvalue\";\nimport {editorDescriptor} from \"./editor\";\nimport {listerDescriptor} from \"./lister\";\nimport {fileDescriptor} from \"./file\";\nimport {Field, FieldOption, ServicePropsNotice, Ui} from \"@/schema\";\n\n/**\n * InputField-level UI props (injected for every descriptor at registration time).\n * NOTE: keep this list tight—only props that truly belong to InputField itself.\n */\nconst inputFieldUi: Record<string, Ui> = {\n // --- Chrome / helper text (builder-friendly) ---\n sublabel: {\n type: \"string\",\n label: \"Sublabel\",\n description:\n \"Secondary label text shown near the main label (if supported).\",\n },\n\n description: {\n type: \"string\",\n label: \"Description\",\n description: \"Helper description shown under the label.\",\n },\n\n helpText: {\n type: \"string\",\n label: \"Help text\",\n description: \"Additional helper text shown in the help slot.\",\n },\n\n // --- Placement hints (layout-only; host decides exact behavior) ---\n labelPlacement: {\n type: \"string\",\n label: \"Label placement\",\n description: \"Layout hint for where the label is rendered.\",\n } as Ui,\n\n sublabelPlacement: {\n type: \"string\",\n label: \"Sublabel placement\",\n description: \"Layout hint for where the sublabel is rendered.\",\n } as Ui,\n\n descriptionPlacement: {\n type: \"string\",\n label: \"Description placement\",\n description: \"Layout hint for where the description is rendered.\",\n } as Ui,\n\n helpTextPlacement: {\n type: \"string\",\n label: \"Help text placement\",\n description: \"Layout hint for where the help text is rendered.\",\n } as Ui,\n\n tagPlacement: {\n type: \"string\",\n label: \"Tag placement\",\n description: \"Layout hint for where tags are rendered.\",\n } as Ui,\n\n // --- Tags (builder-safe subset; host maps to FieldTag) ---\n tags: {\n type: \"array\",\n label: \"Tags\",\n description:\n \"Small tag badges shown near the label. Builder-safe subset (label/color/bgColor).\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Tag\",\n description: \"A label tag.\",\n editable: true,\n fields: {\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Tag text.\",\n },\n color: {\n type: \"string\",\n label: \"Text color\",\n description: 'CSS color value (e.g. \"#fff\" or \"rgb(...)\").',\n },\n bgColor: {\n type: \"string\",\n label: \"Background color\",\n description: 'CSS color value (e.g. \"#111\").',\n },\n },\n order: [\"label\", \"color\", \"bgColor\"],\n } as Ui,\n } satisfies Ui,\n\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable user interaction with the field.\",\n },\n\n readOnly: {\n type: \"boolean\",\n label: \"Read-only\",\n description: \"Prevent edits while still allowing focus/selection.\",\n },\n\n // --- Layout flags ---\n inline: {\n type: \"boolean\",\n label: \"Inline\",\n description:\n \"Render label + input in an inline row layout (if supported).\",\n },\n\n fullWidth: {\n type: \"boolean\",\n label: \"Full width\",\n description:\n \"Stretch the field to fill its container width (if supported).\",\n },\n};\n\nfunction withInputFieldUi(desc: InputDescriptor): InputDescriptor {\n return {\n ...desc,\n adapter: {\n getValue(e: any) {\n return e.value;\n },\n valueProp: \"value\",\n changeProp: \"onChange\",\n getInputPropsFromField({ field, props }) {\n const severityPillClassMap = {\n info: \"border-blue-200 bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-200\",\n warning:\n \"border-amber-200 bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200\",\n error: \"border-red-200 bg-red-50 text-red-700 ring-1 ring-inset ring-red-200\",\n } as const;\n\n const pillBaseClassName =\n \"inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\";\n\n const toTagPill = (tag: any) => ({\n label: tag.title,\n bgColor: tag.color,\n className: `${pillBaseClassName} ${severityPillClassMap[tag.severity as keyof typeof severityPillClassMap] ?? severityPillClassMap.info}`,\n });\n\n const matchesNotice = (\n target: Field | FieldOption,\n notice: ServicePropsNotice,\n ) => {\n const isNodeTargetMatch =\n notice.target.scope === \"node\" &&\n notice.target.node_id === target.id;\n const isLegacyGlobalIdMatch =\n notice.target.scope === \"global\" &&\n notice.id === target.id;\n const isServiceMatch =\n !!target.service_id &&\n String(target.service_id) === notice.id;\n\n return (\n isNodeTargetMatch ||\n isLegacyGlobalIdMatch ||\n isServiceMatch\n );\n };\n\n const notices = props.notices ?? [];\n\n const fieldNotices = notices.filter((notice) =>\n matchesNotice(field, notice),\n );\n\n return {\n label: field.label,\n tags: fieldNotices.map(toTagPill),\n required: field.required,\n\n ...(field.options?.length\n ? {\n options: field.options.map((item) => {\n // @ts-ignore\n const optionNotices = notices.filter(\n (notice) => matchesNotice(item, notice),\n );\n\n return {\n ...item,\n tags: optionNotices.map(toTagPill),\n };\n }),\n }\n : {}),\n };\n },\n getSelectedOptions(next, currentt, ctx) {\n return ((next as any)?.detail?.selectedOptions ?? [])?.map(\n (item: any) => item.id,\n );\n },\n\n isActive(stored, ctx) {\n return Boolean(stored);\n },\n },\n ui: {\n ...inputFieldUi,\n ...(desc.ui ?? {}),\n },\n };\n}\n\nfunction variantOf(desc: InputDescriptor): string {\n const v = (desc.defaultProps as any)?.variant;\n if (!v || typeof v !== \"string\") {\n throw new Error(\n `[inputs] Descriptor is missing defaultProps.variant: ${String(v)}`,\n );\n }\n return v;\n}\n\n/**\n * Register all built-in entries.\n * - You said \"variant is the only thing necessary\", so we treat kind as a constant.\n */\nexport function registerEntries(registry: Registry): void {\n const entries: InputDescriptor[] = [\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n ];\n\n registry.registerMany(\n entries.map((descriptor) => {\n const finalDescriptor = withInputFieldUi(descriptor);\n const variant = variantOf(finalDescriptor);\n\n return {\n kind: variant,\n descriptor: finalDescriptor,\n };\n }),\n );\n}\n\n// re-export entries (optional convenience)\nexport {\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n};\n","import React from \"react\";\r\nimport type { ServiceIdRef } from \"@/schema\";\r\nimport { useFallbackEditorContext } from \"./FallbackEditorProvider\";\r\n\r\nexport function useFallbackEditor() {\r\n return useFallbackEditorContext();\r\n}\r\n\r\nexport function useActiveFallbackRegistrations() {\r\n const { activeServiceId, get, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n if (activeServiceId === undefined || activeServiceId === null)\r\n return [];\r\n return get(activeServiceId);\r\n }, [activeServiceId, get, version]);\r\n}\r\n\r\nexport function usePrimaryServiceList() {\r\n const { primaryServices, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n return Object.values(primaryServices ?? {}) as Array<{\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n }>;\r\n }, [primaryServices, version]);\r\n}\r\n\r\nexport function useEligibleServiceList() {\r\n const { eligibleServices, version } = useFallbackEditorContext();\r\n\r\n return React.useMemo(() => {\r\n return Object.values(eligibleServices ?? {}) as Array<{\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n }>;\r\n }, [eligibleServices, version]);\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport type { OrderSnapshot } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport {\r\n createFallbackEditor,\r\n type FallbackEditor,\r\n} from \"@/core/fallback-editor\";\r\n\r\ntype TabKey = \"registrations\" | \"settings\";\r\n\r\nexport type FallbackEditorProviderProps = {\r\n children: React.ReactNode;\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices?: DgpServiceMap;\r\n eligibleServices?: DgpServiceMap;\r\n\r\n settings?: FallbackSettings;\r\n initialServiceId?: ServiceIdRef;\r\n initialTab?: TabKey;\r\n\r\n onSettingsChange?: (\r\n next: FallbackSettings,\r\n ) => Promise<FallbackSettings> | FallbackSettings;\r\n\r\n onSave?: (\r\n next: ServiceProps[\"fallbacks\"],\r\n ) =>\r\n | Promise<ServiceProps[\"fallbacks\"] | void>\r\n | ServiceProps[\"fallbacks\"]\r\n | void;\r\n\r\n onValidate?: (next: ServiceProps[\"fallbacks\"]) => Promise<void> | void;\r\n\r\n onReset?: () => Promise<void> | void;\r\n};\r\n\r\ntype FallbackEditorContextValue = {\r\n editor: FallbackEditor;\r\n version: number;\r\n\r\n serviceProps?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices: DgpServiceMap;\r\n eligibleServices: DgpServiceMap;\r\n\r\n activeServiceId?: ServiceIdRef;\r\n setActiveServiceId: React.Dispatch<\r\n React.SetStateAction<ServiceIdRef | undefined>\r\n >;\r\n\r\n activeTab: TabKey;\r\n setActiveTab: React.Dispatch<React.SetStateAction<TabKey>>;\r\n\r\n state: ReturnType<FallbackEditor[\"state\"]>;\r\n value: ReturnType<FallbackEditor[\"value\"]>;\r\n\r\n settings: FallbackSettings;\r\n settingsSaving: boolean;\r\n\r\n headerSaving: boolean;\r\n headerValidating: boolean;\r\n headerResetting: boolean;\r\n\r\n saveSettings: (next: FallbackSettings) => Promise<FallbackSettings>;\r\n saveFallbacks: () => Promise<ServiceProps[\"fallbacks\"] | void>;\r\n validateFallbacks: () => Promise<void>;\r\n resetEditor: () => Promise<void>;\r\n\r\n reset: () => void;\r\n\r\n get: FallbackEditor[\"get\"];\r\n getScope: FallbackEditor[\"getScope\"];\r\n check: FallbackEditor[\"check\"];\r\n eligible: FallbackEditor[\"eligible\"];\r\n\r\n add: FallbackEditor[\"add\"];\r\n addMany: FallbackEditor[\"addMany\"];\r\n remove: FallbackEditor[\"remove\"];\r\n replace: FallbackEditor[\"replace\"];\r\n clear: FallbackEditor[\"clear\"];\r\n};\r\n\r\nconst FallbackEditorContext =\r\n React.createContext<FallbackEditorContextValue | null>(null);\r\n\r\nexport function FallbackEditorProvider({\r\n children,\r\n fallbacks,\r\n props,\r\n snapshot,\r\n primaryServices,\r\n eligibleServices,\r\n settings: initialSettings,\r\n initialServiceId,\r\n initialTab = \"registrations\",\r\n onSettingsChange,\r\n onSave,\r\n onValidate,\r\n onReset,\r\n}: FallbackEditorProviderProps) {\r\n const [settings, setSettings] = React.useState<FallbackSettings>(\r\n initialSettings ?? {},\r\n );\r\n const [settingsSaving, setSettingsSaving] = React.useState(false);\r\n\r\n const [headerSaving, setHeaderSaving] = React.useState(false);\r\n const [headerValidating, setHeaderValidating] = React.useState(false);\r\n const [headerResetting, setHeaderResetting] = React.useState(false);\r\n\r\n const [version, setVersion] = React.useState(0);\r\n const [activeServiceId, setActiveServiceId] = React.useState<\r\n ServiceIdRef | undefined\r\n >(initialServiceId);\r\n const [activeTab, setActiveTab] = React.useState<TabKey>(initialTab);\r\n\r\n React.useEffect(() => {\r\n setSettings(initialSettings ?? {});\r\n }, [initialSettings]);\r\n\r\n const resolvedPrimaryServices = React.useMemo<DgpServiceMap>(\r\n () => primaryServices ?? {},\r\n [primaryServices],\r\n );\r\n\r\n const resolvedEligibleServices = React.useMemo<DgpServiceMap>(\r\n () => eligibleServices ?? primaryServices ?? {},\r\n [eligibleServices, primaryServices],\r\n );\r\n\r\n const editorRef = React.useRef<FallbackEditor | null>(null);\r\n\r\n const buildEditor = React.useCallback(\r\n (next?: {\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n settings?: FallbackSettings;\r\n services?: DgpServiceMap;\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n }) => {\r\n const currentValue = editorRef.current?.value();\r\n\r\n editorRef.current = createFallbackEditor({\r\n fallbacks: next?.fallbacks ?? currentValue ?? fallbacks ?? {},\r\n props: next?.props ?? props,\r\n snapshot: next?.snapshot ?? snapshot,\r\n services: next?.services ?? resolvedEligibleServices,\r\n settings: next?.settings ?? settings,\r\n });\r\n\r\n setVersion((v) => v + 1);\r\n },\r\n [fallbacks, props, snapshot, resolvedEligibleServices, settings],\r\n );\r\n\r\n if (!editorRef.current) {\r\n editorRef.current = createFallbackEditor({\r\n fallbacks: fallbacks ?? {},\r\n props,\r\n snapshot,\r\n services: resolvedEligibleServices,\r\n settings,\r\n });\r\n }\r\n\r\n React.useEffect(() => {\r\n buildEditor({\r\n fallbacks: fallbacks ?? {},\r\n props,\r\n snapshot,\r\n services: resolvedEligibleServices,\r\n settings,\r\n });\r\n }, [fallbacks, props, snapshot, resolvedEligibleServices, buildEditor]);\r\n\r\n const editor = editorRef.current;\r\n\r\n const bump = React.useCallback(() => {\r\n setVersion((v) => v + 1);\r\n }, []);\r\n\r\n const syncAfterMutation = React.useCallback(() => {\r\n bump();\r\n }, [bump]);\r\n\r\n const reset = React.useCallback(() => {\r\n editor.reset();\r\n syncAfterMutation();\r\n }, [editor, syncAfterMutation]);\r\n\r\n const add = React.useCallback<FallbackEditor[\"add\"]>(\r\n (context, candidate, options) => {\r\n const next = editor.add(context, candidate, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const addMany = React.useCallback<FallbackEditor[\"addMany\"]>(\r\n (context, candidates, options) => {\r\n const next = editor.addMany(context, candidates, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const remove = React.useCallback<FallbackEditor[\"remove\"]>(\r\n (context, candidate) => {\r\n const next = editor.remove(context, candidate);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const replace = React.useCallback<FallbackEditor[\"replace\"]>(\r\n (context, candidates, options) => {\r\n const next = editor.replace(context, candidates, options);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const clear = React.useCallback<FallbackEditor[\"clear\"]>(\r\n (context) => {\r\n const next = editor.clear(context);\r\n syncAfterMutation();\r\n return next;\r\n },\r\n [editor, syncAfterMutation],\r\n );\r\n\r\n const saveSettings = React.useCallback(\r\n async (next: FallbackSettings) => {\r\n setSettingsSaving(true);\r\n try {\r\n const resolved = onSettingsChange\r\n ? await onSettingsChange(next)\r\n : next;\r\n\r\n const finalSettings = resolved ?? next;\r\n setSettings(finalSettings);\r\n\r\n buildEditor({\r\n settings: finalSettings,\r\n fallbacks: editor.value(),\r\n });\r\n\r\n return finalSettings;\r\n } finally {\r\n setSettingsSaving(false);\r\n }\r\n },\r\n [onSettingsChange, buildEditor, editor],\r\n );\r\n\r\n const saveFallbacks = React.useCallback(async () => {\r\n const next = editor.value();\r\n\r\n setHeaderSaving(true);\r\n try {\r\n const resolved = onSave ? await onSave(next) : next;\r\n if (resolved) {\r\n buildEditor({ fallbacks: resolved });\r\n }\r\n return resolved;\r\n } finally {\r\n setHeaderSaving(false);\r\n }\r\n }, [editor, onSave, buildEditor]);\r\n\r\n const validateFallbacks = React.useCallback(async () => {\r\n const next = editor.value();\r\n\r\n setHeaderValidating(true);\r\n try {\r\n if (onValidate) {\r\n await onValidate(next);\r\n }\r\n } finally {\r\n setHeaderValidating(false);\r\n }\r\n }, [editor, onValidate]);\r\n\r\n const resetEditor = React.useCallback(async () => {\r\n setHeaderResetting(true);\r\n try {\r\n editor.reset();\r\n syncAfterMutation();\r\n\r\n if (onReset) {\r\n await onReset();\r\n }\r\n } finally {\r\n setHeaderResetting(false);\r\n }\r\n }, [editor, syncAfterMutation, onReset]);\r\n\r\n const value = React.useMemo(() => editor.value(), [editor, version]);\r\n const state = React.useMemo(() => editor.state(), [editor, version]);\r\n\r\n const ctx = React.useMemo<FallbackEditorContextValue>(\r\n () => ({\r\n editor,\r\n version,\r\n\r\n serviceProps: props,\r\n snapshot,\r\n\r\n primaryServices: resolvedPrimaryServices,\r\n eligibleServices: resolvedEligibleServices,\r\n\r\n activeServiceId,\r\n setActiveServiceId,\r\n\r\n activeTab,\r\n setActiveTab,\r\n\r\n state,\r\n value,\r\n\r\n settings,\r\n settingsSaving,\r\n\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n\r\n saveSettings,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n\r\n reset,\r\n\r\n get: editor.get,\r\n getScope: editor.getScope,\r\n check: editor.check,\r\n eligible: editor.eligible,\r\n\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n }),\r\n [\r\n editor,\r\n version,\r\n props,\r\n snapshot,\r\n resolvedPrimaryServices,\r\n resolvedEligibleServices,\r\n activeServiceId,\r\n activeTab,\r\n state,\r\n value,\r\n settings,\r\n settingsSaving,\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n saveSettings,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n reset,\r\n add,\r\n addMany,\r\n remove,\r\n replace,\r\n clear,\r\n ],\r\n );\r\n\r\n return (\r\n <FallbackEditorContext.Provider value={ctx}>\r\n {children}\r\n </FallbackEditorContext.Provider>\r\n );\r\n}\r\n\r\nexport function useFallbackEditorContext() {\r\n const ctx = React.useContext(FallbackEditorContext);\r\n if (!ctx) {\r\n throw new Error(\r\n \"useFallbackEditorContext must be used inside FallbackEditorProvider\",\r\n );\r\n }\r\n return ctx;\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport type { OrderSnapshot } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport {\r\n FallbackEditorProvider,\r\n type FallbackEditorProviderProps,\r\n} from \"@/react\";\r\nimport { FallbackEditorHeader } from \"@/react\";\r\nimport { FallbackServiceSidebar } from \"@/react\";\r\nimport { FallbackRegistrationsPanel } from \"@/react\";\r\nimport { FallbackSettingsPanel } from \"@/react\";\r\nimport { FallbackDetailsPanel } from \"@/react\";\r\nimport { useFallbackEditor } from \"@/react/fallback-editor/useFallbackEditor\";\r\n\r\ntype Props = {\r\n className?: string;\r\n fallbacks?: ServiceProps[\"fallbacks\"];\r\n props?: ServiceProps;\r\n snapshot?: OrderSnapshot;\r\n\r\n primaryServices?: DgpServiceMap;\r\n eligibleServices?: DgpServiceMap;\r\n\r\n settings?: FallbackSettings;\r\n initialServiceId?: ServiceIdRef;\r\n\r\n onSettingsChange?: FallbackEditorProviderProps[\"onSettingsChange\"];\r\n onSave?: FallbackEditorProviderProps[\"onSave\"];\r\n onValidate?: FallbackEditorProviderProps[\"onValidate\"];\r\n onReset?: FallbackEditorProviderProps[\"onReset\"];\r\n};\r\n\r\nexport function FallbackEditor({\r\n className,\r\n fallbacks,\r\n props,\r\n snapshot,\r\n primaryServices,\r\n eligibleServices,\r\n settings,\r\n initialServiceId,\r\n onSettingsChange,\r\n onSave,\r\n onValidate,\r\n onReset,\r\n}: Props) {\r\n return (\r\n <FallbackEditorProvider\r\n fallbacks={fallbacks}\r\n props={props}\r\n snapshot={snapshot}\r\n primaryServices={primaryServices}\r\n eligibleServices={eligibleServices}\r\n settings={settings}\r\n initialServiceId={initialServiceId}\r\n onSettingsChange={onSettingsChange}\r\n onSave={onSave}\r\n onValidate={onValidate}\r\n onReset={onReset}\r\n >\r\n <FallbackEditorInner className={className} />\r\n </FallbackEditorProvider>\r\n );\r\n}\r\n\r\nfunction FallbackEditorInner({ className }: { className?: string }) {\r\n const {\r\n activeTab,\r\n setActiveTab,\r\n activeServiceId,\r\n saveFallbacks,\r\n validateFallbacks,\r\n resetEditor,\r\n headerSaving,\r\n headerValidating,\r\n headerResetting,\r\n } = useFallbackEditor();\r\n\r\n return (\r\n <div\r\n className={[\r\n \"min-h-screen bg-zinc-100 p-4 text-zinc-900 dark:bg-zinc-950 dark:text-zinc-100\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\r\n <FallbackEditorHeader\r\n onReset={resetEditor}\r\n onValidate={validateFallbacks}\r\n onSave={saveFallbacks as any}\r\n resetting={headerResetting}\r\n validating={headerValidating}\r\n saving={headerSaving}\r\n />\r\n\r\n <div className=\"grid gap-4 xl:grid-cols-[300px_minmax(0,1fr)_360px]\">\r\n <FallbackServiceSidebar />\r\n\r\n <div className=\"flex min-h-0 flex-col gap-4\">\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\r\n {activeServiceId !== undefined\r\n ? `Service #${String(activeServiceId)}`\r\n : \"No service selected\"}\r\n </h2>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Edit fallback registrations and inspect\r\n validation.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <TabButton\r\n active={activeTab === \"registrations\"}\r\n onClick={() =>\r\n setActiveTab(\"registrations\")\r\n }\r\n >\r\n Registrations\r\n </TabButton>\r\n <TabButton\r\n active={activeTab === \"settings\"}\r\n onClick={() => setActiveTab(\"settings\")}\r\n >\r\n Settings\r\n </TabButton>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {activeTab === \"registrations\" ? (\r\n <FallbackRegistrationsPanel />\r\n ) : (\r\n <FallbackSettingsPanel />\r\n )}\r\n </div>\r\n\r\n <FallbackDetailsPanel />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TabButton({\r\n active,\r\n onClick,\r\n children,\r\n}: {\r\n active: boolean;\r\n onClick: () => void;\r\n children: React.ReactNode;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className={[\r\n \"rounded-xl px-3 py-2 text-sm font-medium transition\",\r\n active\r\n ? \"bg-blue-600 text-white\"\r\n : \"border border-zinc-300 bg-white text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\",\r\n ].join(\" \")}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { ServiceIdRef } from \"@/schema\";\r\n\r\ntype Item = {\r\n id: ServiceIdRef;\r\n name?: string;\r\n platform?: string;\r\n rate?: number;\r\n};\r\n\r\ntype Props = {\r\n items: Item[];\r\n selected: Set<string>;\r\n onToggle: (id: ServiceIdRef) => void;\r\n height?: number;\r\n rowHeight?: number;\r\n emptyText?: string;\r\n};\r\n\r\nexport function VirtualServiceList({\r\n items,\r\n selected,\r\n onToggle,\r\n height = 420,\r\n rowHeight = 52,\r\n emptyText = \"No services found.\",\r\n}: Props) {\r\n const [scrollTop, setScrollTop] = React.useState(0);\r\n\r\n const total = items.length;\r\n const visibleCount = Math.ceil(height / rowHeight);\r\n const overscan = 8;\r\n\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\r\n const end = Math.min(total, start + visibleCount + overscan * 2);\r\n\r\n const visible = items.slice(start, end);\r\n\r\n if (total === 0) {\r\n return (\r\n <div\r\n className=\"flex items-center justify-center rounded-xl border border-zinc-200 bg-zinc-50 text-sm text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-400\"\r\n style={{ height }}\r\n >\r\n {emptyText}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"overflow-auto rounded-xl border border-zinc-200 dark:border-zinc-800\"\r\n style={{ height }}\r\n onScroll={(e) => setScrollTop(e.currentTarget.scrollTop)}\r\n >\r\n <div className=\"relative\" style={{ height: total * rowHeight }}>\r\n {visible.map((item, i) => {\r\n const index = start + i;\r\n const key = String(item.id);\r\n const checked = selected.has(key);\r\n\r\n return (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n onClick={() => onToggle(item.id)}\r\n className=\"absolute left-0 right-0 flex items-center justify-between border-b border-zinc-100 bg-white px-3 text-left hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:bg-zinc-800\"\r\n style={{\r\n top: index * rowHeight,\r\n height: rowHeight,\r\n }}\r\n >\r\n <div className=\"min-w-0\">\r\n <div className=\"truncate text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n #{String(item.id)} ·{\" \"}\r\n {item.name ?? \"Unnamed\"}\r\n </div>\r\n <div className=\"mt-0.5 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {item.platform ?? \"Unknown\"}\r\n {typeof item.rate === \"number\"\r\n ? ` · rate ${item.rate}`\r\n : \"\"}\r\n </div>\r\n </div>\r\n\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n readOnly\r\n className=\"h-4 w-4 rounded border-zinc-300\"\r\n />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { useFallbackEditor, usePrimaryServiceList } from \"./useFallbackEditor\";\r\n\r\nexport function FallbackDetailsPanel() {\r\n const { activeServiceId, state, settings } = useFallbackEditor();\r\n const services = usePrimaryServiceList();\r\n\r\n const service = React.useMemo(\r\n () => services.find((s) => String(s.id) === String(activeServiceId)),\r\n [services, activeServiceId],\r\n );\r\n\r\n return (\r\n <aside className=\"flex min-h-0 flex-col gap-4\">\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Primary service info\r\n </h3>\r\n\r\n {!service ? (\r\n <p className=\"mt-3 text-sm text-zinc-500 dark:text-zinc-400\">\r\n No service selected.\r\n </p>\r\n ) : (\r\n <div className=\"mt-3 space-y-2 text-sm\">\r\n <Detail label=\"ID\" value={String(service.id)} />\r\n <Detail\r\n label=\"Name\"\r\n value={service.name ?? \"Unnamed\"}\r\n />\r\n <Detail\r\n label=\"Platform\"\r\n value={service.platform ?? \"—\"}\r\n />\r\n <Detail\r\n label=\"Rate\"\r\n value={\r\n typeof service.rate === \"number\"\r\n ? String(service.rate)\r\n : \"—\"\r\n }\r\n />\r\n <Detail\r\n label=\"Changed\"\r\n value={state.changed ? \"yes\" : \"no\"}\r\n />\r\n </div>\r\n )}\r\n </section>\r\n\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Active policy\r\n </h3>\r\n\r\n <div className=\"mt-3 space-y-2 text-sm\">\r\n <Detail\r\n label=\"Constraint fit\"\r\n value={\r\n settings.requireConstraintFit\r\n ? \"enabled\"\r\n : \"disabled\"\r\n }\r\n />\r\n <Detail\r\n label=\"Rate policy\"\r\n value={\n settings.ratePolicy?.kind === \"eq_primary\"\n ? \"eq_primary\"\n : settings.ratePolicy?.kind === \"within_pct\"\n ? `within_pct (${settings.ratePolicy.pct}%)`\n : settings.ratePolicy?.kind ===\n \"at_least_pct_lower\"\n ? `at_least_pct_lower (${settings.ratePolicy.pct}%)`\n : settings.ratePolicy?.kind ===\n \"lte_primary\"\n ? `lte_primary (${settings.ratePolicy.pct}%)`\n : \"lte_primary (5%)\"\n }\n />\n <Detail\r\n label=\"Strategy\"\r\n value={settings.selectionStrategy ?? \"priority\"}\r\n />\r\n <Detail label=\"Mode\" value={settings.mode ?? \"strict\"} />\r\n </div>\r\n </section>\r\n\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Current payload\r\n </h3>\r\n\r\n <pre className=\"mt-3 overflow-auto rounded-xl bg-zinc-950 p-3 text-xs text-zinc-100\">\r\n {JSON.stringify(state.current, null, 2)}\r\n </pre>\r\n </section>\r\n </aside>\r\n );\r\n}\r\n\r\nfunction Detail({ label, value }: { label: string; value: string }) {\r\n return (\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <span className=\"text-zinc-500 dark:text-zinc-400\">{label}</span>\r\n <span className=\"text-right text-zinc-900 dark:text-zinc-100\">\r\n {value}\r\n </span>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\ntype Props = {\r\n onReset?: () => void | Promise<void>;\r\n onValidate?: () => void | Promise<void>;\r\n onSave?: () => void | Promise<void>;\r\n resetting?: boolean;\r\n validating?: boolean;\r\n saving?: boolean;\r\n};\r\n\r\nexport function FallbackEditorHeader({\r\n onReset,\r\n onValidate,\r\n onSave,\r\n resetting = false,\r\n validating = false,\r\n saving = false,\r\n}: Props) {\r\n return (\r\n <div className=\"flex flex-col gap-3 rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900 md:flex-row md:items-center md:justify-between\">\r\n <div>\r\n <h1 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Fallback Editor\r\n </h1>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Manage global and node-scoped fallback registrations with\r\n live validation hints.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n disabled={resetting}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n {resetting ? \"Resetting...\" : \"Reset\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onValidate}\r\n disabled={validating}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n {validating ? \"Validating...\" : \"Validate\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onSave}\r\n disabled={saving}\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n {saving ? \"Saving...\" : \"Save\"}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\r\nimport { useFallbackEditorContext } from \"./FallbackEditorProvider\";\r\n\r\nexport function FallbackSettingsPanel() {\r\n const { settings, saveSettings, settingsSaving } =\r\n useFallbackEditorContext();\r\n\r\n const [draft, setDraft] = React.useState<FallbackSettings>(settings);\r\n const [error, setError] = React.useState<string | null>(null);\r\n const [saved, setSaved] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setDraft(settings);\r\n setSaved(false);\r\n setError(null);\r\n }, [settings]);\r\n\r\n const changed =\r\n JSON.stringify(draft ?? {}) !== JSON.stringify(settings ?? {});\r\n\r\n async function handleSave() {\r\n setError(null);\r\n setSaved(false);\r\n\r\n try {\r\n await saveSettings(draft);\r\n setSaved(true);\r\n } catch (err) {\r\n setError(\r\n err instanceof Error\r\n ? err.message\r\n : \"Failed to save fallback settings.\",\r\n );\r\n }\r\n }\r\n\r\n function setRatePolicy(next: RatePolicy) {\r\n setDraft((prev) => ({\r\n ...prev,\r\n ratePolicy: next,\r\n }));\r\n }\r\n\r\n const ratePolicy: RatePolicy = draft.ratePolicy ?? {\n kind: \"lte_primary\",\n pct: 5,\n };\n\r\n return (\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"mb-4 flex items-start justify-between gap-3\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Fallback settings\r\n </h3>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n These settings can be persisted by the host and returned\r\n into the editor.\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!changed || settingsSaving}\r\n className={[\r\n \"rounded-xl px-3 py-2 text-sm font-medium transition\",\r\n !changed || settingsSaving\r\n ? \"cursor-not-allowed bg-zinc-200 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-500\"\r\n : \"bg-blue-600 text-white hover:bg-blue-700\",\r\n ].join(\" \")}\r\n >\r\n {settingsSaving ? \"Saving...\" : \"Save settings\"}\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <SettingRow\r\n title=\"Require constraint fit\"\r\n hint=\"Reject or warn when a candidate does not match effective tag constraints.\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n requireConstraintFit:\r\n !prev?.requireConstraintFit,\r\n }))\r\n }\r\n className={[\r\n \"inline-flex items-center gap-2 rounded-full border px-3 py-2 text-sm\",\r\n draft.requireConstraintFit\r\n ? \"border-green-300 bg-green-50 text-green-700 dark:border-green-900/50 dark:bg-green-950/30 dark:text-green-300\"\r\n : \"border-zinc-300 bg-white text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\",\r\n ].join(\" \")}\r\n >\r\n <span>\r\n {draft.requireConstraintFit\r\n ? \"Enabled\"\r\n : \"Disabled\"}\r\n </span>\r\n <span\r\n className={[\r\n \"h-2.5 w-2.5 rounded-full\",\r\n draft.requireConstraintFit\r\n ? \"bg-green-500\"\r\n : \"bg-zinc-400\",\r\n ].join(\" \")}\r\n />\r\n </button>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Rate policy\"\r\n hint=\"Controls how fallback service rates are compared against the primary service.\"\r\n >\r\n <div className=\"flex flex-col gap-2 md:items-end\">\r\n <select\r\n value={ratePolicy.kind}\r\n onChange={(e) => {\r\n const kind = e.target\r\n .value as RatePolicy[\"kind\"];\r\n\r\n if (kind === \"eq_primary\") {\n setRatePolicy({ kind: \"eq_primary\" });\n return;\n }\n\n const currentPct =\n ratePolicy.kind === \"eq_primary\"\n ? 5\n : ratePolicy.pct;\n\n if (kind === \"lte_primary\") {\n setRatePolicy({\n kind: \"lte_primary\",\n pct: currentPct,\n });\n return;\n }\n\n if (kind === \"within_pct\") {\n setRatePolicy({\n kind: \"within_pct\",\n pct: currentPct,\n });\n return;\n }\n\n setRatePolicy({\n kind: \"at_least_pct_lower\",\n pct: currentPct,\n });\n }}\r\n className=\"w-56 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"eq_primary\">eq_primary</option>\n <option value=\"lte_primary\">lte_primary</option>\n <option value=\"within_pct\">within_pct</option>\n <option value=\"at_least_pct_lower\">\n at_least_pct_lower\n </option>\n </select>\n\n {ratePolicy.kind !== \"eq_primary\" && (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={0}\r\n step=\"0.01\"\r\n value={ratePolicy.pct}\r\n onChange={(e) => {\r\n const pct = Number(e.target.value || 0);\r\n\r\n setRatePolicy({ ...ratePolicy, pct });\n }}\n className=\"w-32 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n />\r\n <span className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n %\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Selection strategy\"\r\n hint=\"How valid fallback candidates are ordered in previews.\"\r\n >\r\n <select\r\n value={draft.selectionStrategy ?? \"priority\"}\r\n onChange={(e) =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n selectionStrategy: e.target.value as\r\n | \"priority\"\r\n | \"cheapest\",\r\n }))\r\n }\r\n className=\"w-48 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"priority\">priority</option>\r\n <option value=\"cheapest\">cheapest</option>\r\n </select>\r\n </SettingRow>\r\n\r\n <SettingRow\r\n title=\"Mode\"\r\n hint=\"Use strict for enforced filtering, dev for advisory feedback.\"\r\n >\r\n <select\r\n value={draft.mode ?? \"strict\"}\r\n onChange={(e) =>\r\n setDraft((prev) => ({\r\n ...prev,\r\n mode: e.target.value as \"strict\" | \"dev\",\r\n }))\r\n }\r\n className=\"w-48 rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100\"\r\n >\r\n <option value=\"strict\">strict</option>\r\n <option value=\"dev\">dev</option>\r\n </select>\r\n </SettingRow>\r\n </div>\r\n\r\n {saved && !error ? (\r\n <div className=\"mt-4 rounded-xl border border-green-200 bg-green-50 px-3 py-2 text-sm text-green-700 dark:border-green-900/50 dark:bg-green-950/20 dark:text-green-300\">\r\n Settings saved.\r\n </div>\r\n ) : null}\r\n\r\n {error ? (\r\n <div className=\"mt-4 rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-300\">\r\n {error}\r\n </div>\r\n ) : null}\r\n </section>\r\n );\r\n}\r\n\r\nfunction SettingRow({\r\n title,\r\n hint,\r\n children,\r\n}: {\r\n title: string;\r\n hint: string;\r\n children: React.ReactNode;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col gap-3 border-b border-dashed border-zinc-200 pb-4 last:border-b-0 last:pb-0 dark:border-zinc-800 md:flex-row md:items-center md:justify-between\">\r\n <div className=\"max-w-xl\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n {title}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {hint}\r\n </div>\r\n </div>\r\n <div>{children}</div>\r\n </div>\r\n );\r\n}\r\n","import React, { useMemo, useState } from \"react\";\r\nimport { useFallbackEditor, usePrimaryServiceList } from \"./useFallbackEditor\";\r\n\r\nexport function FallbackServiceSidebar() {\r\n const { activeServiceId, setActiveServiceId, get } = useFallbackEditor();\r\n const services = usePrimaryServiceList();\r\n const [query, setQuery] = useState(\"\");\r\n\r\n const filtered = useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n if (!q) return services;\r\n\r\n return services.filter(\r\n (service) =>\r\n String(service.id).includes(q) ||\r\n String(service.name ?? \"\")\r\n .toLowerCase()\r\n .includes(q) ||\r\n String(service.platform ?? \"\")\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n }, [query, services]);\r\n\r\n return (\r\n <aside className=\"flex min-h-0 flex-col rounded-2xl border border-zinc-200 bg-white shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h2 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Primary services\r\n </h2>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Services currently active in the builder/runtime context.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex min-h-0 flex-1 flex-col p-4\">\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search primary service...\"\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n />\r\n\r\n <div className=\"mt-3 flex-1 space-y-2 overflow-auto\">\r\n {filtered.map((service) => {\r\n const active =\r\n String(service.id) === String(activeServiceId);\r\n const count = get(service.id).length;\r\n\r\n return (\r\n <button\r\n key={String(service.id)}\r\n type=\"button\"\r\n onClick={() => setActiveServiceId(service.id)}\r\n className={[\r\n \"w-full rounded-2xl border p-3 text-left transition\",\r\n active\r\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-950/30\"\r\n : \"border-zinc-200 bg-zinc-50 hover:border-zinc-300 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:border-zinc-700\",\r\n ].join(\" \")}\r\n >\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"min-w-0\">\r\n <div className=\"truncate text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n #{String(service.id)} ·{\" \"}\r\n {service.name ?? \"Unnamed\"}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {service.platform ?? \"Unknown\"}\r\n {typeof service.rate === \"number\"\r\n ? ` · rate ${service.rate}`\r\n : \"\"}\r\n </div>\r\n </div>\r\n\r\n <span className=\"rounded-full border border-zinc-200 bg-white px-2 py-1 text-[11px] text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\">\r\n {count} reg\r\n </span>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type {\r\n FallbackRegistration,\r\n FallbackScopeRef,\r\n ServiceIdRef,\r\n} from \"@/schema\";\r\nimport {\r\n useActiveFallbackRegistrations,\r\n useEligibleServiceList,\r\n useFallbackEditor,\r\n} from \"./useFallbackEditor\";\r\nimport { FallbackAddCandidatesDialog } from \"./FallbackAddCandidatesDialog\";\r\nimport { FallbackAddRegistrationDialog } from \"./FallbackAddRegistrationDialog\";\r\n\r\nexport function FallbackRegistrationsPanel() {\r\n const { activeServiceId, remove, clear, check } = useFallbackEditor();\r\n\r\n const registrations = useActiveFallbackRegistrations();\r\n const eligibleServices = useEligibleServiceList();\r\n\r\n const [candidatePickerOpen, setCandidatePickerOpen] = React.useState(false);\r\n const [candidateContext, setCandidateContext] =\r\n React.useState<FallbackScopeRef | null>(null);\r\n const [candidatePrimaryId, setCandidatePrimaryId] = React.useState<\r\n ServiceIdRef | undefined\r\n >(undefined);\r\n\r\n const [registrationDialogOpen, setRegistrationDialogOpen] =\r\n React.useState(false);\r\n\r\n const makeContext = React.useCallback(\r\n (registration: FallbackRegistration): FallbackScopeRef => {\r\n if (registration.scope === \"global\") {\r\n return {\r\n scope: \"global\",\r\n primary: registration.primary,\r\n };\r\n }\r\n\r\n return {\r\n scope: \"node\",\r\n nodeId: registration.scopeId!,\r\n };\r\n },\r\n [],\r\n );\r\n\r\n const openCandidatePicker = React.useCallback(\r\n (context: FallbackScopeRef, primaryId?: ServiceIdRef) => {\r\n setCandidateContext(context);\r\n setCandidatePrimaryId(primaryId);\r\n setCandidatePickerOpen(true);\r\n },\r\n [],\r\n );\r\n\r\n if (activeServiceId === undefined || activeServiceId === null) {\r\n return (\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"rounded-2xl border border-dashed border-zinc-300 p-6 text-sm text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\">\r\n Select a primary service to start editing.\r\n </div>\r\n </section>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <section className=\"rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"mb-4 flex items-start justify-between gap-3\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Registered fallbacks\r\n </h3>\r\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Use eligible services as fallback candidates for the\r\n selected primary.\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setRegistrationDialogOpen(true)}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Add registration\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n {registrations.length === 0 ? (\r\n <div className=\"rounded-2xl border border-dashed border-zinc-300 p-6 text-sm text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\">\r\n No registrations yet for this primary service.\r\n </div>\r\n ) : (\r\n registrations.map((reg, index) => {\r\n const context = makeContext(reg);\r\n const candidates = reg.services;\r\n\r\n return (\r\n <div\r\n key={`${reg.scope}:${String(reg.scopeId ?? \"global\")}:${index}`}\r\n className=\"rounded-2xl border border-zinc-200 bg-zinc-50 p-4 dark:border-zinc-800 dark:bg-zinc-950\"\r\n >\r\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\r\n <div>\r\n <div className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\r\n {reg.scope === \"global\"\r\n ? \"Global registration\"\r\n : `Node · ${reg.scopeId}`}\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Primary #{String(reg.primary)}\r\n </div>\r\n </div>\r\n\r\n <span className=\"rounded-full border border-zinc-200 bg-white px-2 py-1 text-[11px] text-zinc-600 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\">\r\n {reg.scope}\r\n {reg.scopeId\r\n ? ` · ${reg.scopeId}`\r\n : \"\"}\r\n </span>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-wrap gap-2\">\r\n {candidates.length === 0 ? (\r\n <span className=\"text-xs text-zinc-500 dark:text-zinc-400\">\r\n No fallback services yet.\r\n </span>\r\n ) : (\r\n candidates.map((candidate) => {\r\n const preview = check(context, [\r\n candidate,\r\n ]);\r\n const rejected =\r\n preview.rejected[0];\r\n const tone = rejected\r\n ? \"border-red-200 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/30 dark:text-red-300\"\r\n : \"border-zinc-200 bg-white text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-200\";\r\n\r\n const service =\r\n eligibleServices.find(\r\n (s) =>\r\n String(s.id) ===\r\n String(candidate),\r\n );\r\n\r\n return (\r\n <div\r\n key={String(candidate)}\r\n className={`inline-flex items-center gap-2 rounded-xl border px-3 py-2 text-xs ${tone}`}\r\n >\r\n <span>\r\n {service\r\n ? `#${String(service.id)} · ${service.name ?? \"Unnamed\"}`\r\n : `#${String(candidate)}`}\r\n </span>\r\n {rejected ? (\r\n <span className=\"rounded-full border border-current/20 px-2 py-0.5 text-[10px]\">\r\n {rejected.reasons.join(\r\n \", \",\r\n )}\r\n </span>\r\n ) : (\r\n <span className=\"rounded-full border border-current/20 px-2 py-0.5 text-[10px]\">\r\n valid\r\n </span>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n remove(\r\n context,\r\n candidate,\r\n )\r\n }\r\n className=\"text-current/70 hover:text-current\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n <div className=\"mt-4 flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n openCandidatePicker(\r\n context,\r\n reg.primary,\r\n )\r\n }\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Add fallback\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => clear(context)}\r\n className=\"rounded-xl border border-red-300 bg-white px-3 py-2 text-sm font-medium text-red-600 hover:bg-red-50 dark:border-red-900/50 dark:bg-zinc-900 dark:text-red-300 dark:hover:bg-red-950/20\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n </section>\r\n\r\n <FallbackAddRegistrationDialog\r\n open={registrationDialogOpen}\r\n onClose={() => setRegistrationDialogOpen(false)}\r\n onSelect={(context, primaryId) => {\r\n setRegistrationDialogOpen(false);\r\n openCandidatePicker(context, primaryId);\r\n }}\r\n />\r\n\r\n <FallbackAddCandidatesDialog\r\n open={candidatePickerOpen}\r\n onClose={() => setCandidatePickerOpen(false)}\r\n context={candidateContext}\r\n primaryId={candidatePrimaryId}\r\n />\r\n </>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackScopeRef, ServiceIdRef } from \"@/schema\";\r\nimport { useEligibleServiceList, useFallbackEditor } from \"./useFallbackEditor\";\r\nimport { VirtualServiceList } from \"./VirtualServiceList\";\r\n\r\ntype Props = {\r\n open: boolean;\r\n onClose: () => void;\r\n context: FallbackScopeRef | null;\r\n primaryId?: ServiceIdRef;\r\n};\r\n\r\nexport function FallbackAddCandidatesDialog({\r\n open,\r\n onClose,\r\n context,\r\n primaryId,\r\n}: Props) {\r\n const { eligible, addMany } = useFallbackEditor();\r\n const eligibleServices = useEligibleServiceList();\r\n\r\n const [query, setQuery] = React.useState(\"\");\r\n const [filterEligibleOnly, setFilterEligibleOnly] = React.useState(true);\r\n const [selected, setSelected] = React.useState<Set<string>>(new Set());\r\n const [submitting, setSubmitting] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!open) {\r\n setQuery(\"\");\r\n setFilterEligibleOnly(true);\r\n setSelected(new Set());\r\n }\r\n }, [open]);\r\n\r\n const allowedIds = React.useMemo(() => {\r\n if (!context) return null;\r\n if (!filterEligibleOnly) return null;\r\n return new Set(eligible(context).map((id) => String(id)));\r\n }, [context, filterEligibleOnly, eligible]);\r\n\r\n const items = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n\r\n return eligibleServices.filter((service) => {\r\n if (\r\n primaryId !== undefined &&\r\n String(service.id) === String(primaryId)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (allowedIds && !allowedIds.has(String(service.id))) {\r\n return false;\r\n }\r\n\r\n if (!q) return true;\r\n\r\n return (\r\n String(service.id).includes(q) ||\r\n String(service.name ?? \"\")\r\n .toLowerCase()\r\n .includes(q) ||\r\n String(service.platform ?? \"\")\r\n .toLowerCase()\r\n .includes(q)\r\n );\r\n });\r\n }, [eligibleServices, allowedIds, query, primaryId]);\r\n\r\n function toggle(id: ServiceIdRef) {\r\n setSelected((prev) => {\r\n const next = new Set(prev);\r\n const key = String(id);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n }\r\n\r\n async function handleAdd() {\r\n if (!context || selected.size === 0) return;\r\n\r\n setSubmitting(true);\r\n try {\r\n const ids = items\r\n .filter((item) => selected.has(String(item.id)))\r\n .map((item) => item.id);\r\n\r\n addMany(context, ids);\r\n onClose();\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n }\r\n\r\n if (!open || !context) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\r\n <div className=\"flex max-h-[85vh] w-full max-w-3xl flex-col rounded-2xl border border-zinc-200 bg-white shadow-2xl dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h3 className=\"text-base font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Add fallback services\r\n </h3>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Search and select one or more eligible fallback\r\n candidates.\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-3 p-4\">\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search eligible services...\"\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n />\r\n\r\n <label className=\"inline-flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300\">\r\n <input\r\n type=\"checkbox\"\r\n checked={filterEligibleOnly}\r\n onChange={(e) =>\r\n setFilterEligibleOnly(e.target.checked)\r\n }\r\n className=\"h-4 w-4 rounded border-zinc-300\"\r\n />\r\n Filter eligible only\r\n </label>\r\n\r\n <VirtualServiceList\r\n items={items}\r\n selected={selected}\r\n onToggle={toggle}\r\n emptyText=\"No eligible services found.\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between border-t border-zinc-200 p-4 dark:border-zinc-800\">\r\n <div className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n {selected.size} selected\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleAdd}\r\n disabled={selected.size === 0 || submitting}\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n {submitting ? \"Adding...\" : \"Add selected\"}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { FallbackScopeRef, ServiceIdRef, ServiceProps } from \"@/schema\";\r\nimport {\r\n useActiveFallbackRegistrations,\r\n useFallbackEditor,\r\n} from \"./useFallbackEditor\";\r\n\r\ntype NodeTarget = {\r\n id: string;\r\n kind: \"tag\" | \"field\" | \"option\" | \"node\";\r\n label: string;\r\n serviceId: ServiceIdRef;\r\n};\r\n\r\ntype Props = {\r\n open: boolean;\r\n onClose: () => void;\r\n onSelect: (context: FallbackScopeRef, primaryId: ServiceIdRef) => void;\r\n};\r\n\r\ntype RegistrationMode = \"snapshot\" | \"props\" | \"none\";\r\n\r\nexport function FallbackAddRegistrationDialog({\r\n open,\r\n onClose,\r\n onSelect,\r\n}: Props) {\r\n const { activeServiceId, serviceProps, snapshot } = useFallbackEditor();\r\n const registrations = useActiveFallbackRegistrations();\r\n\r\n const [scope, setScope] = React.useState<\"global\" | \"node\">(\"global\");\r\n const [nodeId, setNodeId] = React.useState(\"\");\r\n\r\n const mode = React.useMemo<RegistrationMode>(() => {\r\n if (snapshot) return \"snapshot\";\r\n if (serviceProps) return \"props\";\r\n return \"none\";\r\n }, [snapshot, serviceProps]);\r\n\r\n React.useEffect(() => {\r\n if (open) {\r\n setScope(\"global\");\r\n setNodeId(\"\");\r\n }\r\n }, [open]);\r\n\r\n const hasGlobal = React.useMemo(() => {\r\n return registrations.some((r) => r.scope === \"global\");\r\n }, [registrations]);\r\n\r\n const nodeTargets = React.useMemo<NodeTarget[]>(() => {\r\n if (activeServiceId === undefined || activeServiceId === null) {\r\n return [];\r\n }\r\n\r\n if (mode === \"snapshot\" && snapshot?.serviceMap) {\r\n const out: NodeTarget[] = [];\r\n\r\n for (const [id, primaryIds] of Object.entries(\r\n snapshot.serviceMap,\r\n )) {\r\n const matchesPrimary = (primaryIds ?? []).some(\r\n (serviceId) =>\r\n String(serviceId) === String(activeServiceId),\r\n );\r\n\r\n if (!matchesPrimary) continue;\r\n\r\n const meta = resolveNodeMeta(serviceProps, id);\r\n\r\n out.push({\r\n id,\r\n kind: meta.kind,\r\n label: meta.label,\r\n serviceId: activeServiceId,\r\n });\r\n }\r\n\r\n // keep active tag near the top if present\r\n const activeTagId = snapshot.selection?.tag;\r\n\r\n out.sort((a, b) => {\r\n if (\r\n activeTagId &&\r\n a.id === activeTagId &&\r\n b.id !== activeTagId\r\n ) {\r\n return -1;\r\n }\r\n if (\r\n activeTagId &&\r\n b.id === activeTagId &&\r\n a.id !== activeTagId\r\n ) {\r\n return 1;\r\n }\r\n return a.label.localeCompare(b.label);\r\n });\r\n\r\n const seen = new Set<string>();\r\n return out.filter((item) => {\r\n if (seen.has(item.id)) return false;\r\n seen.add(item.id);\r\n return true;\r\n });\r\n }\r\n\r\n if (mode === \"props\" && serviceProps) {\r\n const out: NodeTarget[] = [];\r\n\r\n for (const tag of serviceProps.filters ?? []) {\r\n if (tag?.service_id === undefined || tag?.service_id === null) {\r\n continue;\r\n }\r\n\r\n if (String(tag.service_id) !== String(activeServiceId)) {\r\n continue;\r\n }\r\n\r\n out.push({\r\n id: tag.id,\r\n kind: \"tag\",\r\n label:\r\n tag.label ??\r\n (tag as { title?: string }).title ??\r\n tag.id,\r\n serviceId: tag.service_id,\r\n });\r\n }\r\n\r\n for (const field of serviceProps.fields ?? []) {\r\n if (\r\n field?.service_id !== undefined &&\r\n field?.service_id !== null &&\r\n String(field.service_id) === String(activeServiceId)\r\n ) {\r\n out.push({\r\n id: field.id,\r\n kind: \"field\",\r\n label:\r\n field.label ??\r\n (field as { title?: string }).title ??\r\n field.id,\r\n serviceId: field.service_id,\r\n });\r\n }\r\n\r\n for (const option of field.options ?? []) {\r\n if (\r\n option?.service_id === undefined ||\r\n option?.service_id === null\r\n ) {\r\n continue;\r\n }\r\n\r\n if (String(option.service_id) !== String(activeServiceId)) {\r\n continue;\r\n }\r\n\r\n out.push({\r\n id: option.id,\r\n kind: \"option\",\r\n label:\r\n option.label ??\r\n (option as { title?: string }).title ??\r\n String(\r\n (option as { value?: unknown }).value ??\r\n option.id,\r\n ),\r\n serviceId: option.service_id,\r\n });\r\n }\r\n }\r\n\r\n const seen = new Set<string>();\r\n return out.filter((item) => {\r\n if (seen.has(item.id)) return false;\r\n seen.add(item.id);\r\n return true;\r\n });\r\n }\r\n\r\n return [];\r\n }, [mode, snapshot, serviceProps, activeServiceId]);\r\n\r\n React.useEffect(() => {\r\n if (hasGlobal && scope === \"global\") {\r\n setScope(\"node\");\r\n }\r\n }, [hasGlobal, scope]);\r\n\r\n React.useEffect(() => {\r\n if (scope === \"node\" && nodeId) {\r\n const exists = nodeTargets.some((node) => node.id === nodeId);\r\n if (!exists) setNodeId(\"\");\r\n }\r\n }, [scope, nodeId, nodeTargets]);\r\n\r\n function handleContinue() {\r\n if (activeServiceId === undefined || activeServiceId === null) return;\r\n\r\n if (scope === \"global\") {\r\n onSelect(\r\n {\r\n scope: \"global\",\r\n primary: activeServiceId,\r\n },\r\n activeServiceId,\r\n );\r\n return;\r\n }\r\n\r\n if (!nodeId) return;\r\n\r\n const node = nodeTargets.find((n) => n.id === nodeId);\r\n onSelect(\r\n {\r\n scope: \"node\",\r\n nodeId,\r\n },\r\n node?.serviceId ?? activeServiceId,\r\n );\r\n }\r\n\r\n if (!open) return null;\r\n\r\n const nodeScopeDisabled = nodeTargets.length === 0;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\r\n <div className=\"w-full max-w-lg rounded-2xl border border-zinc-200 bg-white shadow-2xl dark:border-zinc-800 dark:bg-zinc-900\">\r\n <div className=\"border-b border-zinc-200 p-4 dark:border-zinc-800\">\r\n <h3 className=\"text-base font-semibold text-zinc-900 dark:text-zinc-100\">\r\n Add registration\r\n </h3>\r\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\r\n Choose the registration scope before selecting fallback\r\n candidates.\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-4 p-4\">\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Scope\r\n </div>\r\n\r\n <div className=\"grid gap-2\">\r\n {!hasGlobal && (\r\n <label className=\"flex cursor-pointer items-start gap-3 rounded-xl border border-zinc-200 p-3 dark:border-zinc-800\">\r\n <input\r\n type=\"radio\"\r\n name=\"scope\"\r\n checked={scope === \"global\"}\r\n onChange={() => setScope(\"global\")}\r\n className=\"mt-1 h-4 w-4\"\r\n />\r\n <div>\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Global\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n Use one global registration for this\r\n primary service.\r\n </div>\r\n </div>\r\n </label>\r\n )}\r\n\r\n <label\r\n className={[\r\n \"flex items-start gap-3 rounded-xl border p-3\",\r\n nodeScopeDisabled\r\n ? \"cursor-not-allowed border-zinc-200 opacity-60 dark:border-zinc-800\"\r\n : \"cursor-pointer border-zinc-200 dark:border-zinc-800\",\r\n ].join(\" \")}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"scope\"\r\n checked={scope === \"node\"}\r\n onChange={() => setScope(\"node\")}\r\n disabled={nodeScopeDisabled}\r\n className=\"mt-1 h-4 w-4\"\r\n />\r\n <div>\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Node\r\n </div>\r\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\r\n {mode === \"snapshot\"\r\n ? \"Pick a node currently active in the order snapshot for this primary service.\"\r\n : mode === \"props\"\r\n ? \"Pick a tag, field, or option from ServiceProps that maps to this primary service.\"\r\n : \"Node-scoped registration is unavailable without OrderSnapshot or ServiceProps.\"}\r\n </div>\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {scope === \"node\" && (\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium text-zinc-900 dark:text-zinc-100\">\r\n Node id\r\n </div>\r\n <select\r\n value={nodeId}\r\n onChange={(e) => setNodeId(e.target.value)}\r\n className=\"w-full rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100\"\r\n >\r\n <option value=\"\">Select node…</option>\r\n {nodeTargets.map((node) => (\r\n <option key={node.id} value={node.id}>\r\n [{node.kind}] {node.label} · #\r\n {String(node.serviceId)}\r\n </option>\r\n ))}\r\n </select>\r\n\r\n {nodeScopeDisabled ? (\r\n <div className=\"text-xs text-zinc-500 dark:text-zinc-400\">\r\n {mode === \"snapshot\"\r\n ? \"No active snapshot nodes were found for this primary service.\"\r\n : mode === \"props\"\r\n ? \"No ServiceProps nodes were found for this primary service.\"\r\n : \"Node-scoped registration requires either OrderSnapshot or ServiceProps.\"}\r\n </div>\r\n ) : null}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center justify-end gap-2 border-t border-zinc-200 p-4 dark:border-zinc-800\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"rounded-xl border border-zinc-300 bg-white px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-200 dark:hover:bg-zinc-800\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleContinue}\r\n disabled={\r\n activeServiceId === undefined ||\r\n (scope === \"node\" && !nodeId)\r\n }\r\n className=\"rounded-xl bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction resolveNodeMeta(\r\n props: ServiceProps | undefined,\r\n nodeId: string,\r\n): { kind: \"tag\" | \"field\" | \"option\" | \"node\"; label: string } {\r\n if (!props) {\r\n return { kind: \"node\", label: nodeId };\r\n }\r\n\r\n const tag = props.filters?.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return {\r\n kind: \"tag\",\r\n label: tag.label ?? (tag as { title?: string }).title ?? tag.id,\r\n };\r\n }\r\n\r\n const field = props.fields?.find((f) => f.id === nodeId);\r\n if (field) {\r\n return {\r\n kind: \"field\",\r\n label:\r\n field.label ?? (field as { title?: string }).title ?? field.id,\r\n };\r\n }\r\n\r\n for (const fieldItem of props.fields ?? []) {\r\n const option = fieldItem.options?.find((o) => o.id === nodeId);\r\n if (option) {\r\n return {\r\n kind: \"option\",\r\n label:\r\n option.label ??\r\n (option as { title?: string }).title ??\r\n String((option as { value?: unknown }).value ?? option.id),\r\n };\r\n }\r\n }\r\n\r\n return { kind: \"node\", label: nodeId };\r\n}\r\n"],"mappings":"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","names":["_a","_b","cloneDeep","isButton","isServiceIdRef","cloneDeep","_a","out","role","cap","_a","_b","results","toId","_a","_b","node","_c","_d","isButton","getNode","passesRate","uniq","_a","clamp","isFiniteNumber","getCap","_a","_b","rejected","allowed","options","remove","bindIdsToArray","_a","_b","_a","clone","_b","_c","_d","_e","_f","_g","_a","cloneDeep","_a","f","isOptionBased","isButton","cloneDeep","_a","toId","_a","_b","filterServicesForVisibleGroup","_a","_a","_b","toId","cloneDeep","filterServicesForVisibleGroup","_a","field","createContext","useContext","useMemo","jsx","Ctx","createContext","useMemo","useContext","React","useMemo","useCallback","useEffect","useMemo","useRef","useState","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useContext","OrderFlowProvider","useRef","useState","useCallback","useMemo","useEffect","ROOT_TAG_ID","useCallback","useRef","useEffect","useState","useMemo","_a","_b","_c","jsx","str","useMemo","_a","isOptionBased","_b","_c","_d","_e","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","_a","React","React","jsx","React","remove","validateFallbacks","React","jsx","jsxs","validateFallbacks","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","useMemo","useState","jsx","jsxs","useState","useMemo","React","React","jsx","jsxs","React","React","jsx","jsxs","React","jsx","jsxs","remove","React","_a"]}