@mk-kit/ui 0.51.0 → 0.52.0

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,"file":"mk-kit-ui-block-editor.mjs","sources":["../../../projects/mk-kit/block-editor/block-model.ts","../../../projects/mk-kit/block-editor/block-registry.ts","../../../projects/mk-kit/block-editor/block-context.ts","../../../projects/mk-kit/block-editor/paragraph-block.ts","../../../projects/mk-kit/block-editor/heading-block.ts","../../../projects/mk-kit/block-editor/quote-block.ts","../../../projects/mk-kit/block-editor/list-block.ts","../../../projects/mk-kit/block-editor/code-block.ts","../../../projects/mk-kit/block-editor/image-block.ts","../../../projects/mk-kit/block-editor/image-block.html","../../../projects/mk-kit/block-editor/block-serializer.ts","../../../projects/mk-kit/block-editor/embed-block.ts","../../../projects/mk-kit/block-editor/embed-block.html","../../../projects/mk-kit/block-editor/button-block.ts","../../../projects/mk-kit/block-editor/button-block.html","../../../projects/mk-kit/block-editor/block-inserter.ts","../../../projects/mk-kit/block-editor/block-inserter.html","../../../projects/mk-kit/block-editor/block-list.ts","../../../projects/mk-kit/block-editor/block-list.html","../../../projects/mk-kit/block-editor/block-parser.ts","../../../projects/mk-kit/block-editor/block-editor.ts","../../../projects/mk-kit/block-editor/block-editor.html","../../../projects/mk-kit/block-editor/block-renderer.ts","../../../projects/mk-kit/block-editor/block-renderer.html","../../../projects/mk-kit/block-editor/index.ts","../../../projects/mk-kit/block-editor/mk-kit-ui-block-editor.ts"],"sourcesContent":["/**\n * Block document model for the mk-kit block editor.\n *\n * The model is deliberately small and 100% JSON-serialisable so a document can\n * be persisted to a database, sent over the wire, and re-hydrated without any\n * class instances or functions. All editor state lives in these plain objects.\n */\n\n/**\n * A single content block.\n *\n * `type` keys into the {@link MkBlockDefinition} registry that knows how to\n * edit, serialise and render it. `data` is a free-form, JSON-safe bag of the\n * block's own state (e.g. `{ html }` for a paragraph, `{ src, alt }` for an\n * image). `children` enables nested layout blocks (a Columns block stores its\n * columns' contents here).\n */\nexport interface MkBlock {\n /** Stable unique id (used for keying, focus and drag/move). */\n id: string;\n /** Registry type key, e.g. `paragraph`, `heading`, `columns`. */\n type: string;\n /** JSON-serialisable per-block state. */\n data: Record<string, any>;\n /** Nested blocks for layout/container blocks (e.g. columns). */\n children?: MkBlock[];\n}\n\n/** A full editor document: a version stamp plus an ordered list of blocks. */\nexport interface MkBlockDocument {\n /** Schema version, bumped when the persisted shape changes. */\n version: number;\n /** Top-level blocks, in document order. */\n blocks: MkBlock[];\n}\n\n/** Current document schema version. */\nexport const MK_BLOCK_DOCUMENT_VERSION = 1;\n\n/** An empty, valid document. */\nexport function mkEmptyDocument(): MkBlockDocument {\n return { version: MK_BLOCK_DOCUMENT_VERSION, blocks: [] };\n}\n\nlet blockCounter = 0;\n\n/**\n * Generates a reasonably unique, JSON-safe block id. Combines a monotonic\n * counter with a short random suffix so ids are unique even across documents\n * merged at runtime.\n */\nexport function mkBlockId(prefix = 'blk'): string {\n const rand = Math.random().toString(36).slice(2, 8);\n return `${prefix}-${++blockCounter}-${rand}`;\n}\n\n/** Deep-clones a block (and its subtree), assigning fresh ids. */\nexport function mkCloneBlock(block: MkBlock): MkBlock {\n return {\n id: mkBlockId(block.type),\n type: block.type,\n data: structuredCloneSafe(block.data),\n children: block.children?.map(mkCloneBlock),\n };\n}\n\n/** Structured clone with a JSON fallback for older runtimes. */\nfunction structuredCloneSafe<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return JSON.parse(JSON.stringify(value ?? null));\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { type MkBlock, mkBlockId } from './block-model';\n\n/**\n * Describes one registerable block type — the extensibility layer of the\n * editor. Mirrors Gutenberg's `registerBlockType`: consumers supply an array of\n * these (via the `blocks` input or the {@link MK_BLOCK_DEFINITIONS} token) to\n * add, remove or reconfigure the palette. The built-in set is\n * {@link MK_DEFAULT_BLOCKS}.\n */\nexport interface MkBlockDefinition {\n /** Unique type key that {@link MkBlock.type} references. */\n type: string;\n /** Human label shown in the inserter and block toolbar. */\n label: string;\n /** Optional icon (emoji or short text glyph) shown in the inserter. */\n icon?: string;\n /** Inserter grouping heading, e.g. `Text`, `Media`, `Layout`. */\n group?: string;\n /** Short description shown in the inserter. */\n description?: string;\n /** Factory returning a fresh, ready-to-edit block of this type. */\n create(): MkBlock;\n /** May this block be placed inside a Columns column? Default `true`. */\n allowedInColumns?: boolean;\n /** Keywords to match against when filtering the inserter. */\n keywords?: string[];\n /** Block types this one can transform into (by type key). */\n transforms?: string[];\n}\n\n/** Convenience factory: builds a `create()`-ready block with fresh id. */\nfunction block(type: string, data: Record<string, any> = {}, children?: MkBlock[]): MkBlock {\n return { id: mkBlockId(type), type, data, ...(children ? { children } : {}) };\n}\n\n/**\n * The default palette of built-in block definitions. Grouped for the inserter.\n * Consumers can spread this and append custom definitions, or replace it.\n *\n * The English `label`/`group`/`description` text here is only a base: the\n * editor resolves the built-in types' display text from the `blockEditor`\n * i18n strings (see `provideMkI18n`) before merging custom definitions.\n */\nexport const MK_DEFAULT_BLOCKS: MkBlockDefinition[] = [\n {\n type: 'paragraph',\n label: 'Paragraph',\n icon: '¶',\n group: 'Text',\n description: 'Rich text with inline formatting.',\n keywords: ['text', 'body', 'p'],\n transforms: ['heading', 'quote', 'code'],\n create: () => block('paragraph', { html: '' }),\n },\n {\n type: 'heading',\n label: 'Heading',\n icon: 'H',\n group: 'Text',\n description: 'A section title (H1–H4).',\n keywords: ['title', 'h1', 'h2', 'h3'],\n transforms: ['paragraph'],\n create: () => block('heading', { html: '', level: 2 }),\n },\n {\n type: 'list',\n label: 'List',\n icon: '•',\n group: 'Text',\n description: 'Bulleted or numbered list.',\n keywords: ['ul', 'ol', 'bullet', 'numbered'],\n create: () => block('list', { ordered: false, items: [''] }),\n },\n {\n type: 'quote',\n label: 'Quote',\n icon: '“',\n group: 'Text',\n description: 'A blockquote with optional citation.',\n keywords: ['blockquote', 'citation'],\n transforms: ['paragraph'],\n create: () => block('quote', { html: '', citation: '' }),\n },\n {\n type: 'code',\n label: 'Code',\n icon: '</>',\n group: 'Text',\n description: 'Preformatted, monospace code.',\n keywords: ['pre', 'snippet', 'monospace'],\n create: () => block('code', { code: '', language: '' }),\n },\n {\n type: 'image',\n label: 'Image',\n icon: '🖼',\n group: 'Media',\n description: 'Upload or link an image.',\n keywords: ['photo', 'picture', 'img', 'upload'],\n create: () => block('image', { src: '', alt: '', caption: '', align: 'center', width: 100 }),\n },\n {\n type: 'embed',\n label: 'Embed',\n icon: '▶',\n group: 'Media',\n description: 'YouTube, Vimeo or any URL.',\n keywords: ['youtube', 'vimeo', 'video', 'iframe', 'url'],\n create: () => block('embed', { url: '' }),\n },\n {\n type: 'button',\n label: 'Button',\n icon: '⬚',\n group: 'Media',\n description: 'A call-to-action link button.',\n keywords: ['cta', 'link', 'action'],\n create: () => block('button', { label: 'Click me', href: '', tone: 'primary', variant: 'solid', align: 'left' }),\n },\n {\n type: 'divider',\n label: 'Divider',\n icon: '—',\n group: 'Layout',\n description: 'A horizontal separator.',\n keywords: ['hr', 'separator', 'rule'],\n create: () => block('divider', {}),\n },\n {\n type: 'columns',\n label: 'Columns',\n icon: '▥',\n group: 'Layout',\n description: 'A responsive multi-column layout.',\n keywords: ['grid', 'layout', 'row', 'column'],\n allowedInColumns: false,\n create: () =>\n block(\n 'columns',\n { count: 2, ratio: '50-50', gap: 4, align: 'stretch', justify: 'start' },\n [block('column', {}, []), block('column', {}, [])],\n ),\n },\n];\n\n/**\n * Multi-provider injection token for adding block definitions app-wide. Each\n * provided array is merged over {@link MK_DEFAULT_BLOCKS} (by `type`). The\n * editor's `blocks` input takes final precedence.\n *\n * ```ts\n * providers: [\n * { provide: MK_BLOCK_DEFINITIONS, multi: true, useValue: [myCalloutBlock] },\n * ]\n * ```\n */\nexport const MK_BLOCK_DEFINITIONS = new InjectionToken<MkBlockDefinition[][]>(\n 'MK_BLOCK_DEFINITIONS',\n);\n\n/**\n * Async handler that persists an uploaded {@link File} and resolves to its URL.\n * Provide app-wide via this token, or per-editor via the `uploadHandler` input.\n * When absent, the Image block falls back to an inline `data:` URL.\n */\nexport type MkBlockUploadHandler = (file: File) => Promise<string>;\n\n/** App-wide upload handler token (overridable by the editor's input). */\nexport const MK_BLOCK_UPLOAD_HANDLER = new InjectionToken<MkBlockUploadHandler>(\n 'MK_BLOCK_UPLOAD_HANDLER',\n);\n\n/**\n * An allow-listed embed provider. `test` matches a pasted URL; `toEmbedUrl`\n * returns the safe iframe `src` (which is the ONLY value ever passed to\n * `DomSanitizer.bypassSecurityTrustResourceUrl`). Non-matching URLs fall back\n * to a plain link card — raw HTML is never injected.\n */\nexport interface MkEmbedProvider {\n /** Display name, e.g. `YouTube`. */\n name: string;\n /** Matches URLs this provider handles. */\n test: RegExp;\n /** Transforms a matched page URL into an embeddable iframe `src`. */\n toEmbedUrl(url: string): string | null;\n /** Aspect ratio `width / height` for the responsive frame. Default 16/9. */\n aspectRatio?: number;\n /** Allow list for the iframe `sandbox` attribute. */\n sandbox?: string;\n}\n\n/** Default embed providers: YouTube + Vimeo. */\nexport const MK_DEFAULT_EMBED_PROVIDERS: MkEmbedProvider[] = [\n {\n name: 'YouTube',\n test: /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/i,\n aspectRatio: 16 / 9,\n toEmbedUrl(url: string): string | null {\n const m = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/i,\n );\n return m ? `https://www.youtube-nocookie.com/embed/${m[1]}` : null;\n },\n },\n {\n name: 'Vimeo',\n test: /vimeo\\.com\\/(?:video\\/)?(\\d+)/i,\n aspectRatio: 16 / 9,\n toEmbedUrl(url: string): string | null {\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/i);\n return m ? `https://player.vimeo.com/video/${m[1]}` : null;\n },\n },\n];\n\n/** App-wide embed providers token (merged with the editor's input). */\nexport const MK_BLOCK_EMBED_PROVIDERS = new InjectionToken<MkEmbedProvider[][]>(\n 'MK_BLOCK_EMBED_PROVIDERS',\n);\n\n/**\n * Merges default definitions with app-token definitions and per-editor input,\n * de-duplicating by `type` (later sources win).\n */\nexport function mkMergeBlockDefinitions(\n defaults: MkBlockDefinition[],\n ...sources: (MkBlockDefinition[] | null | undefined)[]\n): MkBlockDefinition[] {\n const byType = new Map<string, MkBlockDefinition>();\n for (const def of defaults) byType.set(def.type, def);\n for (const source of sources) {\n if (!source) continue;\n for (const def of source) byType.set(def.type, def);\n }\n return [...byType.values()];\n}\n","import { ElementRef, Injectable, type Signal, computed, inject, signal } from '@angular/core';\nimport { MK_I18N, MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport type { MkBlockDefinition, MkBlockUploadHandler, MkEmbedProvider } from './block-registry';\n\n/**\n * Shared, editor-scoped context threaded to every nested `mk-block-list` and\n * block-editor component. Provided by {@link MkBlockEditor}, so deeply nested\n * blocks (e.g. inside columns) read config and coordinate focus without every\n * level re-declaring inputs.\n *\n * The config fields are plain `Signal` references that {@link MkBlockEditor}\n * connects to its input-derived signals in its constructor — i.e. BEFORE any\n * child component can inject this context — so consumers always track the live\n * source with no mirroring effects. The initial values here only serve\n * contexts created without an editor (e.g. component tests).\n */\n@Injectable()\nexport class MkBlockEditorContext {\n private readonly i18n = inject(MK_I18N);\n\n /** Active block palette (defaults merged with app/editor definitions). */\n definitions: Signal<MkBlockDefinition[]> = signal<MkBlockDefinition[]>([]);\n /** Read-only mode: content visible, editing chrome hidden. */\n readonly: Signal<boolean> = signal(false);\n /** Disabled mode (form-level). */\n disabled: Signal<boolean> = signal(false);\n /** Placeholder for empty text blocks. */\n placeholder: Signal<string> = signal(this.i18n.blockEditor.emptyBlockPlaceholder);\n /** Effective upload handler (input beats token beats data-URL fallback). */\n uploadHandler: Signal<MkBlockUploadHandler | null> = signal<MkBlockUploadHandler | null>(null);\n /** Effective embed providers (defaults + token + input). */\n embedProviders: Signal<MkEmbedProvider[]> = signal<MkEmbedProvider[]>([]);\n\n /** Root editor host, used to locate editables for focus coordination. */\n hostRef: ElementRef<HTMLElement> | null = null;\n\n /**\n * `type → definition` lookup, rebuilt only when the registry array changes.\n * `definitionFor` is called several times per block per change-detection\n * pass, so an `array.find` scan here was O(blocks × definitions) per CD.\n */\n private readonly definitionMap = computed(() => {\n const map = new Map<string, MkBlockDefinition>();\n for (const def of this.definitions()) map.set(def.type, def);\n return map;\n });\n\n constructor(private readonly announcer: MkLiveAnnouncer) {}\n\n /** Returns the definition for a block type, if registered. */\n definitionFor(type: string): MkBlockDefinition | undefined {\n return this.definitionMap().get(type);\n }\n\n /** Human label for a block type (falls back to the raw type). */\n labelFor(type: string): string {\n return this.definitionFor(type)?.label ?? type;\n }\n\n /** Announce a status change to assistive tech. */\n announce(message: string): void {\n this.announcer.announce(message, 'polite');\n }\n\n /**\n * Move focus to a block's primary editable after the next render. Queries the\n * live DOM by `data-block-id` so it works regardless of nesting depth.\n */\n focusBlock(id: string, position: 'start' | 'end' = 'end'): void {\n const root = this.hostRef?.nativeElement;\n if (!root || typeof window === 'undefined') return;\n setTimeout(() => {\n const wrapper = root.querySelector<HTMLElement>(`[data-block-id=\"${cssEscape(id)}\"]`);\n const editable = wrapper?.querySelector<HTMLElement>('[data-mk-editable]');\n const target = editable ?? wrapper?.querySelector<HTMLElement>('[data-mk-focus]');\n if (!target) return;\n target.focus();\n if (editable) placeCaret(editable, position);\n });\n }\n}\n\n/** Escapes an id for use in a CSS attribute selector. */\nfunction cssEscape(value: string): string {\n return value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\n/** Places the caret at the start or end of a contenteditable element. */\nexport function placeCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const win = el.ownerDocument.defaultView;\n const selection = win?.getSelection();\n if (!selection) return;\n const range = el.ownerDocument.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/**\n * Paragraph block — rich text stored as sanitised HTML in `block.data.html`,\n * with the floating inline toolbar provided by {@link MkRichTextEngine}.\n */\n@Component({\n selector: 'mk-paragraph-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <mk-rich-text-engine\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"readonly()\"\n [ariaLabel]=\"i18n.blockEditor.blockParagraph\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n `,\n})\nexport class MkParagraphBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly placeholder = input(this.i18n.blockEditor.emptyBlockPlaceholder);\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\nconst LEVELS = [1, 2, 3, 4] as const;\n\n/**\n * Heading block — the same rich text as a paragraph but rendered at a\n * configurable level (H1–H4), chosen from an inline settings row.\n */\n@Component({\n selector: 'mk-heading-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <div class=\"mk-heading-block__levels\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.headingLevelGroup\">\n @for (lvl of levels; track lvl) {\n <button\n type=\"button\"\n class=\"mk-heading-block__level\"\n [class.mk-heading-block__level--active]=\"level() === lvl\"\n [attr.aria-pressed]=\"level() === lvl\"\n (click)=\"setLevel(lvl)\"\n >\n H{{ lvl }}\n </button>\n }\n </div>\n }\n <mk-rich-text-engine\n class=\"mk-heading-block__text\"\n [class]=\"'mk-heading-block__text--h' + level()\"\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.headingPlaceholder(level())\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.headingLevel(level())\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-heading-block__levels {\n display: inline-flex;\n gap: 2px;\n margin-bottom: var(--mk-space-1);\n padding: 2px;\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface-2);\n }\n .mk-heading-block__level {\n min-width: 30px;\n height: 24px;\n border: none;\n border-radius: var(--mk-radius-xs);\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-xs);\n font-weight: var(--mk-font-weight-semibold);\n cursor: pointer;\n }\n .mk-heading-block__level:hover {\n background: var(--mk-hover-overlay);\n }\n .mk-heading-block__level--active {\n background: var(--mk-primary);\n color: var(--mk-primary-contrast);\n }\n .mk-heading-block__level:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n .mk-heading-block__text--h1 {\n font-size: var(--mk-font-size-3xl);\n font-weight: var(--mk-font-weight-bold);\n }\n .mk-heading-block__text--h2 {\n font-size: var(--mk-font-size-2xl);\n font-weight: var(--mk-font-weight-bold);\n }\n .mk-heading-block__text--h3 {\n font-size: var(--mk-font-size-xl);\n font-weight: var(--mk-font-weight-semibold);\n }\n .mk-heading-block__text--h4 {\n font-size: var(--mk-font-size-lg);\n font-weight: var(--mk-font-weight-semibold);\n }\n `,\n ],\n})\nexport class MkHeadingBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected readonly levels = LEVELS;\n protected readonly level = computed(() => {\n const l = this.block().data['level'];\n return LEVELS.includes(l) ? l : 2;\n });\n\n protected setLevel(level: number): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, level } });\n }\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/** Quote block — a blockquote with rich text and an optional citation line. */\n@Component({\n selector: 'mk-quote-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <blockquote class=\"mk-quote-block__quote\">\n <mk-rich-text-engine\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.blockQuote\"\n [disabled]=\"readonly()\"\n [ariaLabel]=\"i18n.blockEditor.quoteText\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n </blockquote>\n @if (!readonly() || block().data['citation']) {\n <input\n class=\"mk-quote-block__cite\"\n type=\"text\"\n [value]=\"block().data['citation'] ?? ''\"\n [disabled]=\"readonly()\"\n [placeholder]=\"i18n.blockEditor.addCitation\"\n [attr.aria-label]=\"i18n.blockEditor.citation\"\n (input)=\"onCite($event)\"\n />\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-quote-block__quote {\n margin: 0;\n padding-inline-start: var(--mk-space-4);\n border-inline-start: 4px solid var(--mk-primary);\n font-size: var(--mk-font-size-lg);\n font-style: italic;\n color: var(--mk-text);\n }\n .mk-quote-block__cite {\n margin-top: var(--mk-space-2);\n margin-inline-start: var(--mk-space-4);\n width: calc(100% - var(--mk-space-4));\n border: none;\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-sm);\n }\n .mk-quote-block__cite:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n border-radius: var(--mk-radius-xs);\n }\n `,\n ],\n})\nexport class MkQuoteBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n\n protected onCite(event: Event): void {\n const b = this.block();\n const citation = (event.target as HTMLInputElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, citation } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/** List block — a bulleted or numbered list of rich-text items. */\n@Component({\n selector: 'mk-list-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <div class=\"mk-list-block__opts\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.listStyle\">\n <button\n type=\"button\"\n class=\"mk-list-block__opt\"\n [class.mk-list-block__opt--active]=\"!ordered()\"\n [attr.aria-pressed]=\"!ordered()\"\n (click)=\"setOrdered(false)\"\n >\n • {{ i18n.blockEditor.bulleted }}\n </button>\n <button\n type=\"button\"\n class=\"mk-list-block__opt\"\n [class.mk-list-block__opt--active]=\"ordered()\"\n [attr.aria-pressed]=\"ordered()\"\n (click)=\"setOrdered(true)\"\n >\n 1. {{ i18n.blockEditor.numbered }}\n </button>\n </div>\n }\n @if (ordered()) {\n <ol class=\"mk-list-block__list\">\n @for (item of items(); track $index) {\n <li class=\"mk-list-block__item\">\n <mk-rich-text-engine\n [html]=\"item\"\n [placeholder]=\"i18n.blockEditor.listItem\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.listItem\"\n (contentChange)=\"onItem($index, $event)\"\n (splitAt)=\"onSplit($index, $event)\"\n (removeEmpty)=\"onRemove($index)\"\n />\n </li>\n }\n </ol>\n } @else {\n <ul class=\"mk-list-block__list\">\n @for (item of items(); track $index) {\n <li class=\"mk-list-block__item\">\n <mk-rich-text-engine\n [html]=\"item\"\n [placeholder]=\"i18n.blockEditor.listItem\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.listItem\"\n (contentChange)=\"onItem($index, $event)\"\n (splitAt)=\"onSplit($index, $event)\"\n (removeEmpty)=\"onRemove($index)\"\n />\n </li>\n }\n </ul>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-list-block__opts {\n display: inline-flex;\n gap: 2px;\n margin-bottom: var(--mk-space-2);\n padding: 2px;\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface-2);\n }\n .mk-list-block__opt {\n height: 24px;\n padding: 0 var(--mk-space-2);\n border: none;\n border-radius: var(--mk-radius-xs);\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-xs);\n font-weight: var(--mk-font-weight-medium);\n cursor: pointer;\n }\n .mk-list-block__opt:hover {\n background: var(--mk-hover-overlay);\n }\n .mk-list-block__opt--active {\n background: var(--mk-primary);\n color: var(--mk-primary-contrast);\n }\n .mk-list-block__opt:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n .mk-list-block__list {\n margin: 0;\n padding-inline-start: var(--mk-space-6);\n color: var(--mk-text);\n }\n .mk-list-block__item {\n margin: var(--mk-space-1) 0;\n }\n `,\n ],\n})\nexport class MkListBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly ordered = computed(() => !!this.block().data['ordered']);\n protected readonly items = computed<string[]>(() => {\n const items = this.block().data['items'];\n return Array.isArray(items) && items.length ? items : [''];\n });\n\n protected setOrdered(ordered: boolean): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ordered } });\n }\n\n protected onItem(index: number, html: string): void {\n const items = [...this.items()];\n items[index] = html;\n this.emitItems(items);\n }\n\n protected onSplit(index: number, split: MkRichTextSplit): void {\n const items = [...this.items()];\n items[index] = split.before;\n items.splice(index + 1, 0, split.after);\n this.emitItems(items);\n }\n\n protected onRemove(index: number): void {\n const items = [...this.items()];\n if (items.length <= 1) return;\n items.splice(index, 1);\n this.emitItems(items);\n }\n\n private emitItems(items: string[]): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, items } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\n\n/**\n * Code block — a plain, monospace, preformatted text area. Content is stored as\n * raw text (never executed, never interpreted as HTML) in `block.data.code`.\n */\n@Component({\n selector: 'mk-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <input\n class=\"mk-code-block__lang\"\n type=\"text\"\n [value]=\"block().data['language'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.codeLanguagePlaceholder\"\n [attr.aria-label]=\"i18n.blockEditor.codeLanguage\"\n (input)=\"onLang($event)\"\n />\n }\n <textarea\n class=\"mk-code-block__area\"\n data-mk-focus\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n [value]=\"block().data['code'] ?? ''\"\n [readOnly]=\"readonly()\"\n [rows]=\"rows()\"\n [placeholder]=\"i18n.blockEditor.enterCode\"\n [attr.aria-label]=\"i18n.blockEditor.blockCode\"\n (input)=\"onCode($event)\"\n ></textarea>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-code-block__lang {\n display: block;\n margin-bottom: var(--mk-space-1);\n padding: var(--mk-space-1) var(--mk-space-2);\n border: var(--mk-border-width) solid var(--mk-border);\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface);\n color: var(--mk-text-muted);\n font-family: var(--mk-font-mono);\n font-size: var(--mk-font-size-xs);\n }\n .mk-code-block__area {\n display: block;\n width: 100%;\n min-height: 4em;\n padding: var(--mk-space-3);\n border: var(--mk-border-width) solid var(--mk-border);\n border-radius: var(--mk-radius-md);\n background: var(--mk-code-bg);\n color: var(--mk-text);\n font-family: var(--mk-font-mono);\n font-size: var(--mk-font-size-sm);\n line-height: var(--mk-line-height-normal);\n resize: vertical;\n tab-size: 2;\n }\n .mk-code-block__area:focus-visible,\n .mk-code-block__lang:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n `,\n ],\n})\nexport class MkCodeBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected rows(): number {\n const lines = String(this.block().data['code'] ?? '').split('\\n').length;\n return Math.max(3, Math.min(30, lines + 1));\n }\n\n protected onCode(event: Event): void {\n const b = this.block();\n const code = (event.target as HTMLTextAreaElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, code } });\n }\n\n protected onLang(event: Event): void {\n const b = this.block();\n const language = (event.target as HTMLInputElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, language } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkBlockEditorContext } from './block-context';\n\ntype ImageAlign = 'left' | 'center' | 'right';\n\n/**\n * Image block — upload (file picker or drag-drop) or paste a URL. If an\n * `uploadHandler` is configured (editor input or {@link MK_BLOCK_UPLOAD_HANDLER}\n * token) it is used to persist the file and get back a URL; otherwise the file\n * is read as an inline `data:` URL via `FileReader`. Supports alt text,\n * caption, width and alignment.\n */\n@Component({\n selector: 'mk-image-block',\n templateUrl: './image-block.html',\n styleUrl: './image-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkImageBlock {\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly aligns: ImageAlign[] = ['left', 'center', 'right'];\n protected readonly uploading = signal(false);\n protected readonly error = signal<string | null>(null);\n protected readonly dragActive = signal(false);\n\n protected src(): string {\n return this.block().data['src'] ?? '';\n }\n\n /** Localised caption for an alignment option. */\n protected alignLabel(align: ImageAlign): string {\n const s = this.i18n.blockEditor;\n return { left: s.alignLeft, center: s.alignCenter, right: s.alignRight }[align];\n }\n\n protected openPicker(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n protected onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.handleFile(file);\n input.value = '';\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragActive.set(false);\n if (this.readonly()) return;\n const file = event.dataTransfer?.files?.[0];\n if (file) this.handleFile(file);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.readonly()) return;\n event.preventDefault();\n this.dragActive.set(true);\n }\n\n protected onDragLeave(): void {\n this.dragActive.set(false);\n }\n\n protected onUrl(event: Event): void {\n const value = (event.target as HTMLInputElement).value.trim();\n this.patch({ src: value });\n }\n\n protected onAlt(event: Event): void {\n this.patch({ alt: (event.target as HTMLInputElement).value });\n }\n\n protected onCaption(event: Event): void {\n this.patch({ caption: (event.target as HTMLInputElement).value });\n }\n\n protected setAlign(align: ImageAlign): void {\n this.patch({ align });\n }\n\n protected onWidth(event: Event): void {\n this.patch({ width: Number((event.target as HTMLInputElement).value) });\n }\n\n protected clear(): void {\n this.patch({ src: '' });\n }\n\n private async handleFile(file: File): Promise<void> {\n if (!file.type.startsWith('image/')) {\n this.error.set(this.i18n.blockEditor.notAnImage);\n return;\n }\n this.error.set(null);\n this.uploading.set(true);\n try {\n const handler = this.ctx.uploadHandler();\n const url = handler ? await handler(file) : await this.readAsDataUrl(file);\n this.patch({ src: url, alt: this.block().data['alt'] || file.name });\n this.ctx.announce(this.i18n.blockEditor.imageAdded);\n } catch {\n this.error.set(this.i18n.blockEditor.uploadFailed);\n } finally {\n this.uploading.set(false);\n }\n }\n\n private readAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n }\n\n private patch(data: Record<string, any>): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ...data } });\n }\n}\n","<input\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n class=\"mk-image-block__file\"\n hidden\n (change)=\"onFileSelected($event)\"\n/>\n\n@if (src()) {\n <figure\n class=\"mk-image-block__figure\"\n [class.mk-image-block__figure--left]=\"block().data['align'] === 'left'\"\n [class.mk-image-block__figure--right]=\"block().data['align'] === 'right'\"\n >\n <img\n class=\"mk-image-block__img\"\n [src]=\"src()\"\n [alt]=\"block().data['alt'] ?? ''\"\n [style.width.%]=\"block().data['width'] || 100\"\n />\n @if (block().data['caption'] || !readonly()) {\n <figcaption class=\"mk-image-block__caption\">{{ block().data['caption'] }}</figcaption>\n }\n </figure>\n\n @if (!readonly()) {\n <div class=\"mk-image-block__settings\">\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.altText }}</span>\n <input type=\"text\" [value]=\"block().data['alt'] ?? ''\" (input)=\"onAlt($event)\" />\n </label>\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.caption }}</span>\n <input type=\"text\" [value]=\"block().data['caption'] ?? ''\" (input)=\"onCaption($event)\" />\n </label>\n <div class=\"mk-image-block__field\">\n <span id=\"mk-img-align\">{{ i18n.blockEditor.alignment }}</span>\n <div class=\"mk-image-block__aligns\" role=\"group\" aria-labelledby=\"mk-img-align\">\n @for (a of aligns; track a) {\n <button\n type=\"button\"\n class=\"mk-image-block__align\"\n [class.mk-image-block__align--active]=\"(block().data['align'] ?? 'center') === a\"\n [attr.aria-pressed]=\"(block().data['align'] ?? 'center') === a\"\n (click)=\"setAlign(a)\"\n >\n {{ alignLabel(a) }}\n </button>\n }\n </div>\n </div>\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.imageWidth(block().data['width'] || 100) }}</span>\n <input\n type=\"range\"\n min=\"20\"\n max=\"100\"\n step=\"5\"\n [value]=\"block().data['width'] || 100\"\n (input)=\"onWidth($event)\"\n />\n </label>\n <button type=\"button\" class=\"mk-image-block__replace\" (click)=\"clear()\">\n {{ i18n.blockEditor.replaceImage }}\n </button>\n </div>\n }\n} @else {\n <div\n class=\"mk-image-block__drop\"\n [class.mk-image-block__drop--active]=\"dragActive()\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave()\"\n >\n @if (uploading()) {\n <p class=\"mk-image-block__hint\">{{ i18n.blockEditor.uploading }}</p>\n } @else {\n <p class=\"mk-image-block__icon\" aria-hidden=\"true\">🖼</p>\n <p class=\"mk-image-block__hint\">{{ i18n.blockEditor.dropImagePrompt }}</p>\n <button\n type=\"button\"\n class=\"mk-image-block__upload\"\n data-mk-focus\n [disabled]=\"readonly()\"\n (click)=\"openPicker()\"\n >\n {{ i18n.blockEditor.chooseFile }}\n </button>\n <label class=\"mk-image-block__url\">\n <span class=\"mk-visually-hidden\">{{ i18n.blockEditor.imageUrl }}</span>\n <input\n type=\"url\"\n [placeholder]=\"i18n.blockEditor.pasteImageUrl\"\n [disabled]=\"readonly()\"\n (change)=\"onUrl($event)\"\n />\n </label>\n }\n @if (error()) {\n <p class=\"mk-image-block__error\" role=\"alert\">{{ error() }}</p>\n }\n </div>\n}\n","import { sanitizeInlineHtml } from '@mk-kit/ui/rich-text';\nimport type { MkBlock, MkBlockDocument } from './block-model';\n\n/**\n * Pure HTML/text serialisers for a {@link MkBlockDocument}.\n *\n * SECURITY MODEL: text blocks (`paragraph`, `heading`, `quote`, `list`) store\n * HTML authored through the editor's restricted formatting commands. Before it\n * ever reaches a string of markup here it is passed through\n * {@link sanitizeInlineHtml} (from `@mk-kit/ui/rich-text`), an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs.\n * `mk-block-renderer` additionally re-sanitises through Angular's\n * `DomSanitizer` at display time. These serialisers are dependency-free so\n * they can run on a server (SSG/SSR) — never feed their output back into\n * `innerHTML` without sanitising again.\n */\n\n// Re-exported for backward compatibility — the implementation moved to the\n// rich-text entry alongside the editing surface it protects.\nexport { sanitizeInlineHtml };\n\n/** Escapes text for safe placement in element content. */\nexport function mkEscapeHtml(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nexport function mkEscapeAttr(value: string): string {\n return mkEscapeHtml(value).replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nexport function mkIsSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/** Maps a ratio preset like `66-33` to a CSS `grid-template-columns` value. */\nexport function mkRatioToColumns(ratio: string, count: number): string {\n const parts = String(ratio ?? '')\n .split('-')\n .map((n) => parseFloat(n))\n .filter((n) => !isNaN(n) && n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${Math.max(1, count || 1)}, 1fr)`;\n}\n\nconst HEADING_LEVELS = new Set([1, 2, 3, 4]);\n\n/** Serialises one block to a semantic HTML string. */\nfunction blockToHtml(b: MkBlock): string {\n switch (b.type) {\n case 'paragraph':\n return `<p>${sanitizeInlineHtml(b.data['html'] ?? '')}</p>`;\n\n case 'heading': {\n const level = HEADING_LEVELS.has(b.data['level']) ? b.data['level'] : 2;\n return `<h${level}>${sanitizeInlineHtml(b.data['html'] ?? '')}</h${level}>`;\n }\n\n case 'list': {\n const ordered = !!b.data['ordered'];\n const tag = ordered ? 'ol' : 'ul';\n const items: string[] = Array.isArray(b.data['items']) ? b.data['items'] : [];\n const li = items.map((it) => `<li>${sanitizeInlineHtml(it ?? '')}</li>`).join('');\n return `<${tag}>${li}</${tag}>`;\n }\n\n case 'quote': {\n const cite = String(b.data['citation'] ?? '').trim();\n const citeHtml = cite ? `<cite>${mkEscapeHtml(cite)}</cite>` : '';\n return `<blockquote><p>${sanitizeInlineHtml(b.data['html'] ?? '')}</p>${citeHtml}</blockquote>`;\n }\n\n case 'code': {\n const code = mkEscapeHtml(b.data['code'] ?? '');\n const lang = String(b.data['language'] ?? '').trim();\n const cls = lang ? ` class=\"language-${mkEscapeAttr(lang)}\"` : '';\n return `<pre><code${cls}>${code}</code></pre>`;\n }\n\n case 'image': {\n const src = String(b.data['src'] ?? '');\n if (!mkIsSafeUrl(src) || !src) return '';\n const align = String(b.data['align'] ?? 'center');\n const width = Number(b.data['width']) || 100;\n const alt = mkEscapeAttr(b.data['alt'] ?? '');\n const caption = String(b.data['caption'] ?? '').trim();\n const figStyle = `text-align:${align === 'left' ? 'left' : align === 'right' ? 'right' : 'center'};margin:1rem 0;`;\n const img = `<img src=\"${mkEscapeAttr(src)}\" alt=\"${alt}\" style=\"max-width:${Math.min(100, Math.max(10, width))}%;height:auto;border-radius:.5rem;\" loading=\"lazy\">`;\n const cap = caption ? `<figcaption style=\"font-size:.875rem;opacity:.75;margin-top:.5rem;\">${mkEscapeHtml(caption)}</figcaption>` : '';\n return `<figure style=\"${figStyle}\">${img}${cap}</figure>`;\n }\n\n case 'button': {\n const href = String(b.data['href'] ?? '');\n const label = mkEscapeHtml(b.data['label'] ?? 'Button');\n const align = String(b.data['align'] ?? 'left');\n const safe = mkIsSafeUrl(href) && href ? mkEscapeAttr(href) : '#';\n const wrapStyle = `text-align:${align};margin:1rem 0;`;\n const btnStyle =\n 'display:inline-block;padding:.6rem 1.1rem;border-radius:.5rem;text-decoration:none;font-weight:600;';\n return `<div style=\"${wrapStyle}\"><a href=\"${safe}\" class=\"mk-cta mk-cta--${mkEscapeAttr(b.data['tone'] ?? 'primary')}\" style=\"${btnStyle}\" rel=\"noopener noreferrer\">${label}</a></div>`;\n }\n\n case 'divider':\n return '<hr>';\n\n case 'embed': {\n const url = String(b.data['url'] ?? '');\n const embedUrl = String(b.data['embedUrl'] ?? '');\n const ratio = Number(b.data['aspectRatio']) || 16 / 9;\n if (embedUrl && mkIsSafeUrl(embedUrl)) {\n const pad = (100 / ratio).toFixed(3);\n return (\n `<div class=\"mk-embed\" style=\"position:relative;width:100%;padding-top:${pad}%;margin:1rem 0;\">` +\n `<iframe src=\"${mkEscapeAttr(embedUrl)}\" title=\"Embedded content\" loading=\"lazy\" ` +\n `sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\" ` +\n `referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen ` +\n `style=\"position:absolute;inset:0;width:100%;height:100%;border:0;border-radius:.5rem;\"></iframe></div>`\n );\n }\n if (mkIsSafeUrl(url) && url) {\n return `<p class=\"mk-embed-fallback\"><a href=\"${mkEscapeAttr(url)}\" rel=\"noopener noreferrer\" target=\"_blank\">${mkEscapeHtml(url)}</a></p>`;\n }\n return '';\n }\n\n case 'columns': {\n const count = Number(b.data['count']) || (b.children?.length ?? 2);\n const cols = mkRatioToColumns(b.data['ratio'] ?? '', count);\n const gap = (Number(b.data['gap']) || 4) * 0.25;\n const align = String(b.data['align'] ?? 'stretch');\n const justify = String(b.data['justify'] ?? 'start');\n const justifyMap: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n const style =\n `display:grid;grid-template-columns:${cols};gap:${gap}rem;align-items:${align};` +\n `justify-content:${justifyMap[justify] ?? 'flex-start'};margin:1rem 0;`;\n const columns = (b.children ?? [])\n .map((col) => `<div class=\"mk-column\">${(col.children ?? []).map(blockToHtml).join('')}</div>`)\n .join('');\n return `<div class=\"mk-columns\" style=\"${style}\">${columns}</div>`;\n }\n\n case 'column':\n return (b.children ?? []).map(blockToHtml).join('');\n\n default:\n return '';\n }\n}\n\n/**\n * Serialises a document to clean, semantic, self-contained HTML — the \"rich\n * HTML content\" you persist and publish for a blog post or content page.\n * Layout blocks become responsive grid wrappers with inline styles.\n */\nexport function mkBlocksToHtml(doc: MkBlockDocument | null | undefined): string {\n if (!doc?.blocks?.length) return '';\n return doc.blocks.map(blockToHtml).join('\\n');\n}\n\n/** Strips all tags, collapsing a block to its text content. */\nfunction stripTags(html: string): string {\n return String(html ?? '')\n .replace(/<[^>]*>/g, ' ')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Collects the plain-text content of a block subtree. */\nfunction blockToText(b: MkBlock): string {\n switch (b.type) {\n case 'paragraph':\n case 'heading':\n case 'quote':\n return stripTags(b.data['html'] ?? '');\n case 'list':\n return (Array.isArray(b.data['items']) ? b.data['items'] : [])\n .map((i: string) => stripTags(i))\n .filter(Boolean)\n .join(' · ');\n case 'code':\n return String(b.data['code'] ?? '').trim();\n case 'image':\n return String(b.data['caption'] ?? b.data['alt'] ?? '').trim();\n case 'button':\n return String(b.data['label'] ?? '').trim();\n case 'embed':\n return String(b.data['url'] ?? '').trim();\n case 'columns':\n case 'column':\n return (b.children ?? [])\n .map((c) => (c.type === 'column' ? blockToText(c) : blockToText(c)))\n .filter(Boolean)\n .join(' ');\n default:\n return '';\n }\n}\n\n/**\n * Serialises a document to plain text — handy for previews, excerpts, search\n * indexes and meta descriptions.\n */\nexport function mkBlocksToText(doc: MkBlockDocument | null | undefined): string {\n if (!doc?.blocks?.length) return '';\n return doc.blocks\n .map(blockToText)\n .filter((t) => t.length > 0)\n .join('\\n\\n');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkBlockEditorContext } from './block-context';\nimport { mkIsSafeUrl } from './block-serializer';\n\n/**\n * Embed block — paste a URL; matching allow-listed providers (YouTube, Vimeo,\n * plus any supplied via `embedProviders`) render a SANDBOXED iframe. The only\n * value passed to `DomSanitizer.bypassSecurityTrustResourceUrl` is the\n * provider-transformed embed URL (never the raw pasted string). Non-matching\n * URLs fall back to a safe link card — raw HTML is never injected.\n */\n@Component({\n selector: 'mk-embed-block',\n templateUrl: './embed-block.html',\n styleUrl: './embed-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkEmbedBlock {\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly sanitizer = inject(DomSanitizer);\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly embedUrl = computed<string>(() => this.block().data['embedUrl'] ?? '');\n protected readonly url = computed<string>(() => this.block().data['url'] ?? '');\n protected readonly aspectRatio = computed(() => Number(this.block().data['aspectRatio']) || 16 / 9);\n protected readonly providerName = computed<string>(() => this.block().data['provider'] ?? '');\n protected readonly paddingTop = computed(() => `${100 / this.aspectRatio()}%`);\n\n /** Only ever wraps a provider-transformed URL — see the class doc. */\n protected readonly safeSrc = computed<SafeResourceUrl | null>(() => {\n const src = this.embedUrl();\n if (!src || !mkIsSafeUrl(src) || !/^https:\\/\\//i.test(src)) return null;\n return this.sanitizer.bypassSecurityTrustResourceUrl(src);\n });\n\n protected readonly hasFallback = computed(\n () => !this.embedUrl() && !!this.url() && mkIsSafeUrl(this.url()),\n );\n\n protected onUrl(event: Event): void {\n const raw = (event.target as HTMLInputElement).value.trim();\n this.resolve(raw);\n }\n\n private resolve(raw: string): void {\n const b = this.block();\n if (!raw) {\n this.blockChange.emit({ ...b, data: { ...b.data, url: '', embedUrl: '', provider: '' } });\n return;\n }\n for (const provider of this.ctx.embedProviders()) {\n if (provider.test.test(raw)) {\n const embedUrl = provider.toEmbedUrl(raw);\n if (embedUrl) {\n this.blockChange.emit({\n ...b,\n data: {\n ...b.data,\n url: raw,\n embedUrl,\n provider: provider.name,\n aspectRatio: provider.aspectRatio ?? 16 / 9,\n },\n });\n this.ctx.announce(this.i18n.blockEditor.embedAdded(provider.name));\n return;\n }\n }\n }\n // No provider matched — keep the URL for the safe link-card fallback.\n this.blockChange.emit({ ...b, data: { ...b.data, url: raw, embedUrl: '', provider: '' } });\n }\n}\n","@if (safeSrc()) {\n <div class=\"mk-embed-block__frame\" [style.padding-top]=\"paddingTop()\">\n <iframe\n class=\"mk-embed-block__iframe\"\n [src]=\"safeSrc()\"\n [title]=\"i18n.blockEditor.embedTitle(providerName())\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\"\n allowfullscreen\n ></iframe>\n </div>\n} @else if (hasFallback()) {\n <a class=\"mk-embed-block__card\" [href]=\"url()\" target=\"_blank\" rel=\"noopener noreferrer\">\n <span class=\"mk-embed-block__card-icon\" aria-hidden=\"true\">🔗</span>\n <span class=\"mk-embed-block__card-body\">\n <span class=\"mk-embed-block__card-title\">{{ i18n.blockEditor.externalContent }}</span>\n <span class=\"mk-embed-block__card-url\">{{ url() }}</span>\n </span>\n </a>\n}\n\n@if (!readonly()) {\n <label class=\"mk-embed-block__input\">\n <span class=\"mk-visually-hidden\">{{ i18n.blockEditor.embedUrl }}</span>\n <input\n type=\"url\"\n data-mk-focus\n [value]=\"url()\"\n [placeholder]=\"i18n.blockEditor.pasteEmbedUrl\"\n (change)=\"onUrl($event)\"\n />\n </label>\n @if (url() && !safeSrc() && !hasFallback()) {\n <p class=\"mk-embed-block__note\">{{ i18n.blockEditor.embedFallbackNote }}</p>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkTone, MkVariant } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\n\ntype Align = 'left' | 'center' | 'right';\n\nconst TONES: MkTone[] = ['primary', 'neutral', 'success', 'warning', 'danger', 'info'];\n\n/**\n * Button/CTA block — a themed call-to-action link with configurable label,\n * href, tone, variant and alignment. Styling mirrors the mk-kit button tokens.\n */\n@Component({\n selector: 'mk-button-block',\n templateUrl: './button-block.html',\n styleUrl: './button-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkButtonBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly tones = TONES;\n protected readonly aligns: Align[] = ['left', 'center', 'right'];\n protected readonly variants: MkVariant[] = ['solid', 'soft', 'outline'];\n\n protected data(key: string): any {\n return this.block().data[key];\n }\n\n /** Localised captions for the tone / variant / alignment option buttons. */\n protected toneLabel(tone: MkTone): string {\n const s = this.i18n.blockEditor;\n const map: Record<MkTone, string> = {\n primary: s.tonePrimary,\n neutral: s.toneNeutral,\n success: s.toneSuccess,\n warning: s.toneWarning,\n danger: s.toneDanger,\n info: s.toneInfo,\n };\n return map[tone];\n }\n protected variantLabel(variant: MkVariant): string {\n const s = this.i18n.blockEditor;\n const map: Partial<Record<MkVariant, string>> = {\n solid: s.variantSolid,\n soft: s.variantSoft,\n outline: s.variantOutline,\n };\n return map[variant] ?? variant;\n }\n protected alignLabel(align: Align): string {\n const s = this.i18n.blockEditor;\n return { left: s.alignLeft, center: s.alignCenter, right: s.alignRight }[align];\n }\n\n protected onLabel(event: Event): void {\n this.patch({ label: (event.target as HTMLInputElement).value });\n }\n protected onHref(event: Event): void {\n this.patch({ href: (event.target as HTMLInputElement).value.trim() });\n }\n protected setTone(tone: MkTone): void {\n this.patch({ tone });\n }\n protected setVariant(variant: MkVariant): void {\n this.patch({ variant });\n }\n protected setAlign(align: Align): void {\n this.patch({ align });\n }\n\n private patch(data: Record<string, any>): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ...data } });\n }\n}\n","<div\n class=\"mk-button-block__preview\"\n [class.mk-button-block__preview--center]=\"(data('align') ?? 'left') === 'center'\"\n [class.mk-button-block__preview--right]=\"(data('align') ?? 'left') === 'right'\"\n>\n <a\n class=\"mk-cta\"\n [class.mk-cta--soft]=\"data('variant') === 'soft'\"\n [class.mk-cta--outline]=\"data('variant') === 'outline'\"\n [attr.data-tone]=\"data('tone') ?? 'primary'\"\n [attr.href]=\"readonly() ? (data('href') || null) : null\"\n [attr.target]=\"readonly() ? '_blank' : null\"\n rel=\"noopener noreferrer\"\n data-mk-focus\n >\n {{ data('label') || i18n.blockEditor.blockButton }}\n </a>\n</div>\n\n@if (!readonly()) {\n <div class=\"mk-button-block__settings\">\n <label class=\"mk-button-block__field\">\n <span>{{ i18n.blockEditor.buttonLabel }}</span>\n <input type=\"text\" [value]=\"data('label') ?? ''\" (input)=\"onLabel($event)\" />\n </label>\n <label class=\"mk-button-block__field\">\n <span>{{ i18n.blockEditor.buttonLink }}</span>\n <input type=\"url\" [value]=\"data('href') ?? ''\" placeholder=\"https://…\" (input)=\"onHref($event)\" />\n </label>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-tone\">{{ i18n.blockEditor.buttonTone }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-tone\">\n @for (t of tones; track t) {\n <button\n type=\"button\"\n class=\"mk-button-block__swatch\"\n [attr.data-tone]=\"t\"\n [class.mk-button-block__swatch--active]=\"(data('tone') ?? 'primary') === t\"\n [attr.aria-pressed]=\"(data('tone') ?? 'primary') === t\"\n [attr.aria-label]=\"toneLabel(t)\"\n [title]=\"toneLabel(t)\"\n (click)=\"setTone(t)\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-variant\">{{ i18n.blockEditor.buttonVariant }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-variant\">\n @for (v of variants; track v) {\n <button\n type=\"button\"\n class=\"mk-button-block__pill\"\n [class.mk-button-block__pill--active]=\"(data('variant') ?? 'solid') === v\"\n [attr.aria-pressed]=\"(data('variant') ?? 'solid') === v\"\n (click)=\"setVariant(v)\"\n >\n {{ variantLabel(v) }}\n </button>\n }\n </div>\n </div>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-align\">{{ i18n.blockEditor.alignment }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-align\">\n @for (a of aligns; track a) {\n <button\n type=\"button\"\n class=\"mk-button-block__pill\"\n [class.mk-button-block__pill--active]=\"(data('align') ?? 'left') === a\"\n [attr.aria-pressed]=\"(data('align') ?? 'left') === a\"\n (click)=\"setAlign(a)\"\n >\n {{ alignLabel(a) }}\n </button>\n }\n </div>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n DestroyRef,\n ElementRef,\n Injectable,\n OnDestroy,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlockDefinition } from './block-registry';\n\n/** A definition annotated with its index in the flat filtered list. */\ninterface IndexedDef {\n def: MkBlockDefinition;\n /** Global index within `filtered()` — drives active-option highlighting. */\n index: number;\n}\n\n/** A group of definitions for the inserter list. */\ninterface DefGroup {\n name: string;\n items: IndexedDef[];\n}\n\n/**\n * Shares ONE capture-phase document `pointerdown` listener between every\n * mounted {@link MkBlockInserter} (a block list renders an inserter per block,\n * so per-instance listeners made document dispatch O(blocks)). The listener is\n * attached lazily with the first registration and detached when the last\n * callback unregisters. No-ops on the server (SSR).\n */\n@Injectable({ providedIn: 'root' })\nexport class MkDocumentPointerdownRegistry {\n private readonly document = inject(DOCUMENT);\n private readonly callbacks = new Set<(event: Event) => void>();\n private readonly listener = (event: Event): void => {\n // Copy so a callback closing (and unregistering) mid-dispatch is safe.\n for (const callback of [...this.callbacks]) callback(event);\n };\n\n /** Registers a callback; returns an unregister function. */\n register(callback: (event: Event) => void): () => void {\n if (typeof window === 'undefined') return () => {};\n if (this.callbacks.size === 0) {\n this.document.addEventListener('pointerdown', this.listener, true);\n }\n this.callbacks.add(callback);\n return () => {\n if (!this.callbacks.delete(callback)) return;\n if (this.callbacks.size === 0) {\n this.document.removeEventListener('pointerdown', this.listener, true);\n }\n };\n }\n}\n\n/**\n * Block inserter — a \"+ Add block\" control that opens a filterable, keyboard\n * accessible palette of the configured blocks, grouped by `group`. Renders\n * either as a full button or a slim between-blocks divider trigger.\n *\n * Keyboard: type to filter, ArrowUp/Down to move, Enter to insert, Esc to\n * close. Implements the combobox → listbox pattern.\n */\n@Component({\n selector: 'mk-block-inserter',\n templateUrl: './block-inserter.html',\n styleUrl: './block-inserter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-block-inserter',\n '[class.mk-block-inserter--slim]': \"variant() === 'slim'\",\n },\n})\nexport class MkBlockInserter implements OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly searchRef = viewChild<ElementRef<HTMLInputElement>>('search');\n protected readonly i18n = inject(MK_I18N);\n private focusTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // One shared document listener for all inserters (instead of N host\n // `(document:pointerdown)` bindings — one per rendered inserter).\n const unregister = inject(MkDocumentPointerdownRegistry).register((event) =>\n this.onDocumentPointerdown(event),\n );\n inject(DestroyRef).onDestroy(unregister);\n }\n\n ngOnDestroy(): void {\n if (this.focusTimer !== null) {\n clearTimeout(this.focusTimer);\n this.focusTimer = null;\n }\n }\n\n /** The blocks to offer. */\n readonly definitions = input<MkBlockDefinition[]>([]);\n /** Trigger presentation: `button` (default) or `slim` between-blocks rule. */\n readonly variant = input<'button' | 'slim'>('button');\n /** Trigger label. */\n readonly label = input<string>(this.i18n.blockEditor.addBlock);\n /** Disable the trigger. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** When true, only blocks allowed inside columns are shown. */\n readonly columnsOnly = input(false, { transform: booleanAttribute });\n\n /** Emitted with the chosen definition. */\n readonly pick = output<MkBlockDefinition>();\n\n protected readonly open = signal(false);\n protected readonly query = signal('');\n protected readonly activeIndex = signal(0);\n protected readonly panelId = mkUniqueId('mk-inserter-panel');\n protected readonly listId = mkUniqueId('mk-inserter-list');\n\n protected readonly available = computed(() =>\n this.definitions().filter((d) => (this.columnsOnly() ? d.allowedInColumns !== false : true)),\n );\n\n /** Flat, filtered list in display order (used for keyboard navigation). */\n protected readonly filtered = computed(() => {\n const q = this.query().trim().toLowerCase();\n if (!q) return this.available();\n return this.available().filter((d) => {\n const hay = [d.label, d.type, d.group ?? '', ...(d.keywords ?? [])].join(' ').toLowerCase();\n return hay.includes(q);\n });\n });\n\n /**\n * Filtered list grouped by `group` for rendering, with each option carrying\n * its flat index (single pass — the template previously resolved each\n * option's index with three `indexOf` scans, O(n²) per render).\n */\n protected readonly groups = computed<DefGroup[]>(() => {\n const map = new Map<string, IndexedDef[]>();\n this.filtered().forEach((def, index) => {\n const key = def.group ?? this.i18n.blockEditor.blocks;\n (map.get(key) ?? map.set(key, []).get(key)!).push({ def, index });\n });\n return [...map.entries()].map(([name, items]) => ({ name, items }));\n });\n\n protected optionId(index: number): string {\n return `${this.listId}-opt-${index}`;\n }\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n private openPanel(): void {\n this.open.set(true);\n this.query.set('');\n this.activeIndex.set(0);\n if (this.focusTimer !== null) clearTimeout(this.focusTimer);\n this.focusTimer = setTimeout(() => {\n this.focusTimer = null;\n this.searchRef()?.nativeElement.focus();\n });\n }\n\n protected close(): void {\n if (!this.open()) return;\n this.open.set(false);\n }\n\n protected onQuery(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const list = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.activeIndex.update((i) => (list.length ? (i + 1) % list.length : 0));\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.activeIndex.update((i) => (list.length ? (i - 1 + list.length) % list.length : 0));\n break;\n case 'Enter':\n event.preventDefault();\n if (list[this.activeIndex()]) this.choose(list[this.activeIndex()]);\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n protected choose(def: MkBlockDefinition): void {\n this.pick.emit(def);\n this.close();\n }\n\n protected onDocumentPointerdown(event: Event): void {\n if (!this.open()) return;\n if (!this.host.nativeElement.contains(event.target as Node)) this.close();\n }\n}\n","@if (variant() === 'slim') {\n <button\n type=\"button\"\n class=\"mk-block-inserter__slim-trigger\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.blockEditor.insertBlockHere\"\n (click)=\"toggle()\"\n >\n <span class=\"mk-block-inserter__plus\" aria-hidden=\"true\">+</span>\n </button>\n} @else {\n <button\n type=\"button\"\n class=\"mk-block-inserter__trigger\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\"\n >\n <span class=\"mk-block-inserter__plus\" aria-hidden=\"true\">+</span>\n {{ label() }}\n </button>\n}\n\n@if (open()) {\n <div class=\"mk-block-inserter__panel\" [id]=\"panelId\" role=\"dialog\" [attr.aria-label]=\"i18n.blockEditor.blockInserter\">\n <input\n #search\n type=\"text\"\n class=\"mk-block-inserter__search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"filtered().length ? optionId(activeIndex()) : null\"\n [placeholder]=\"i18n.blockEditor.searchBlocks\"\n [value]=\"query()\"\n (input)=\"onQuery($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n\n <div class=\"mk-block-inserter__list\" [id]=\"listId\" role=\"listbox\" [attr.aria-label]=\"i18n.blockEditor.blocks\">\n @for (group of groups(); track group.name) {\n <div class=\"mk-block-inserter__group\" role=\"group\" [attr.aria-label]=\"group.name\">\n <div class=\"mk-block-inserter__group-label\">{{ group.name }}</div>\n @for (item of group.items; track item.def.type) {\n <button\n type=\"button\"\n class=\"mk-block-inserter__option\"\n [class.mk-block-inserter__option--active]=\"item.index === activeIndex()\"\n [id]=\"optionId(item.index)\"\n role=\"option\"\n [attr.aria-selected]=\"item.index === activeIndex()\"\n (mouseenter)=\"activeIndex.set(item.index)\"\n (click)=\"choose(item.def)\"\n >\n <span class=\"mk-block-inserter__icon\" aria-hidden=\"true\">{{ item.def.icon ?? '▢' }}</span>\n <span class=\"mk-block-inserter__text\">\n <span class=\"mk-block-inserter__name\">{{ item.def.label }}</span>\n @if (item.def.description) {\n <span class=\"mk-block-inserter__desc\">{{ item.def.description }}</span>\n }\n </span>\n </button>\n }\n </div>\n }\n @if (!filtered().length) {\n <p class=\"mk-block-inserter__empty\">{{ i18n.blockEditor.noBlocksMatch(query()) }}</p>\n }\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { type MkBlock, mkBlockId, mkCloneBlock } from './block-model';\nimport type { MkBlockDefinition } from './block-registry';\nimport { MkBlockEditorContext } from './block-context';\nimport type { MkRichTextSplit } from '@mk-kit/ui/rich-text';\nimport { MkParagraphBlock } from './paragraph-block';\nimport { MkHeadingBlock } from './heading-block';\nimport { MkQuoteBlock } from './quote-block';\nimport { MkListBlock } from './list-block';\nimport { MkCodeBlock } from './code-block';\nimport { MkImageBlock } from './image-block';\nimport { MkEmbedBlock } from './embed-block';\nimport { MkButtonBlock } from './button-block';\nimport { MkBlockInserter } from './block-inserter';\n\n/**\n * Column ratio presets offered per column count. An empty label means \"equal\n * widths\" and is rendered with the localised `ratioEqual` caption.\n */\nconst RATIO_PRESETS: Record<number, { value: string; label: string }[]> = {\n 2: [\n { value: '50-50', label: '50 / 50' },\n { value: '66-33', label: '66 / 33' },\n { value: '33-66', label: '33 / 66' },\n { value: '75-25', label: '75 / 25' },\n { value: '25-75', label: '25 / 75' },\n ],\n 3: [\n { value: '33-33-33', label: '' },\n { value: '50-25-25', label: '50 / 25 / 25' },\n { value: '25-50-25', label: '25 / 50 / 25' },\n ],\n 4: [{ value: '25-25-25-25', label: '' }],\n};\n\n/**\n * Recursive block list — renders an ordered array of blocks, each wrapped with\n * move/duplicate/delete/transform chrome and the type-specific editor, with\n * inserters between. Layout (columns) blocks recurse into nested\n * `mk-block-list`s. Owns all structural operations for its own array and emits\n * the new array via `blocksChange`; nested lists bubble their changes upward.\n */\n@Component({\n selector: 'mk-block-list',\n imports: [\n MkParagraphBlock,\n MkHeadingBlock,\n MkQuoteBlock,\n MkListBlock,\n MkCodeBlock,\n MkImageBlock,\n MkEmbedBlock,\n MkButtonBlock,\n MkBlockInserter,\n ],\n templateUrl: './block-list.html',\n styleUrl: './block-list.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-block-list' },\n})\nexport class MkBlockList {\n protected readonly ctx = inject(MkBlockEditorContext);\n protected readonly i18n = inject(MK_I18N);\n\n /** The blocks to render. */\n readonly blocks = input.required<MkBlock[]>();\n /** Nesting depth (0 = top level). Used to forbid columns-in-columns. */\n readonly depth = input(0);\n /** Restrict the inserter to column-safe blocks. */\n readonly inColumn = input(false, { transform: booleanAttribute });\n\n /** Emitted with the full, updated array on any structural or content change. */\n readonly blocksChange = output<MkBlock[]>();\n\n /** Which block's toolbar menu is open (by index), or -1. */\n protected readonly menuOpen = signal(-1);\n\n protected readonly ratioPresets = RATIO_PRESETS;\n\n protected definition(type: string): MkBlockDefinition | undefined {\n return this.ctx.definitionFor(type);\n }\n\n // --- content updates ------------------------------------------------------\n\n protected update(index: number, block: MkBlock): void {\n const next = [...this.blocks()];\n next[index] = block;\n this.blocksChange.emit(next);\n }\n\n protected onColumnChange(blockIndex: number, colIndex: number, children: MkBlock[]): void {\n const block = this.blocks()[blockIndex];\n const columns = [...(block.children ?? [])];\n columns[colIndex] = { ...columns[colIndex], children };\n this.update(blockIndex, { ...block, children: columns });\n }\n\n // --- structural ops -------------------------------------------------------\n\n protected insertAt(index: number, def: MkBlockDefinition): void {\n const block = def.create();\n const next = [...this.blocks()];\n next.splice(index, 0, block);\n this.blocksChange.emit(next);\n this.ctx.announce(this.i18n.blockEditor.blockAdded(def.label));\n this.ctx.focusBlock(block.id, 'start');\n }\n\n protected duplicate(index: number): void {\n const clone = mkCloneBlock(this.blocks()[index]);\n const next = [...this.blocks()];\n next.splice(index + 1, 0, clone);\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.blockDuplicated);\n }\n\n protected remove(index: number): void {\n const removed = this.blocks()[index];\n const next = this.blocks().filter((_, i) => i !== index);\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.blockDeleted(this.ctx.labelFor(removed.type)));\n const focusTarget = next[index - 1] ?? next[index];\n if (focusTarget) this.ctx.focusBlock(focusTarget.id, 'end');\n }\n\n protected move(index: number, delta: number): void {\n const target = index + delta;\n if (target < 0 || target >= this.blocks().length) return;\n const next = [...this.blocks()];\n [next[index], next[target]] = [next[target], next[index]];\n this.blocksChange.emit(next);\n this.ctx.announce(\n delta < 0 ? this.i18n.blockEditor.blockMovedUp : this.i18n.blockEditor.blockMovedDown,\n );\n }\n\n protected transform(index: number, type: string): void {\n const def = this.definition(type);\n if (!def) return;\n const source = this.blocks()[index];\n const created = def.create();\n // Carry rich-text HTML across text-type transforms where it makes sense.\n const carriesHtml = 'html' in created.data && typeof source.data['html'] === 'string';\n const data = carriesHtml ? { ...created.data, html: source.data['html'] } : created.data;\n const next = [...this.blocks()];\n next[index] = { ...created, id: source.id, data };\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.turnedInto(def.label));\n }\n\n // --- text-block keyboard intents -----------------------------------------\n\n protected onSplit(index: number, split: MkRichTextSplit): void {\n const current = this.blocks()[index];\n const paragraphDef = this.definition('paragraph');\n const created = paragraphDef ? paragraphDef.create() : this.fallbackParagraph();\n const newBlock: MkBlock = { ...created, data: { ...created.data, html: split.after } };\n const next = [...this.blocks()];\n next[index] = { ...current, data: { ...current.data, html: split.before } };\n next.splice(index + 1, 0, newBlock);\n this.blocksChange.emit(next);\n this.ctx.focusBlock(newBlock.id, 'start');\n }\n\n protected onMergeBack(index: number): void {\n if (index <= 0) return;\n const prev = this.blocks()[index - 1];\n this.remove(index);\n this.ctx.focusBlock(prev.id, 'end');\n }\n\n protected onArrowOut(index: number, dir: 'up' | 'down'): void {\n const target = dir === 'up' ? index - 1 : index + 1;\n const block = this.blocks()[target];\n if (block) this.ctx.focusBlock(block.id, dir === 'up' ? 'end' : 'start');\n }\n\n // --- columns helpers ------------------------------------------------------\n\n protected setColumnCount(index: number, count: number): void {\n const block = this.blocks()[index];\n const current = [...(block.children ?? [])];\n while (current.length < count) current.push({ id: mkBlockId('column'), type: 'column', data: {}, children: [] });\n current.length = count;\n const presets = RATIO_PRESETS[count] ?? RATIO_PRESETS[2];\n this.update(index, {\n ...block,\n data: { ...block.data, count, ratio: presets[0].value },\n children: current,\n });\n }\n\n protected setColumnData(index: number, patch: Record<string, any>): void {\n const block = this.blocks()[index];\n this.update(index, { ...block, data: { ...block.data, ...patch } });\n }\n\n protected onRatioChange(index: number, event: Event): void {\n this.setColumnData(index, { ratio: (event.target as HTMLSelectElement).value });\n }\n protected onGapChange(index: number, event: Event): void {\n this.setColumnData(index, { gap: Number((event.target as HTMLInputElement).value) });\n }\n protected onAlignChange(index: number, event: Event): void {\n this.setColumnData(index, { align: (event.target as HTMLSelectElement).value });\n }\n protected onJustifyChange(index: number, event: Event): void {\n this.setColumnData(index, { justify: (event.target as HTMLSelectElement).value });\n }\n\n protected gridColumns(block: MkBlock): string {\n const ratio = String(block.data['ratio'] ?? '');\n const parts = ratio.split('-').map((n) => parseFloat(n)).filter((n) => n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${block.children?.length ?? 2}, 1fr)`;\n }\n protected gridGap(block: MkBlock): string {\n const g = Math.max(0, Math.min(8, Number(block.data['gap']) || 4));\n return `var(--mk-space-${g})`;\n }\n protected justifyValue(block: MkBlock): string {\n const map: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n return map[String(block.data['justify'] ?? 'start')] ?? 'flex-start';\n }\n\n // --- toolbar menu ---------------------------------------------------------\n\n protected toggleMenu(index: number): void {\n this.menuOpen.update((i) => (i === index ? -1 : index));\n }\n\n /** Escape inside the options popup closes it and restores the toggle's focus. */\n protected closeMenu(trigger: HTMLElement, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.menuOpen.set(-1);\n trigger.focus();\n }\n\n protected transformsFor(type: string): string[] {\n return this.definition(type)?.transforms ?? [];\n }\n\n private fallbackParagraph(): MkBlock {\n return { id: mkBlockId('paragraph'), type: 'paragraph', data: { html: '' } };\n }\n}\n","@let readonly = ctx.readonly() || ctx.disabled();\n\n@for (block of blocks(); track block.id; let i = $index; let last = $last) {\n @if (!readonly) {\n <mk-block-inserter\n variant=\"slim\"\n [definitions]=\"ctx.definitions()\"\n [columnsOnly]=\"inColumn()\"\n (pick)=\"insertAt(i, $event)\"\n />\n }\n\n <div class=\"mk-block\" [attr.data-block-id]=\"block.id\" [class.mk-block--readonly]=\"readonly\">\n @if (!readonly) {\n <div class=\"mk-block__gutter\" aria-hidden=\"false\">\n <button\n type=\"button\"\n class=\"mk-block__move\"\n [disabled]=\"i === 0\"\n [attr.aria-label]=\"i18n.blockEditor.moveBlockUp\"\n (click)=\"move(i, -1)\"\n >\n ▲\n </button>\n <span class=\"mk-block__handle\" [title]=\"i18n.blockEditor.dragHandle\" aria-hidden=\"true\">⠿</span>\n <button\n type=\"button\"\n class=\"mk-block__move\"\n [disabled]=\"last\"\n [attr.aria-label]=\"i18n.blockEditor.moveBlockDown\"\n (click)=\"move(i, 1)\"\n >\n ▼\n </button>\n </div>\n\n <div class=\"mk-block__bar\">\n <span class=\"mk-block__type\">\n <span class=\"mk-block__type-icon\" aria-hidden=\"true\">{{ definition(block.type)?.icon }}</span>\n {{ definition(block.type)?.label ?? block.type }}\n </span>\n <div class=\"mk-block__actions\">\n <button\n #menuTrigger\n type=\"button\"\n class=\"mk-block__action\"\n [attr.aria-expanded]=\"menuOpen() === i\"\n [attr.aria-controls]=\"'mk-block-menu-' + block.id\"\n [attr.aria-label]=\"i18n.blockEditor.blockOptions\"\n (click)=\"toggleMenu(i)\"\n >\n ⋯\n </button>\n @if (menuOpen() === i) {\n <div\n class=\"mk-block__menu\"\n [id]=\"'mk-block-menu-' + block.id\"\n (keydown.escape)=\"closeMenu(menuTrigger, $event)\"\n >\n <button type=\"button\" (click)=\"duplicate(i)\">{{ i18n.blockEditor.duplicate }}</button>\n @for (t of transformsFor(block.type); track t) {\n <button type=\"button\" (click)=\"transform(i, t)\">\n {{ i18n.blockEditor.turnInto(definition(t)?.label ?? t) }}\n </button>\n }\n <button type=\"button\" class=\"mk-block__menu-danger\" (click)=\"remove(i)\">\n {{ i18n.blockEditor.remove }}\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"mk-block__body\">\n @switch (block.type) {\n @case ('paragraph') {\n <mk-paragraph-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n [placeholder]=\"ctx.placeholder()\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('heading') {\n <mk-heading-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('quote') {\n <mk-quote-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('list') {\n <mk-list-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('code') {\n <mk-code-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('image') {\n <mk-image-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('embed') {\n <mk-embed-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('button') {\n <mk-button-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('divider') {\n <hr class=\"mk-block__divider\" data-mk-focus tabindex=\"-1\" />\n }\n @case ('columns') {\n @if (!readonly) {\n <div class=\"mk-columns-settings\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.columnSettings\">\n <label>\n <span>{{ i18n.blockEditor.columns }}</span>\n <span class=\"mk-columns-settings__counts\">\n @for (n of [2, 3, 4]; track n) {\n <button\n type=\"button\"\n [class.mk-columns-settings__count--active]=\"(block.data['count'] || 2) === n\"\n [attr.aria-pressed]=\"(block.data['count'] || 2) === n\"\n (click)=\"setColumnCount(i, n)\"\n >\n {{ n }}\n </button>\n }\n </span>\n </label>\n <label>\n <span>{{ i18n.blockEditor.ratio }}</span>\n <select [value]=\"block.data['ratio']\" (change)=\"onRatioChange(i, $event)\">\n @for (preset of ratioPresets[block.data['count'] || 2]; track preset.value) {\n <option [value]=\"preset.value\">{{ preset.label || i18n.blockEditor.ratioEqual }}</option>\n }\n </select>\n </label>\n <label>\n <span>{{ i18n.blockEditor.gap }}</span>\n <input\n type=\"range\"\n min=\"0\"\n max=\"8\"\n [value]=\"block.data['gap'] ?? 4\"\n (input)=\"onGapChange(i, $event)\"\n />\n </label>\n <label>\n <span>{{ i18n.blockEditor.align }}</span>\n <select [value]=\"block.data['align'] ?? 'stretch'\" (change)=\"onAlignChange(i, $event)\">\n <option value=\"stretch\">{{ i18n.blockEditor.alignStretch }}</option>\n <option value=\"start\">{{ i18n.blockEditor.alignTop }}</option>\n <option value=\"center\">{{ i18n.blockEditor.alignMiddle }}</option>\n <option value=\"end\">{{ i18n.blockEditor.alignBottom }}</option>\n </select>\n </label>\n <label>\n <span>{{ i18n.blockEditor.justify }}</span>\n <select [value]=\"block.data['justify'] ?? 'start'\" (change)=\"onJustifyChange(i, $event)\">\n <option value=\"start\">{{ i18n.blockEditor.justifyStart }}</option>\n <option value=\"center\">{{ i18n.blockEditor.justifyCenter }}</option>\n <option value=\"end\">{{ i18n.blockEditor.justifyEnd }}</option>\n <option value=\"between\">{{ i18n.blockEditor.justifyBetween }}</option>\n </select>\n </label>\n </div>\n }\n <div\n class=\"mk-columns\"\n [style.grid-template-columns]=\"gridColumns(block)\"\n [style.gap]=\"gridGap(block)\"\n [style.align-items]=\"block.data['align'] ?? 'stretch'\"\n [style.justify-content]=\"justifyValue(block)\"\n >\n @for (col of block.children ?? []; track col.id; let c = $index) {\n <div class=\"mk-column\">\n <mk-block-list\n [blocks]=\"col.children ?? []\"\n [depth]=\"depth() + 1\"\n [inColumn]=\"true\"\n (blocksChange)=\"onColumnChange(i, c, $event)\"\n />\n </div>\n }\n </div>\n }\n @default {\n <p class=\"mk-block__unknown\">{{ i18n.blockEditor.unknownBlock(block.type) }}</p>\n }\n }\n </div>\n </div>\n}\n\n@if (!readonly) {\n <mk-block-inserter\n class=\"mk-block-list__add\"\n [definitions]=\"ctx.definitions()\"\n [columnsOnly]=\"inColumn()\"\n [label]=\"blocks().length ? i18n.blockEditor.addBlock : i18n.blockEditor.addFirstBlock\"\n (pick)=\"insertAt(blocks().length, $event)\"\n />\n}\n","/**\n * HTML → {@link MkBlockDocument} parser — the inverse of {@link mkBlocksToHtml}.\n *\n * Lets the block editor back a **string-typed richtext field** (e.g. a CMS\n * `richtext` column that stores an HTML string): seed the editor from stored\n * HTML, and serialise back to HTML on change. Best-effort and forgiving — any\n * HTML parses, with unrecognised block-level wrappers recursed into and loose\n * inline runs grouped into paragraphs. Round-trips the blocks `mkBlocksToHtml`\n * emits (paragraph, heading, list, quote, code, image, divider, button, embed,\n * columns).\n *\n * Uses the DOM (`DOMParser`) — available in browsers and jsdom. In a pure Node\n * context without a DOM it falls back to a single sanitised paragraph.\n */\nimport {\n MK_BLOCK_DOCUMENT_VERSION,\n type MkBlock,\n type MkBlockDocument,\n mkBlockId,\n mkEmptyDocument,\n} from './block-model';\nimport { mkEscapeHtml, sanitizeInlineHtml } from './block-serializer';\n\nconst HEADING_LEVEL: Record<string, number> = {\n h1: 1, h2: 2, h3: 3, h4: 4, h5: 4, h6: 4,\n};\n\n/** Block-level tags handled as their own block (others recurse or group). */\nconst BLOCK_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'blockquote', 'pre',\n 'figure', 'img', 'hr', 'div', 'section', 'article', 'table',\n]);\n\nfunction block(type: string, data: Record<string, unknown>, children?: MkBlock[]): MkBlock {\n const b: MkBlock = { id: mkBlockId(type), type, data };\n if (children) b.children = children;\n return b;\n}\n\nfunction parseRoot(html: string): ParentNode | null {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser().parseFromString(html, 'text/html').body;\n }\n if (typeof document !== 'undefined') {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n }\n return null;\n}\n\nconst TEXT_NODE = 3;\nconst ELEMENT_NODE = 1;\n\nfunction isBlockElement(node: Node): boolean {\n return (\n node.nodeType === ELEMENT_NODE &&\n BLOCK_TAGS.has((node as Element).tagName.toLowerCase())\n );\n}\n\n/** HTML for one node in an inline run (encoded text, element markup). */\nfunction nodeHtml(node: Node): string {\n if (node.nodeType === TEXT_NODE) return mkEscapeHtml(node.textContent ?? '');\n if (node.nodeType === ELEMENT_NODE) return (node as Element).outerHTML;\n return '';\n}\n\nfunction style(el: Element, prop: string): string {\n return (el as HTMLElement).style?.getPropertyValue(prop)?.trim() ?? '';\n}\n\n/** Walk a parent's children into blocks, grouping loose inline runs. */\nfunction collectBlocks(root: ParentNode, out: MkBlock[]): void {\n let inline: Node[] = [];\n const flush = () => {\n if (!inline.length) return;\n const html = inline.map(nodeHtml).join('').trim();\n if (html) out.push(block('paragraph', { html: sanitizeInlineHtml(html) }));\n inline = [];\n };\n\n for (const node of Array.from(root.childNodes)) {\n if (isBlockElement(node)) {\n flush();\n appendElement(node as Element, out);\n } else if (node.nodeType === TEXT_NODE && !node.textContent?.trim()) {\n // ignore whitespace between blocks\n } else {\n inline.push(node);\n }\n }\n flush();\n}\n\n/** Map a block-level element to one or more blocks (appended to `out`). */\nfunction appendElement(el: Element, out: MkBlock[]): void {\n const tag = el.tagName.toLowerCase();\n\n if (tag === 'p') {\n out.push(block('paragraph', { html: sanitizeInlineHtml(el.innerHTML) }));\n return;\n }\n if (tag in HEADING_LEVEL) {\n out.push(block('heading', {\n level: HEADING_LEVEL[tag],\n html: sanitizeInlineHtml(el.innerHTML),\n }));\n return;\n }\n if (tag === 'ul' || tag === 'ol') {\n const items = Array.from(el.querySelectorAll(':scope > li')).map((li) =>\n sanitizeInlineHtml(li.innerHTML),\n );\n out.push(block('list', { ordered: tag === 'ol', items: items.length ? items : [''] }));\n return;\n }\n if (tag === 'blockquote') {\n const cite = el.querySelector('cite');\n const p = el.querySelector('p');\n const body = p ? p.innerHTML : el.innerHTML;\n out.push(block('quote', {\n html: sanitizeInlineHtml(body),\n citation: cite?.textContent?.trim() ?? '',\n }));\n return;\n }\n if (tag === 'pre') {\n const codeEl = el.querySelector('code') ?? el;\n const lang = (codeEl.className.match(/language-([\\w-]+)/) ?? [])[1] ?? '';\n out.push(block('code', { code: codeEl.textContent ?? '', language: lang }));\n return;\n }\n if (tag === 'figure' || tag === 'img') {\n const img = tag === 'img' ? (el as HTMLImageElement) : el.querySelector('img');\n if (img) {\n const width = parseInt(style(img, 'max-width'), 10);\n const align =\n style(el, 'text-align') === 'left'\n ? 'left'\n : style(el, 'text-align') === 'right'\n ? 'right'\n : 'center';\n out.push(block('image', {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n caption: el.querySelector('figcaption')?.textContent?.trim() ?? '',\n align,\n width: Number.isFinite(width) && width > 0 ? width : 100,\n }));\n }\n return;\n }\n if (tag === 'hr') {\n out.push(block('divider', {}));\n return;\n }\n\n // <div> / generic containers: recognise the wrappers mkBlocksToHtml emits,\n // otherwise recurse into the children.\n if (el.classList.contains('mk-columns')) {\n const columns = Array.from(el.querySelectorAll(':scope > .mk-column')).map(\n (colEl) => {\n const children: MkBlock[] = [];\n collectBlocks(colEl, children);\n return block('column', {}, children);\n },\n );\n out.push(block('columns', { count: columns.length || 2 }, columns));\n return;\n }\n const cta = el.querySelector(':scope > a.mk-cta, a.mk-cta');\n if (cta) {\n const tone = (cta.className.match(/mk-cta--([\\w-]+)/) ?? [])[1] ?? 'primary';\n out.push(block('button', {\n label: cta.textContent?.trim() ?? 'Button',\n href: cta.getAttribute('href') ?? '',\n align: style(el, 'text-align') || 'left',\n tone,\n }));\n return;\n }\n if (el.classList.contains('mk-embed')) {\n const iframe = el.querySelector('iframe');\n out.push(block('embed', {\n url: '',\n embedUrl: iframe?.getAttribute('src') ?? '',\n aspectRatio: 16 / 9,\n }));\n return;\n }\n\n // Unknown container — recurse into its children.\n collectBlocks(el, out);\n}\n\n/**\n * Parse an HTML string into a {@link MkBlockDocument}. Empty / whitespace input\n * yields an empty document.\n */\nexport function mkHtmlToBlocks(html: string): MkBlockDocument {\n const source = String(html ?? '');\n if (!source.trim()) return mkEmptyDocument();\n\n const root = parseRoot(source);\n if (!root) {\n // No DOM (server) — degrade to a single sanitised paragraph.\n return {\n version: MK_BLOCK_DOCUMENT_VERSION,\n blocks: [block('paragraph', { html: sanitizeInlineHtml(source) })],\n };\n }\n\n const blocks: MkBlock[] = [];\n collectBlocks(root, blocks);\n return { version: MK_BLOCK_DOCUMENT_VERSION, blocks };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MK_I18N, type MkBlockEditorStrings } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core';\nimport {\n MK_BLOCK_DOCUMENT_VERSION,\n type MkBlock,\n type MkBlockDocument,\n mkEmptyDocument,\n} from './block-model';\nimport {\n MK_BLOCK_DEFINITIONS,\n MK_BLOCK_EMBED_PROVIDERS,\n MK_BLOCK_UPLOAD_HANDLER,\n MK_DEFAULT_BLOCKS,\n MK_DEFAULT_EMBED_PROVIDERS,\n type MkBlockDefinition,\n type MkBlockUploadHandler,\n type MkEmbedProvider,\n mkMergeBlockDefinitions,\n} from './block-registry';\nimport { MkBlockEditorContext } from './block-context';\nimport { MkBlockList } from './block-list';\nimport { mkBlocksToHtml } from './block-serializer';\nimport { mkHtmlToBlocks } from './block-parser';\n\n/** How the form/CVA value is exchanged: a document object or an HTML string. */\nexport type MkBlockValueFormat = 'document' | 'html';\n\n/**\n * Block editor — a configurable, Gutenberg-style block content editor. Renders\n * an ordered document of blocks (paragraph, heading, image, columns, embed,\n * list, quote, button, divider, code) with a filterable inserter, per-block\n * chrome (move/duplicate/transform/delete) and inline rich-text formatting.\n *\n * The palette is fully customisable: pass definitions via the `blocks` input or\n * the {@link MK_BLOCK_DEFINITIONS} token (mirrors `registerBlockType`). Both are\n * merged over {@link MK_DEFAULT_BLOCKS}.\n *\n * Implements `ControlValueAccessor` AND a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`.\n *\n * ```html\n * <mk-block-editor [(value)]=\"doc\" [uploadHandler]=\"upload\" />\n * ```\n */\n@Component({\n selector: 'mk-block-editor',\n imports: [MkBlockList],\n templateUrl: './block-editor.html',\n styleUrl: './block-editor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-block-editor',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n '[class.mk-block-editor--readonly]': 'readonly()',\n '[class.mk-block-editor--invalid]': 'isInvalid()',\n '[attr.aria-invalid]': 'isInvalid() || null',\n '[class.mk-block-editor--disabled]': 'disabled() || cvaDisabled()',\n '(focusout)': 'onFocusOut($event)',\n },\n providers: [\n MkBlockEditorContext,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkBlockEditor),\n multi: true,\n },\n ],\n})\nexport class MkBlockEditor implements ControlValueAccessor {\n protected readonly i18n = inject(MK_I18N);\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly tokenDefinitions = inject(MK_BLOCK_DEFINITIONS, { optional: true });\n private readonly tokenUpload = inject(MK_BLOCK_UPLOAD_HANDLER, { optional: true });\n private readonly tokenEmbeds = inject(MK_BLOCK_EMBED_PROVIDERS, { optional: true });\n\n /** Two-way document value (always an `MkBlockDocument`, regardless of format). */\n readonly value = model<MkBlockDocument>(mkEmptyDocument());\n /**\n * Form/CVA exchange format. `document` (default) reads/writes an\n * `MkBlockDocument`; `html` reads/writes an **HTML string** — so the editor\n * can back a string-typed richtext field (`[(ngModel)]=\"htmlString\"`). The\n * two-way `value` model stays an `MkBlockDocument` either way.\n */\n readonly valueFormat = input<MkBlockValueFormat>('document');\n /** Custom / extended block definitions (merged over the defaults + token). */\n readonly blocks = input<MkBlockDefinition[] | null>(null);\n /** Placeholder for empty text blocks. */\n readonly placeholder = input<string>(this.i18n.blockEditor.emptyBlockPlaceholder);\n /** Accessible label for the editor region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editorLabel);\n /** Read-only: renders content without editing chrome. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Disabled (form-level). */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Async upload handler (overrides the {@link MK_BLOCK_UPLOAD_HANDLER} token). */\n readonly uploadHandler = input<MkBlockUploadHandler | null>(null);\n /** Extra embed providers (merged with defaults + token). */\n readonly embedProviders = input<MkEmbedProvider[] | null>(null);\n\n /** Fires on any document change (in addition to the `value` model). */\n readonly change = output<MkBlockDocument>();\n /** Fires the serialised HTML on any change — convenient in `html` mode. */\n readonly htmlChange = output<string>();\n\n protected readonly cvaDisabled = signal(false);\n\n /** Invalid visual, forced by the `invalid` input. */\n /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */\n private readonly fieldTouched = mkInjectFieldTouched();\n protected readonly isInvalid = computed(() => this.invalid() && this.fieldTouched());\n\n private onChange: (value: MkBlockDocument | string) => void = () => {};\n private onTouched: () => void = () => {};\n\n /** Effective, merged block definitions (defaults localised via MK_I18N). */\n private readonly definitions = computed<MkBlockDefinition[]>(() =>\n mkMergeBlockDefinitions(\n localizeDefaultBlocks(this.i18n.blockEditor),\n ...(this.tokenDefinitions ?? []),\n this.blocks(),\n ),\n );\n\n protected readonly topBlocks = computed<MkBlock[]>(() => this.value()?.blocks ?? []);\n\n constructor() {\n this.ctx.hostRef = this.hostRef;\n\n // Connect the shared context straight to the input-derived signals (pull\n // based; no per-input mirror effects). Must happen before any child\n // renders, which the constructor guarantees: the context is provided by\n // this component, so children inject it only after we are constructed.\n this.ctx.definitions = this.definitions;\n this.ctx.readonly = this.readonly;\n this.ctx.disabled = computed(() => this.disabled() || this.cvaDisabled());\n this.ctx.placeholder = this.placeholder;\n this.ctx.uploadHandler = computed(\n () => this.uploadHandler() ?? this.tokenUpload ?? null,\n );\n this.ctx.embedProviders = computed(() => [\n ...MK_DEFAULT_EMBED_PROVIDERS,\n ...(this.tokenEmbeds?.flat() ?? []),\n ...(this.embedProviders() ?? []),\n ]);\n }\n\n protected onBlocksChange(blocks: MkBlock[]): void {\n const next: MkBlockDocument = {\n version: this.value()?.version ?? MK_BLOCK_DOCUMENT_VERSION,\n blocks,\n };\n this.value.set(next);\n // Serialising the whole document on every keystroke is expensive — do it\n // only when something actually consumes the HTML: `html` value format, or\n // a subscriber on `htmlChange`.\n const wantsHtml = this.valueFormat() === 'html' || hasObservers(this.htmlChange);\n const html = wantsHtml ? mkBlocksToHtml(next) : null;\n this.onChange(this.valueFormat() === 'html' ? html! : next);\n this.onTouched();\n this.change.emit(next);\n if (html !== null) this.htmlChange.emit(html);\n }\n\n /**\n * Marks the control touched once focus leaves it entirely, so a form that\n * gates its errors on `touched` behaves the same here as on a native input.\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.hostRef.nativeElement.contains(next)) return;\n this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: MkBlockDocument | string | null): void {\n if (this.valueFormat() === 'html') {\n this.value.set(\n typeof value === 'string'\n ? mkHtmlToBlocks(value)\n : ((value as MkBlockDocument | null) ?? mkEmptyDocument()),\n );\n } else {\n this.value.set((value as MkBlockDocument | null) ?? mkEmptyDocument());\n }\n }\n registerOnChange(fn: (value: MkBlockDocument | string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\n/**\n * Whether an `output()` emitter currently has any subscribers (template\n * `(htmlChange)` bindings and programmatic `.subscribe()` both register one).\n * Reads `OutputEmitterRef`'s internal `listeners` array — not public API, so\n * if the field ever disappears in a future Angular this reports `true` and we\n * fall back to always serialising (the documented pre-optimisation behaviour).\n */\nfunction hasObservers(ref: unknown): boolean {\n const listeners = (ref as { listeners?: unknown[] | null }).listeners;\n if (listeners === undefined) return true;\n return (listeners?.length ?? 0) > 0;\n}\n\n/**\n * Returns {@link MK_DEFAULT_BLOCKS} with the built-in labels, descriptions and\n * group headings resolved from the active i18n strings (custom definitions\n * merged on top keep their own text). The Button block's `create()` is wrapped\n * so a fresh block starts with the localised default label.\n */\nfunction localizeDefaultBlocks(s: MkBlockEditorStrings): MkBlockDefinition[] {\n const text: Record<string, { label: string; description: string }> = {\n paragraph: { label: s.blockParagraph, description: s.blockParagraphDesc },\n heading: { label: s.blockHeading, description: s.blockHeadingDesc },\n list: { label: s.blockList, description: s.blockListDesc },\n quote: { label: s.blockQuote, description: s.blockQuoteDesc },\n code: { label: s.blockCode, description: s.blockCodeDesc },\n image: { label: s.blockImage, description: s.blockImageDesc },\n embed: { label: s.blockEmbed, description: s.blockEmbedDesc },\n button: { label: s.blockButton, description: s.blockButtonDesc },\n divider: { label: s.blockDivider, description: s.blockDividerDesc },\n columns: { label: s.blockColumns, description: s.blockColumnsDesc },\n };\n const groups: Record<string, string> = {\n Text: s.groupText,\n Media: s.groupMedia,\n Layout: s.groupLayout,\n };\n return MK_DEFAULT_BLOCKS.map((def) => {\n const t = text[def.type];\n const localized: MkBlockDefinition = {\n ...def,\n label: t?.label ?? def.label,\n description: t?.description ?? def.description,\n group: groups[def.group ?? ''] ?? def.group,\n };\n if (def.type === 'button') {\n localized.create = () => {\n const b = def.create();\n return { ...b, data: { ...b.data, label: s.buttonDefaultLabel } };\n };\n }\n return localized;\n });\n}\n","<mk-block-list [blocks]=\"topBlocks()\" [depth]=\"0\" (blocksChange)=\"onBlocksChange($event)\" />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock, MkBlockDocument } from './block-model';\nimport { mkIsSafeUrl, sanitizeInlineHtml } from './block-serializer';\n\n/**\n * Block renderer — read-only, themed display of a {@link MkBlockDocument} for\n * published content pages and blog posts. Reuses the same layout CSS as the\n * editor so authored columns look identical when published.\n *\n * SECURITY MODEL: rich-text HTML is passed through {@link sanitizeInlineHtml}\n * and then bound with `[innerHTML]`, so Angular's `DomSanitizer` sanitises it\n * again at render time (never bypassed for author HTML). The ONLY bypass is for\n * a stored embed's `embedUrl`, which came from an allow-listed provider.\n */\n@Component({\n selector: 'mk-block-renderer',\n templateUrl: './block-renderer.html',\n styleUrl: './block-renderer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-block-renderer' },\n})\nexport class MkBlockRenderer {\n protected readonly i18n = inject(MK_I18N);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly safeSrcCache = new Map<string, SafeResourceUrl>();\n\n /** The document to render. */\n readonly value = input<MkBlockDocument | null>(null);\n /** Internal: a block subtree (used when recursing into columns). */\n readonly blocks = input<MkBlock[] | null>(null);\n\n protected readonly items = computed<MkBlock[]>(\n () => this.blocks() ?? this.value()?.blocks ?? [],\n );\n\n /** Sanitised rich-text HTML for `[innerHTML]` binding. */\n protected safeHtml(html: unknown): string {\n return sanitizeInlineHtml(String(html ?? ''));\n }\n\n protected listItems(block: MkBlock): string[] {\n const items = block.data['items'];\n return Array.isArray(items) ? items : [];\n }\n\n protected headingLevel(block: MkBlock): number {\n const l = block.data['level'];\n return [1, 2, 3, 4].includes(l) ? l : 2;\n }\n\n protected isImageSafe(block: MkBlock): boolean {\n const src = String(block.data['src'] ?? '');\n return !!src && mkIsSafeUrl(src);\n }\n\n protected buttonHref(block: MkBlock): string {\n const href = String(block.data['href'] ?? '');\n return mkIsSafeUrl(href) && href ? href : '#';\n }\n\n protected paddingTop(block: MkBlock): string {\n const ratio = Number(block.data['aspectRatio']) || 16 / 9;\n return `${100 / ratio}%`;\n }\n\n /** Trusts only a provider-transformed https embed URL — see class doc. */\n protected embedSrc(block: MkBlock): SafeResourceUrl | null {\n const src = String(block.data['embedUrl'] ?? '');\n if (!src || !/^https:\\/\\//i.test(src) || !mkIsSafeUrl(src)) return null;\n let trusted = this.safeSrcCache.get(src);\n if (!trusted) {\n trusted = this.sanitizer.bypassSecurityTrustResourceUrl(src);\n this.safeSrcCache.set(src, trusted);\n }\n return trusted;\n }\n\n protected fallbackUrl(block: MkBlock): string | null {\n const url = String(block.data['url'] ?? '');\n return mkIsSafeUrl(url) && url ? url : null;\n }\n\n protected gridColumns(block: MkBlock): string {\n const ratio = String(block.data['ratio'] ?? '');\n const parts = ratio.split('-').map((n) => parseFloat(n)).filter((n) => n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${block.children?.length ?? 2}, 1fr)`;\n }\n protected gridGap(block: MkBlock): string {\n const g = Math.max(0, Math.min(8, Number(block.data['gap']) || 4));\n return `var(--mk-space-${g})`;\n }\n protected justifyValue(block: MkBlock): string {\n const map: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n return map[String(block.data['justify'] ?? 'start')] ?? 'flex-start';\n }\n}\n","@for (block of items(); track block.id) {\n @switch (block.type) {\n @case ('paragraph') {\n <p class=\"mk-r-paragraph\" [innerHTML]=\"safeHtml(block.data['html'])\"></p>\n }\n @case ('heading') {\n @switch (headingLevel(block)) {\n @case (1) { <h1 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h1> }\n @case (2) { <h2 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h2> }\n @case (3) { <h3 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h3> }\n @case (4) { <h4 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h4> }\n }\n }\n @case ('list') {\n @if (block.data['ordered']) {\n <ol class=\"mk-r-list\">\n @for (item of listItems(block); track $index) {\n <li [innerHTML]=\"safeHtml(item)\"></li>\n }\n </ol>\n } @else {\n <ul class=\"mk-r-list\">\n @for (item of listItems(block); track $index) {\n <li [innerHTML]=\"safeHtml(item)\"></li>\n }\n </ul>\n }\n }\n @case ('quote') {\n <blockquote class=\"mk-r-quote\">\n <p [innerHTML]=\"safeHtml(block.data['html'])\"></p>\n @if (block.data['citation']) {\n <cite class=\"mk-r-cite\">{{ block.data['citation'] }}</cite>\n }\n </blockquote>\n }\n @case ('code') {\n <pre class=\"mk-r-code\"><code>{{ block.data['code'] }}</code></pre>\n }\n @case ('image') {\n @if (isImageSafe(block)) {\n <figure\n class=\"mk-r-figure\"\n [class.mk-r-figure--left]=\"block.data['align'] === 'left'\"\n [class.mk-r-figure--right]=\"block.data['align'] === 'right'\"\n >\n <img\n [src]=\"block.data['src']\"\n [alt]=\"block.data['alt'] ?? ''\"\n [style.width.%]=\"block.data['width'] || 100\"\n loading=\"lazy\"\n />\n @if (block.data['caption']) {\n <figcaption>{{ block.data['caption'] }}</figcaption>\n }\n </figure>\n }\n }\n @case ('button') {\n <div\n class=\"mk-r-cta-wrap\"\n [class.mk-r-cta-wrap--center]=\"block.data['align'] === 'center'\"\n [class.mk-r-cta-wrap--right]=\"block.data['align'] === 'right'\"\n >\n <a\n class=\"mk-cta\"\n [class.mk-cta--soft]=\"block.data['variant'] === 'soft'\"\n [class.mk-cta--outline]=\"block.data['variant'] === 'outline'\"\n [attr.data-tone]=\"block.data['tone'] ?? 'primary'\"\n [href]=\"buttonHref(block)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {{ block.data['label'] || i18n.blockEditor.blockButton }}\n </a>\n </div>\n }\n @case ('divider') {\n <hr class=\"mk-r-divider\" />\n }\n @case ('embed') {\n @if (embedSrc(block); as src) {\n <div class=\"mk-r-embed\" [style.padding-top]=\"paddingTop(block)\">\n <iframe\n [src]=\"src\"\n [title]=\"i18n.blockEditor.embeddedContent\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\"\n allowfullscreen\n ></iframe>\n </div>\n } @else if (fallbackUrl(block); as url) {\n <p class=\"mk-r-embed-fallback\">\n <a [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">{{ url }}</a>\n </p>\n }\n }\n @case ('columns') {\n <div\n class=\"mk-columns\"\n [style.grid-template-columns]=\"gridColumns(block)\"\n [style.gap]=\"gridGap(block)\"\n [style.align-items]=\"block.data['align'] ?? 'stretch'\"\n [style.justify-content]=\"justifyValue(block)\"\n >\n @for (col of block.children ?? []; track col.id) {\n <div class=\"mk-column\">\n <mk-block-renderer [blocks]=\"col.children ?? []\" />\n </div>\n }\n </div>\n }\n }\n}\n","/**\n * BLOCK EDITOR group barrel for @mk-kit/ui.\n *\n * Public surface for the Gutenberg-style block content editor and its\n * read-only renderer. Built-in block edit components stay internal — consumers\n * interact through the editor, the registry and the serializers.\n */\n\n// Editor + renderer components\nexport {\n MkBlockEditor,\n type MkBlockValueFormat,\n} from './block-editor';\nexport { MkBlockRenderer } from './block-renderer';\n\n// Document model\nexport {\n type MkBlock,\n type MkBlockDocument,\n MK_BLOCK_DOCUMENT_VERSION,\n mkEmptyDocument,\n mkBlockId,\n mkCloneBlock,\n} from './block-model';\n\n// Registry / config (extensibility layer)\nexport {\n type MkBlockDefinition,\n type MkBlockUploadHandler,\n type MkEmbedProvider,\n MK_DEFAULT_BLOCKS,\n MK_DEFAULT_EMBED_PROVIDERS,\n MK_BLOCK_DEFINITIONS,\n MK_BLOCK_UPLOAD_HANDLER,\n MK_BLOCK_EMBED_PROVIDERS,\n mkMergeBlockDefinitions,\n} from './block-registry';\n\n// Serializers + HTML parser (round-trip: MkBlockDocument ⇄ HTML)\nexport {\n mkBlocksToHtml,\n mkBlocksToText,\n mkEscapeHtml,\n mkEscapeAttr,\n mkIsSafeUrl,\n sanitizeInlineHtml,\n} from './block-serializer';\nexport { mkHtmlToBlocks } from './block-parser';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["block"],"mappings":"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"}
1
+ {"version":3,"file":"mk-kit-ui-block-editor.mjs","sources":["../../../projects/mk-kit/block-editor/block-model.ts","../../../projects/mk-kit/block-editor/block-registry.ts","../../../projects/mk-kit/block-editor/block-context.ts","../../../projects/mk-kit/block-editor/paragraph-block.ts","../../../projects/mk-kit/block-editor/heading-block.ts","../../../projects/mk-kit/block-editor/quote-block.ts","../../../projects/mk-kit/block-editor/list-block.ts","../../../projects/mk-kit/block-editor/code-block.ts","../../../projects/mk-kit/block-editor/image-block.ts","../../../projects/mk-kit/block-editor/image-block.html","../../../projects/mk-kit/block-editor/block-serializer.ts","../../../projects/mk-kit/block-editor/embed-block.ts","../../../projects/mk-kit/block-editor/embed-block.html","../../../projects/mk-kit/block-editor/button-block.ts","../../../projects/mk-kit/block-editor/button-block.html","../../../projects/mk-kit/block-editor/block-inserter.ts","../../../projects/mk-kit/block-editor/block-inserter.html","../../../projects/mk-kit/block-editor/block-list.ts","../../../projects/mk-kit/block-editor/block-list.html","../../../projects/mk-kit/block-editor/block-parser.ts","../../../projects/mk-kit/block-editor/block-editor.ts","../../../projects/mk-kit/block-editor/block-editor.html","../../../projects/mk-kit/block-editor/block-renderer.ts","../../../projects/mk-kit/block-editor/block-renderer.html","../../../projects/mk-kit/block-editor/index.ts","../../../projects/mk-kit/block-editor/mk-kit-ui-block-editor.ts"],"sourcesContent":["/**\n * Block document model for the mk-kit block editor.\n *\n * The model is deliberately small and 100% JSON-serialisable so a document can\n * be persisted to a database, sent over the wire, and re-hydrated without any\n * class instances or functions. All editor state lives in these plain objects.\n */\n\n/**\n * A single content block.\n *\n * `type` keys into the {@link MkBlockDefinition} registry that knows how to\n * edit, serialise and render it. `data` is a free-form, JSON-safe bag of the\n * block's own state (e.g. `{ html }` for a paragraph, `{ src, alt }` for an\n * image). `children` enables nested layout blocks (a Columns block stores its\n * columns' contents here).\n */\nexport interface MkBlock {\n /** Stable unique id (used for keying, focus and drag/move). */\n id: string;\n /** Registry type key, e.g. `paragraph`, `heading`, `columns`. */\n type: string;\n /** JSON-serialisable per-block state. */\n data: Record<string, any>;\n /** Nested blocks for layout/container blocks (e.g. columns). */\n children?: MkBlock[];\n}\n\n/** A full editor document: a version stamp plus an ordered list of blocks. */\nexport interface MkBlockDocument {\n /** Schema version, bumped when the persisted shape changes. */\n version: number;\n /** Top-level blocks, in document order. */\n blocks: MkBlock[];\n}\n\n/** Current document schema version. */\nexport const MK_BLOCK_DOCUMENT_VERSION = 1;\n\n/** An empty, valid document. */\nexport function mkEmptyDocument(): MkBlockDocument {\n return { version: MK_BLOCK_DOCUMENT_VERSION, blocks: [] };\n}\n\nlet blockCounter = 0;\n\n/**\n * Generates a reasonably unique, JSON-safe block id. Combines a monotonic\n * counter with a short random suffix so ids are unique even across documents\n * merged at runtime.\n */\nexport function mkBlockId(prefix = 'blk'): string {\n const rand = Math.random().toString(36).slice(2, 8);\n return `${prefix}-${++blockCounter}-${rand}`;\n}\n\n/** Deep-clones a block (and its subtree), assigning fresh ids. */\nexport function mkCloneBlock(block: MkBlock): MkBlock {\n return {\n id: mkBlockId(block.type),\n type: block.type,\n data: structuredCloneSafe(block.data),\n children: block.children?.map(mkCloneBlock),\n };\n}\n\n/** Structured clone with a JSON fallback for older runtimes. */\nfunction structuredCloneSafe<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return JSON.parse(JSON.stringify(value ?? null));\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { type MkBlock, mkBlockId } from './block-model';\n\n/**\n * Describes one registerable block type — the extensibility layer of the\n * editor. Mirrors Gutenberg's `registerBlockType`: consumers supply an array of\n * these (via the `blocks` input or the {@link MK_BLOCK_DEFINITIONS} token) to\n * add, remove or reconfigure the palette. The built-in set is\n * {@link MK_DEFAULT_BLOCKS}.\n */\nexport interface MkBlockDefinition {\n /** Unique type key that {@link MkBlock.type} references. */\n type: string;\n /** Human label shown in the inserter and block toolbar. */\n label: string;\n /** Optional icon (emoji or short text glyph) shown in the inserter. */\n icon?: string;\n /** Inserter grouping heading, e.g. `Text`, `Media`, `Layout`. */\n group?: string;\n /** Short description shown in the inserter. */\n description?: string;\n /** Factory returning a fresh, ready-to-edit block of this type. */\n create(): MkBlock;\n /** May this block be placed inside a Columns column? Default `true`. */\n allowedInColumns?: boolean;\n /** Keywords to match against when filtering the inserter. */\n keywords?: string[];\n /** Block types this one can transform into (by type key). */\n transforms?: string[];\n}\n\n/** Convenience factory: builds a `create()`-ready block with fresh id. */\nfunction block(type: string, data: Record<string, any> = {}, children?: MkBlock[]): MkBlock {\n return { id: mkBlockId(type), type, data, ...(children ? { children } : {}) };\n}\n\n/**\n * The default palette of built-in block definitions. Grouped for the inserter.\n * Consumers can spread this and append custom definitions, or replace it.\n *\n * The English `label`/`group`/`description` text here is only a base: the\n * editor resolves the built-in types' display text from the `blockEditor`\n * i18n strings (see `provideMkI18n`) before merging custom definitions.\n */\nexport const MK_DEFAULT_BLOCKS: MkBlockDefinition[] = [\n {\n type: 'paragraph',\n label: 'Paragraph',\n icon: '¶',\n group: 'Text',\n description: 'Rich text with inline formatting.',\n keywords: ['text', 'body', 'p'],\n transforms: ['heading', 'quote', 'code'],\n create: () => block('paragraph', { html: '' }),\n },\n {\n type: 'heading',\n label: 'Heading',\n icon: 'H',\n group: 'Text',\n description: 'A section title (H1–H4).',\n keywords: ['title', 'h1', 'h2', 'h3'],\n transforms: ['paragraph'],\n create: () => block('heading', { html: '', level: 2 }),\n },\n {\n type: 'list',\n label: 'List',\n icon: '•',\n group: 'Text',\n description: 'Bulleted or numbered list.',\n keywords: ['ul', 'ol', 'bullet', 'numbered'],\n create: () => block('list', { ordered: false, items: [''] }),\n },\n {\n type: 'quote',\n label: 'Quote',\n icon: '“',\n group: 'Text',\n description: 'A blockquote with optional citation.',\n keywords: ['blockquote', 'citation'],\n transforms: ['paragraph'],\n create: () => block('quote', { html: '', citation: '' }),\n },\n {\n type: 'code',\n label: 'Code',\n icon: '</>',\n group: 'Text',\n description: 'Preformatted, monospace code.',\n keywords: ['pre', 'snippet', 'monospace'],\n create: () => block('code', { code: '', language: '' }),\n },\n {\n type: 'image',\n label: 'Image',\n icon: '🖼',\n group: 'Media',\n description: 'Upload or link an image.',\n keywords: ['photo', 'picture', 'img', 'upload'],\n create: () => block('image', { src: '', alt: '', caption: '', align: 'center', width: 100 }),\n },\n {\n type: 'embed',\n label: 'Embed',\n icon: '▶',\n group: 'Media',\n description: 'YouTube, Vimeo or any URL.',\n keywords: ['youtube', 'vimeo', 'video', 'iframe', 'url'],\n create: () => block('embed', { url: '' }),\n },\n {\n type: 'button',\n label: 'Button',\n icon: '⬚',\n group: 'Media',\n description: 'A call-to-action link button.',\n keywords: ['cta', 'link', 'action'],\n create: () => block('button', { label: 'Click me', href: '', tone: 'primary', variant: 'solid', align: 'left' }),\n },\n {\n type: 'divider',\n label: 'Divider',\n icon: '—',\n group: 'Layout',\n description: 'A horizontal separator.',\n keywords: ['hr', 'separator', 'rule'],\n create: () => block('divider', {}),\n },\n {\n type: 'columns',\n label: 'Columns',\n icon: '▥',\n group: 'Layout',\n description: 'A responsive multi-column layout.',\n keywords: ['grid', 'layout', 'row', 'column'],\n allowedInColumns: false,\n create: () =>\n block(\n 'columns',\n { count: 2, ratio: '50-50', gap: 4, align: 'stretch', justify: 'start' },\n [block('column', {}, []), block('column', {}, [])],\n ),\n },\n];\n\n/**\n * Multi-provider injection token for adding block definitions app-wide. Each\n * provided array is merged over {@link MK_DEFAULT_BLOCKS} (by `type`). The\n * editor's `blocks` input takes final precedence.\n *\n * ```ts\n * providers: [\n * { provide: MK_BLOCK_DEFINITIONS, multi: true, useValue: [myCalloutBlock] },\n * ]\n * ```\n */\nexport const MK_BLOCK_DEFINITIONS = new InjectionToken<MkBlockDefinition[][]>(\n 'MK_BLOCK_DEFINITIONS',\n);\n\n/**\n * Async handler that persists an uploaded {@link File} and resolves to its URL.\n * Provide app-wide via this token, or per-editor via the `uploadHandler` input.\n * When absent, the Image block falls back to an inline `data:` URL.\n */\nexport type MkBlockUploadHandler = (file: File) => Promise<string>;\n\n/** App-wide upload handler token (overridable by the editor's input). */\nexport const MK_BLOCK_UPLOAD_HANDLER = new InjectionToken<MkBlockUploadHandler>(\n 'MK_BLOCK_UPLOAD_HANDLER',\n);\n\n/**\n * An allow-listed embed provider. `test` matches a pasted URL; `toEmbedUrl`\n * returns the safe iframe `src` (which is the ONLY value ever passed to\n * `DomSanitizer.bypassSecurityTrustResourceUrl`). Non-matching URLs fall back\n * to a plain link card — raw HTML is never injected.\n */\nexport interface MkEmbedProvider {\n /** Display name, e.g. `YouTube`. */\n name: string;\n /** Matches URLs this provider handles. */\n test: RegExp;\n /** Transforms a matched page URL into an embeddable iframe `src`. */\n toEmbedUrl(url: string): string | null;\n /** Aspect ratio `width / height` for the responsive frame. Default 16/9. */\n aspectRatio?: number;\n /** Allow list for the iframe `sandbox` attribute. */\n sandbox?: string;\n}\n\n/** Default embed providers: YouTube + Vimeo. */\nexport const MK_DEFAULT_EMBED_PROVIDERS: MkEmbedProvider[] = [\n {\n name: 'YouTube',\n test: /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/i,\n aspectRatio: 16 / 9,\n toEmbedUrl(url: string): string | null {\n const m = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/i,\n );\n return m ? `https://www.youtube-nocookie.com/embed/${m[1]}` : null;\n },\n },\n {\n name: 'Vimeo',\n test: /vimeo\\.com\\/(?:video\\/)?(\\d+)/i,\n aspectRatio: 16 / 9,\n toEmbedUrl(url: string): string | null {\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/i);\n return m ? `https://player.vimeo.com/video/${m[1]}` : null;\n },\n },\n];\n\n/** App-wide embed providers token (merged with the editor's input). */\nexport const MK_BLOCK_EMBED_PROVIDERS = new InjectionToken<MkEmbedProvider[][]>(\n 'MK_BLOCK_EMBED_PROVIDERS',\n);\n\n/**\n * Merges default definitions with app-token definitions and per-editor input,\n * de-duplicating by `type` (later sources win).\n */\nexport function mkMergeBlockDefinitions(\n defaults: MkBlockDefinition[],\n ...sources: (MkBlockDefinition[] | null | undefined)[]\n): MkBlockDefinition[] {\n const byType = new Map<string, MkBlockDefinition>();\n for (const def of defaults) byType.set(def.type, def);\n for (const source of sources) {\n if (!source) continue;\n for (const def of source) byType.set(def.type, def);\n }\n return [...byType.values()];\n}\n","import { ElementRef, Injectable, type Signal, computed, inject, signal } from '@angular/core';\nimport { MK_I18N, MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport type { MkBlockDefinition, MkBlockUploadHandler, MkEmbedProvider } from './block-registry';\n\n/**\n * Shared, editor-scoped context threaded to every nested `mk-block-list` and\n * block-editor component. Provided by {@link MkBlockEditor}, so deeply nested\n * blocks (e.g. inside columns) read config and coordinate focus without every\n * level re-declaring inputs.\n *\n * The config fields are plain `Signal` references that {@link MkBlockEditor}\n * connects to its input-derived signals in its constructor — i.e. BEFORE any\n * child component can inject this context — so consumers always track the live\n * source with no mirroring effects. The initial values here only serve\n * contexts created without an editor (e.g. component tests).\n */\n@Injectable()\nexport class MkBlockEditorContext {\n private readonly i18n = inject(MK_I18N);\n\n /** Active block palette (defaults merged with app/editor definitions). */\n definitions: Signal<MkBlockDefinition[]> = signal<MkBlockDefinition[]>([]);\n /** Read-only mode: content visible, editing chrome hidden. */\n readonly: Signal<boolean> = signal(false);\n /** Disabled mode (form-level). */\n disabled: Signal<boolean> = signal(false);\n /** Placeholder for empty text blocks. */\n placeholder: Signal<string> = signal(this.i18n.blockEditor.emptyBlockPlaceholder);\n /** Effective upload handler (input beats token beats data-URL fallback). */\n uploadHandler: Signal<MkBlockUploadHandler | null> = signal<MkBlockUploadHandler | null>(null);\n /** Effective embed providers (defaults + token + input). */\n embedProviders: Signal<MkEmbedProvider[]> = signal<MkEmbedProvider[]>([]);\n\n /** Root editor host, used to locate editables for focus coordination. */\n hostRef: ElementRef<HTMLElement> | null = null;\n\n /**\n * `type → definition` lookup, rebuilt only when the registry array changes.\n * `definitionFor` is called several times per block per change-detection\n * pass, so an `array.find` scan here was O(blocks × definitions) per CD.\n */\n private readonly definitionMap = computed(() => {\n const map = new Map<string, MkBlockDefinition>();\n for (const def of this.definitions()) map.set(def.type, def);\n return map;\n });\n\n constructor(private readonly announcer: MkLiveAnnouncer) {}\n\n /** Returns the definition for a block type, if registered. */\n definitionFor(type: string): MkBlockDefinition | undefined {\n return this.definitionMap().get(type);\n }\n\n /** Human label for a block type (falls back to the raw type). */\n labelFor(type: string): string {\n return this.definitionFor(type)?.label ?? type;\n }\n\n /** Announce a status change to assistive tech. */\n announce(message: string): void {\n this.announcer.announce(message, 'polite');\n }\n\n /**\n * Move focus to a block's primary editable after the next render. Queries the\n * live DOM by `data-block-id` so it works regardless of nesting depth.\n */\n focusBlock(id: string, position: 'start' | 'end' = 'end'): void {\n const root = this.hostRef?.nativeElement;\n if (!root || typeof window === 'undefined') return;\n setTimeout(() => {\n const wrapper = root.querySelector<HTMLElement>(`[data-block-id=\"${cssEscape(id)}\"]`);\n const editable = wrapper?.querySelector<HTMLElement>('[data-mk-editable]');\n const target = editable ?? wrapper?.querySelector<HTMLElement>('[data-mk-focus]');\n if (!target) return;\n target.focus();\n if (editable) placeCaret(editable, position);\n });\n }\n}\n\n/** Escapes an id for use in a CSS attribute selector. */\nfunction cssEscape(value: string): string {\n return value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\n/** Places the caret at the start or end of a contenteditable element. */\nexport function placeCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const win = el.ownerDocument.defaultView;\n const selection = win?.getSelection();\n if (!selection) return;\n const range = el.ownerDocument.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/**\n * Paragraph block — rich text stored as sanitised HTML in `block.data.html`,\n * with the floating inline toolbar provided by {@link MkRichTextEngine}.\n */\n@Component({\n selector: 'mk-paragraph-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <mk-rich-text-engine\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"readonly()\"\n [ariaLabel]=\"i18n.blockEditor.blockParagraph\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n `,\n})\nexport class MkParagraphBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly placeholder = input(this.i18n.blockEditor.emptyBlockPlaceholder);\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\nconst LEVELS = [1, 2, 3, 4] as const;\n\n/**\n * Heading block — the same rich text as a paragraph but rendered at a\n * configurable level (H1–H4), chosen from an inline settings row.\n */\n@Component({\n selector: 'mk-heading-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <div class=\"mk-heading-block__levels\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.headingLevelGroup\">\n @for (lvl of levels; track lvl) {\n <button\n type=\"button\"\n class=\"mk-heading-block__level\"\n [class.mk-heading-block__level--active]=\"level() === lvl\"\n [attr.aria-pressed]=\"level() === lvl\"\n (click)=\"setLevel(lvl)\"\n >\n H{{ lvl }}\n </button>\n }\n </div>\n }\n <mk-rich-text-engine\n class=\"mk-heading-block__text\"\n [class]=\"'mk-heading-block__text--h' + level()\"\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.headingPlaceholder(level())\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.headingLevel(level())\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-heading-block__levels {\n display: inline-flex;\n gap: 2px;\n margin-bottom: var(--mk-space-1);\n padding: 2px;\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface-2);\n }\n .mk-heading-block__level {\n min-width: 30px;\n height: 24px;\n border: none;\n border-radius: var(--mk-radius-xs);\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-xs);\n font-weight: var(--mk-font-weight-semibold);\n cursor: pointer;\n }\n .mk-heading-block__level:hover {\n background: var(--mk-hover-overlay);\n }\n .mk-heading-block__level--active {\n background: var(--mk-primary);\n color: var(--mk-primary-contrast);\n }\n .mk-heading-block__level:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n .mk-heading-block__text--h1 {\n font-size: var(--mk-font-size-3xl);\n font-weight: var(--mk-font-weight-bold);\n }\n .mk-heading-block__text--h2 {\n font-size: var(--mk-font-size-2xl);\n font-weight: var(--mk-font-weight-bold);\n }\n .mk-heading-block__text--h3 {\n font-size: var(--mk-font-size-xl);\n font-weight: var(--mk-font-weight-semibold);\n }\n .mk-heading-block__text--h4 {\n font-size: var(--mk-font-size-lg);\n font-weight: var(--mk-font-weight-semibold);\n }\n `,\n ],\n})\nexport class MkHeadingBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected readonly levels = LEVELS;\n protected readonly level = computed(() => {\n const l = this.block().data['level'];\n return LEVELS.includes(l) ? l : 2;\n });\n\n protected setLevel(level: number): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, level } });\n }\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/** Quote block — a blockquote with rich text and an optional citation line. */\n@Component({\n selector: 'mk-quote-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <blockquote class=\"mk-quote-block__quote\">\n <mk-rich-text-engine\n [html]=\"block().data['html'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.blockQuote\"\n [disabled]=\"readonly()\"\n [ariaLabel]=\"i18n.blockEditor.quoteText\"\n (contentChange)=\"onContent($event)\"\n (splitAt)=\"splitAt.emit($event)\"\n (removeEmpty)=\"removeEmpty.emit()\"\n (arrowOut)=\"arrowOut.emit($event)\"\n />\n </blockquote>\n @if (!readonly() || block().data['citation']) {\n <input\n class=\"mk-quote-block__cite\"\n type=\"text\"\n [value]=\"block().data['citation'] ?? ''\"\n [disabled]=\"readonly()\"\n [placeholder]=\"i18n.blockEditor.addCitation\"\n [attr.aria-label]=\"i18n.blockEditor.citation\"\n (input)=\"onCite($event)\"\n />\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-quote-block__quote {\n margin: 0;\n padding-inline-start: var(--mk-space-4);\n border-inline-start: 4px solid var(--mk-primary);\n font-size: var(--mk-font-size-lg);\n font-style: italic;\n color: var(--mk-text);\n }\n .mk-quote-block__cite {\n margin-top: var(--mk-space-2);\n margin-inline-start: var(--mk-space-4);\n width: calc(100% - var(--mk-space-4));\n border: none;\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-sm);\n }\n .mk-quote-block__cite:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n border-radius: var(--mk-radius-xs);\n }\n `,\n ],\n})\nexport class MkQuoteBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly blockChange = output<MkBlock>();\n readonly splitAt = output<MkRichTextSplit>();\n readonly removeEmpty = output<void>();\n readonly arrowOut = output<'up' | 'down'>();\n\n protected onContent(html: string): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, html } });\n }\n\n protected onCite(event: Event): void {\n const b = this.block();\n const citation = (event.target as HTMLInputElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, citation } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkRichTextEngine, type MkRichTextSplit } from '@mk-kit/ui/rich-text';\n\n/** List block — a bulleted or numbered list of rich-text items. */\n@Component({\n selector: 'mk-list-block',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <div class=\"mk-list-block__opts\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.listStyle\">\n <button\n type=\"button\"\n class=\"mk-list-block__opt\"\n [class.mk-list-block__opt--active]=\"!ordered()\"\n [attr.aria-pressed]=\"!ordered()\"\n (click)=\"setOrdered(false)\"\n >\n • {{ i18n.blockEditor.bulleted }}\n </button>\n <button\n type=\"button\"\n class=\"mk-list-block__opt\"\n [class.mk-list-block__opt--active]=\"ordered()\"\n [attr.aria-pressed]=\"ordered()\"\n (click)=\"setOrdered(true)\"\n >\n 1. {{ i18n.blockEditor.numbered }}\n </button>\n </div>\n }\n @if (ordered()) {\n <ol class=\"mk-list-block__list\">\n @for (item of items(); track $index) {\n <li class=\"mk-list-block__item\">\n <mk-rich-text-engine\n [html]=\"item\"\n [placeholder]=\"i18n.blockEditor.listItem\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.listItem\"\n (contentChange)=\"onItem($index, $event)\"\n (splitAt)=\"onSplit($index, $event)\"\n (removeEmpty)=\"onRemove($index)\"\n />\n </li>\n }\n </ol>\n } @else {\n <ul class=\"mk-list-block__list\">\n @for (item of items(); track $index) {\n <li class=\"mk-list-block__item\">\n <mk-rich-text-engine\n [html]=\"item\"\n [placeholder]=\"i18n.blockEditor.listItem\"\n [disabled]=\"readonly()\"\n [multiline]=\"false\"\n [ariaLabel]=\"i18n.blockEditor.listItem\"\n (contentChange)=\"onItem($index, $event)\"\n (splitAt)=\"onSplit($index, $event)\"\n (removeEmpty)=\"onRemove($index)\"\n />\n </li>\n }\n </ul>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-list-block__opts {\n display: inline-flex;\n gap: 2px;\n margin-bottom: var(--mk-space-2);\n padding: 2px;\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface-2);\n }\n .mk-list-block__opt {\n height: 24px;\n padding: 0 var(--mk-space-2);\n border: none;\n border-radius: var(--mk-radius-xs);\n background: transparent;\n color: var(--mk-text-muted);\n font: inherit;\n font-size: var(--mk-font-size-xs);\n font-weight: var(--mk-font-weight-medium);\n cursor: pointer;\n }\n .mk-list-block__opt:hover {\n background: var(--mk-hover-overlay);\n }\n .mk-list-block__opt--active {\n background: var(--mk-primary);\n color: var(--mk-primary-contrast);\n }\n .mk-list-block__opt:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n .mk-list-block__list {\n margin: 0;\n padding-inline-start: var(--mk-space-6);\n color: var(--mk-text);\n }\n .mk-list-block__item {\n margin: var(--mk-space-1) 0;\n }\n `,\n ],\n})\nexport class MkListBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly ordered = computed(() => !!this.block().data['ordered']);\n protected readonly items = computed<string[]>(() => {\n const items = this.block().data['items'];\n return Array.isArray(items) && items.length ? items : [''];\n });\n\n protected setOrdered(ordered: boolean): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ordered } });\n }\n\n protected onItem(index: number, html: string): void {\n const items = [...this.items()];\n items[index] = html;\n this.emitItems(items);\n }\n\n protected onSplit(index: number, split: MkRichTextSplit): void {\n const items = [...this.items()];\n items[index] = split.before;\n items.splice(index + 1, 0, split.after);\n this.emitItems(items);\n }\n\n protected onRemove(index: number): void {\n const items = [...this.items()];\n if (items.length <= 1) return;\n items.splice(index, 1);\n this.emitItems(items);\n }\n\n private emitItems(items: string[]): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, items } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\n\n/**\n * Code block — a plain, monospace, preformatted text area. Content is stored as\n * raw text (never executed, never interpreted as HTML) in `block.data.code`.\n */\n@Component({\n selector: 'mk-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (!readonly()) {\n <input\n class=\"mk-code-block__lang\"\n type=\"text\"\n [value]=\"block().data['language'] ?? ''\"\n [placeholder]=\"i18n.blockEditor.codeLanguagePlaceholder\"\n [attr.aria-label]=\"i18n.blockEditor.codeLanguage\"\n (input)=\"onLang($event)\"\n />\n }\n <textarea\n class=\"mk-code-block__area\"\n data-mk-focus\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n [value]=\"block().data['code'] ?? ''\"\n [readOnly]=\"readonly()\"\n [rows]=\"rows()\"\n [placeholder]=\"i18n.blockEditor.enterCode\"\n [attr.aria-label]=\"i18n.blockEditor.blockCode\"\n (input)=\"onCode($event)\"\n ></textarea>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .mk-code-block__lang {\n display: block;\n margin-bottom: var(--mk-space-1);\n padding: var(--mk-space-1) var(--mk-space-2);\n border: var(--mk-border-width) solid var(--mk-border);\n border-radius: var(--mk-radius-sm);\n background: var(--mk-surface);\n color: var(--mk-text-muted);\n font-family: var(--mk-font-mono);\n font-size: var(--mk-font-size-xs);\n }\n .mk-code-block__area {\n display: block;\n width: 100%;\n min-height: 4em;\n padding: var(--mk-space-3);\n border: var(--mk-border-width) solid var(--mk-border);\n border-radius: var(--mk-radius-md);\n background: var(--mk-code-bg);\n color: var(--mk-text);\n font-family: var(--mk-font-mono);\n font-size: var(--mk-font-size-sm);\n line-height: var(--mk-line-height-normal);\n resize: vertical;\n tab-size: 2;\n }\n .mk-code-block__area:focus-visible,\n .mk-code-block__lang:focus-visible {\n outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);\n outline-offset: var(--mk-focus-ring-offset);\n }\n `,\n ],\n})\nexport class MkCodeBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected rows(): number {\n const lines = String(this.block().data['code'] ?? '').split('\\n').length;\n return Math.max(3, Math.min(30, lines + 1));\n }\n\n protected onCode(event: Event): void {\n const b = this.block();\n const code = (event.target as HTMLTextAreaElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, code } });\n }\n\n protected onLang(event: Event): void {\n const b = this.block();\n const language = (event.target as HTMLInputElement).value;\n this.blockChange.emit({ ...b, data: { ...b.data, language } });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkBlockEditorContext } from './block-context';\n\ntype ImageAlign = 'left' | 'center' | 'right';\n\n/**\n * Image block — upload (file picker or drag-drop) or paste a URL. If an\n * `uploadHandler` is configured (editor input or {@link MK_BLOCK_UPLOAD_HANDLER}\n * token) it is used to persist the file and get back a URL; otherwise the file\n * is read as an inline `data:` URL via `FileReader`. Supports alt text,\n * caption, width and alignment.\n */\n@Component({\n selector: 'mk-image-block',\n templateUrl: './image-block.html',\n styleUrl: './image-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkImageBlock {\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly aligns: ImageAlign[] = ['left', 'center', 'right'];\n protected readonly uploading = signal(false);\n protected readonly error = signal<string | null>(null);\n protected readonly dragActive = signal(false);\n\n protected src(): string {\n return this.block().data['src'] ?? '';\n }\n\n /** Localised caption for an alignment option. */\n protected alignLabel(align: ImageAlign): string {\n const s = this.i18n.blockEditor;\n return { left: s.alignLeft, center: s.alignCenter, right: s.alignRight }[align];\n }\n\n protected openPicker(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n protected onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.handleFile(file);\n input.value = '';\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragActive.set(false);\n if (this.readonly()) return;\n const file = event.dataTransfer?.files?.[0];\n if (file) this.handleFile(file);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.readonly()) return;\n event.preventDefault();\n this.dragActive.set(true);\n }\n\n protected onDragLeave(): void {\n this.dragActive.set(false);\n }\n\n protected onUrl(event: Event): void {\n const value = (event.target as HTMLInputElement).value.trim();\n this.patch({ src: value });\n }\n\n protected onAlt(event: Event): void {\n this.patch({ alt: (event.target as HTMLInputElement).value });\n }\n\n protected onCaption(event: Event): void {\n this.patch({ caption: (event.target as HTMLInputElement).value });\n }\n\n protected setAlign(align: ImageAlign): void {\n this.patch({ align });\n }\n\n protected onWidth(event: Event): void {\n this.patch({ width: Number((event.target as HTMLInputElement).value) });\n }\n\n protected clear(): void {\n this.patch({ src: '' });\n }\n\n private async handleFile(file: File): Promise<void> {\n if (!file.type.startsWith('image/')) {\n this.error.set(this.i18n.blockEditor.notAnImage);\n return;\n }\n this.error.set(null);\n this.uploading.set(true);\n try {\n const handler = this.ctx.uploadHandler();\n const url = handler ? await handler(file) : await this.readAsDataUrl(file);\n this.patch({ src: url, alt: this.block().data['alt'] || file.name });\n this.ctx.announce(this.i18n.blockEditor.imageAdded);\n } catch {\n this.error.set(this.i18n.blockEditor.uploadFailed);\n } finally {\n this.uploading.set(false);\n }\n }\n\n private readAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n }\n\n private patch(data: Record<string, any>): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ...data } });\n }\n}\n","<input\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n class=\"mk-image-block__file\"\n hidden\n (change)=\"onFileSelected($event)\"\n/>\n\n@if (src()) {\n <figure\n class=\"mk-image-block__figure\"\n [class.mk-image-block__figure--left]=\"block().data['align'] === 'left'\"\n [class.mk-image-block__figure--right]=\"block().data['align'] === 'right'\"\n >\n <img\n class=\"mk-image-block__img\"\n [src]=\"src()\"\n [alt]=\"block().data['alt'] ?? ''\"\n [style.width.%]=\"block().data['width'] || 100\"\n />\n @if (block().data['caption'] || !readonly()) {\n <figcaption class=\"mk-image-block__caption\">{{ block().data['caption'] }}</figcaption>\n }\n </figure>\n\n @if (!readonly()) {\n <div class=\"mk-image-block__settings\">\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.altText }}</span>\n <input type=\"text\" [value]=\"block().data['alt'] ?? ''\" (input)=\"onAlt($event)\" />\n </label>\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.caption }}</span>\n <input type=\"text\" [value]=\"block().data['caption'] ?? ''\" (input)=\"onCaption($event)\" />\n </label>\n <div class=\"mk-image-block__field\">\n <span id=\"mk-img-align\">{{ i18n.blockEditor.alignment }}</span>\n <div class=\"mk-image-block__aligns\" role=\"group\" aria-labelledby=\"mk-img-align\">\n @for (a of aligns; track a) {\n <button\n type=\"button\"\n class=\"mk-image-block__align\"\n [class.mk-image-block__align--active]=\"(block().data['align'] ?? 'center') === a\"\n [attr.aria-pressed]=\"(block().data['align'] ?? 'center') === a\"\n (click)=\"setAlign(a)\"\n >\n {{ alignLabel(a) }}\n </button>\n }\n </div>\n </div>\n <label class=\"mk-image-block__field\">\n <span>{{ i18n.blockEditor.imageWidth(block().data['width'] || 100) }}</span>\n <input\n type=\"range\"\n min=\"20\"\n max=\"100\"\n step=\"5\"\n [value]=\"block().data['width'] || 100\"\n (input)=\"onWidth($event)\"\n />\n </label>\n <button type=\"button\" class=\"mk-image-block__replace\" (click)=\"clear()\">\n {{ i18n.blockEditor.replaceImage }}\n </button>\n </div>\n }\n} @else {\n <div\n class=\"mk-image-block__drop\"\n [class.mk-image-block__drop--active]=\"dragActive()\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave()\"\n >\n @if (uploading()) {\n <p class=\"mk-image-block__hint\">{{ i18n.blockEditor.uploading }}</p>\n } @else {\n <p class=\"mk-image-block__icon\" aria-hidden=\"true\">🖼</p>\n <p class=\"mk-image-block__hint\">{{ i18n.blockEditor.dropImagePrompt }}</p>\n <button\n type=\"button\"\n class=\"mk-image-block__upload\"\n data-mk-focus\n [disabled]=\"readonly()\"\n (click)=\"openPicker()\"\n >\n {{ i18n.blockEditor.chooseFile }}\n </button>\n <label class=\"mk-image-block__url\">\n <span class=\"mk-visually-hidden\">{{ i18n.blockEditor.imageUrl }}</span>\n <input\n type=\"url\"\n [placeholder]=\"i18n.blockEditor.pasteImageUrl\"\n [disabled]=\"readonly()\"\n (change)=\"onUrl($event)\"\n />\n </label>\n }\n @if (error()) {\n <p class=\"mk-image-block__error\" role=\"alert\">{{ error() }}</p>\n }\n </div>\n}\n","import { sanitizeInlineHtml } from '@mk-kit/ui/rich-text';\nimport type { MkBlock, MkBlockDocument } from './block-model';\n\n/**\n * Pure HTML/text serialisers for a {@link MkBlockDocument}.\n *\n * SECURITY MODEL: text blocks (`paragraph`, `heading`, `quote`, `list`) store\n * HTML authored through the editor's restricted formatting commands. Before it\n * ever reaches a string of markup here it is passed through\n * {@link sanitizeInlineHtml} (from `@mk-kit/ui/rich-text`), an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs.\n * `mk-block-renderer` additionally re-sanitises through Angular's\n * `DomSanitizer` at display time. These serialisers are dependency-free so\n * they can run on a server (SSG/SSR) — never feed their output back into\n * `innerHTML` without sanitising again.\n */\n\n// Re-exported for backward compatibility — the implementation moved to the\n// rich-text entry alongside the editing surface it protects.\nexport { sanitizeInlineHtml };\n\n/** Escapes text for safe placement in element content. */\nexport function mkEscapeHtml(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nexport function mkEscapeAttr(value: string): string {\n return mkEscapeHtml(value).replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nexport function mkIsSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/** Maps a ratio preset like `66-33` to a CSS `grid-template-columns` value. */\nexport function mkRatioToColumns(ratio: string, count: number): string {\n const parts = String(ratio ?? '')\n .split('-')\n .map((n) => parseFloat(n))\n .filter((n) => !isNaN(n) && n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${Math.max(1, count || 1)}, 1fr)`;\n}\n\nconst HEADING_LEVELS = new Set([1, 2, 3, 4]);\n\n/** Serialises one block to a semantic HTML string. */\nfunction blockToHtml(b: MkBlock): string {\n switch (b.type) {\n case 'paragraph':\n return `<p>${sanitizeInlineHtml(b.data['html'] ?? '')}</p>`;\n\n case 'heading': {\n const level = HEADING_LEVELS.has(b.data['level']) ? b.data['level'] : 2;\n return `<h${level}>${sanitizeInlineHtml(b.data['html'] ?? '')}</h${level}>`;\n }\n\n case 'list': {\n const ordered = !!b.data['ordered'];\n const tag = ordered ? 'ol' : 'ul';\n const items: string[] = Array.isArray(b.data['items']) ? b.data['items'] : [];\n const li = items.map((it) => `<li>${sanitizeInlineHtml(it ?? '')}</li>`).join('');\n return `<${tag}>${li}</${tag}>`;\n }\n\n case 'quote': {\n const cite = String(b.data['citation'] ?? '').trim();\n const citeHtml = cite ? `<cite>${mkEscapeHtml(cite)}</cite>` : '';\n return `<blockquote><p>${sanitizeInlineHtml(b.data['html'] ?? '')}</p>${citeHtml}</blockquote>`;\n }\n\n case 'code': {\n const code = mkEscapeHtml(b.data['code'] ?? '');\n const lang = String(b.data['language'] ?? '').trim();\n const cls = lang ? ` class=\"language-${mkEscapeAttr(lang)}\"` : '';\n return `<pre><code${cls}>${code}</code></pre>`;\n }\n\n case 'image': {\n const src = String(b.data['src'] ?? '');\n if (!mkIsSafeUrl(src) || !src) return '';\n const align = String(b.data['align'] ?? 'center');\n const width = Number(b.data['width']) || 100;\n const alt = mkEscapeAttr(b.data['alt'] ?? '');\n const caption = String(b.data['caption'] ?? '').trim();\n const figStyle = `text-align:${align === 'left' ? 'left' : align === 'right' ? 'right' : 'center'};margin:1rem 0;`;\n const img = `<img src=\"${mkEscapeAttr(src)}\" alt=\"${alt}\" style=\"max-width:${Math.min(100, Math.max(10, width))}%;height:auto;border-radius:.5rem;\" loading=\"lazy\">`;\n const cap = caption ? `<figcaption style=\"font-size:.875rem;opacity:.75;margin-top:.5rem;\">${mkEscapeHtml(caption)}</figcaption>` : '';\n return `<figure style=\"${figStyle}\">${img}${cap}</figure>`;\n }\n\n case 'button': {\n const href = String(b.data['href'] ?? '');\n const label = mkEscapeHtml(b.data['label'] ?? 'Button');\n const align = String(b.data['align'] ?? 'left');\n const safe = mkIsSafeUrl(href) && href ? mkEscapeAttr(href) : '#';\n const wrapStyle = `text-align:${align};margin:1rem 0;`;\n const btnStyle =\n 'display:inline-block;padding:.6rem 1.1rem;border-radius:.5rem;text-decoration:none;font-weight:600;';\n return `<div style=\"${wrapStyle}\"><a href=\"${safe}\" class=\"mk-cta mk-cta--${mkEscapeAttr(b.data['tone'] ?? 'primary')}\" style=\"${btnStyle}\" rel=\"noopener noreferrer\">${label}</a></div>`;\n }\n\n case 'divider':\n return '<hr>';\n\n case 'embed': {\n const url = String(b.data['url'] ?? '');\n const embedUrl = String(b.data['embedUrl'] ?? '');\n const ratio = Number(b.data['aspectRatio']) || 16 / 9;\n if (embedUrl && mkIsSafeUrl(embedUrl)) {\n const pad = (100 / ratio).toFixed(3);\n return (\n `<div class=\"mk-embed\" style=\"position:relative;width:100%;padding-top:${pad}%;margin:1rem 0;\">` +\n `<iframe src=\"${mkEscapeAttr(embedUrl)}\" title=\"Embedded content\" loading=\"lazy\" ` +\n `sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\" ` +\n `referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen ` +\n `style=\"position:absolute;inset:0;width:100%;height:100%;border:0;border-radius:.5rem;\"></iframe></div>`\n );\n }\n if (mkIsSafeUrl(url) && url) {\n return `<p class=\"mk-embed-fallback\"><a href=\"${mkEscapeAttr(url)}\" rel=\"noopener noreferrer\" target=\"_blank\">${mkEscapeHtml(url)}</a></p>`;\n }\n return '';\n }\n\n case 'columns': {\n const count = Number(b.data['count']) || (b.children?.length ?? 2);\n const cols = mkRatioToColumns(b.data['ratio'] ?? '', count);\n const gap = (Number(b.data['gap']) || 4) * 0.25;\n const align = String(b.data['align'] ?? 'stretch');\n const justify = String(b.data['justify'] ?? 'start');\n const justifyMap: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n const style =\n `display:grid;grid-template-columns:${cols};gap:${gap}rem;align-items:${align};` +\n `justify-content:${justifyMap[justify] ?? 'flex-start'};margin:1rem 0;`;\n const columns = (b.children ?? [])\n .map((col) => `<div class=\"mk-column\">${(col.children ?? []).map(blockToHtml).join('')}</div>`)\n .join('');\n return `<div class=\"mk-columns\" style=\"${style}\">${columns}</div>`;\n }\n\n case 'column':\n return (b.children ?? []).map(blockToHtml).join('');\n\n default:\n return '';\n }\n}\n\n/**\n * Serialises a document to clean, semantic, self-contained HTML — the \"rich\n * HTML content\" you persist and publish for a blog post or content page.\n * Layout blocks become responsive grid wrappers with inline styles.\n */\nexport function mkBlocksToHtml(doc: MkBlockDocument | null | undefined): string {\n if (!doc?.blocks?.length) return '';\n return doc.blocks.map(blockToHtml).join('\\n');\n}\n\n/** Strips all tags, collapsing a block to its text content. */\nfunction stripTags(html: string): string {\n return String(html ?? '')\n .replace(/<[^>]*>/g, ' ')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Collects the plain-text content of a block subtree. */\nfunction blockToText(b: MkBlock): string {\n switch (b.type) {\n case 'paragraph':\n case 'heading':\n case 'quote':\n return stripTags(b.data['html'] ?? '');\n case 'list':\n return (Array.isArray(b.data['items']) ? b.data['items'] : [])\n .map((i: string) => stripTags(i))\n .filter(Boolean)\n .join(' · ');\n case 'code':\n return String(b.data['code'] ?? '').trim();\n case 'image':\n return String(b.data['caption'] ?? b.data['alt'] ?? '').trim();\n case 'button':\n return String(b.data['label'] ?? '').trim();\n case 'embed':\n return String(b.data['url'] ?? '').trim();\n case 'columns':\n case 'column':\n return (b.children ?? [])\n .map((c) => (c.type === 'column' ? blockToText(c) : blockToText(c)))\n .filter(Boolean)\n .join(' ');\n default:\n return '';\n }\n}\n\n/**\n * Serialises a document to plain text — handy for previews, excerpts, search\n * indexes and meta descriptions.\n */\nexport function mkBlocksToText(doc: MkBlockDocument | null | undefined): string {\n if (!doc?.blocks?.length) return '';\n return doc.blocks\n .map(blockToText)\n .filter((t) => t.length > 0)\n .join('\\n\\n');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\nimport { MkBlockEditorContext } from './block-context';\nimport { mkIsSafeUrl } from './block-serializer';\n\n/**\n * Embed block — paste a URL; matching allow-listed providers (YouTube, Vimeo,\n * plus any supplied via `embedProviders`) render a SANDBOXED iframe. The only\n * value passed to `DomSanitizer.bypassSecurityTrustResourceUrl` is the\n * provider-transformed embed URL (never the raw pasted string). Non-matching\n * URLs fall back to a safe link card — raw HTML is never injected.\n */\n@Component({\n selector: 'mk-embed-block',\n templateUrl: './embed-block.html',\n styleUrl: './embed-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkEmbedBlock {\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly sanitizer = inject(DomSanitizer);\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly embedUrl = computed<string>(() => this.block().data['embedUrl'] ?? '');\n protected readonly url = computed<string>(() => this.block().data['url'] ?? '');\n protected readonly aspectRatio = computed(() => Number(this.block().data['aspectRatio']) || 16 / 9);\n protected readonly providerName = computed<string>(() => this.block().data['provider'] ?? '');\n protected readonly paddingTop = computed(() => `${100 / this.aspectRatio()}%`);\n\n /** Only ever wraps a provider-transformed URL — see the class doc. */\n protected readonly safeSrc = computed<SafeResourceUrl | null>(() => {\n const src = this.embedUrl();\n if (!src || !mkIsSafeUrl(src) || !/^https:\\/\\//i.test(src)) return null;\n return this.sanitizer.bypassSecurityTrustResourceUrl(src);\n });\n\n protected readonly hasFallback = computed(\n () => !this.embedUrl() && !!this.url() && mkIsSafeUrl(this.url()),\n );\n\n protected onUrl(event: Event): void {\n const raw = (event.target as HTMLInputElement).value.trim();\n this.resolve(raw);\n }\n\n private resolve(raw: string): void {\n const b = this.block();\n if (!raw) {\n this.blockChange.emit({ ...b, data: { ...b.data, url: '', embedUrl: '', provider: '' } });\n return;\n }\n for (const provider of this.ctx.embedProviders()) {\n if (provider.test.test(raw)) {\n const embedUrl = provider.toEmbedUrl(raw);\n if (embedUrl) {\n this.blockChange.emit({\n ...b,\n data: {\n ...b.data,\n url: raw,\n embedUrl,\n provider: provider.name,\n aspectRatio: provider.aspectRatio ?? 16 / 9,\n },\n });\n this.ctx.announce(this.i18n.blockEditor.embedAdded(provider.name));\n return;\n }\n }\n }\n // No provider matched — keep the URL for the safe link-card fallback.\n this.blockChange.emit({ ...b, data: { ...b.data, url: raw, embedUrl: '', provider: '' } });\n }\n}\n","@if (safeSrc()) {\n <div class=\"mk-embed-block__frame\" [style.padding-top]=\"paddingTop()\">\n <iframe\n class=\"mk-embed-block__iframe\"\n [src]=\"safeSrc()\"\n [title]=\"i18n.blockEditor.embedTitle(providerName())\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\"\n allowfullscreen\n ></iframe>\n </div>\n} @else if (hasFallback()) {\n <a class=\"mk-embed-block__card\" [href]=\"url()\" target=\"_blank\" rel=\"noopener noreferrer\">\n <span class=\"mk-embed-block__card-icon\" aria-hidden=\"true\">🔗</span>\n <span class=\"mk-embed-block__card-body\">\n <span class=\"mk-embed-block__card-title\">{{ i18n.blockEditor.externalContent }}</span>\n <span class=\"mk-embed-block__card-url\">{{ url() }}</span>\n </span>\n </a>\n}\n\n@if (!readonly()) {\n <label class=\"mk-embed-block__input\">\n <span class=\"mk-visually-hidden\">{{ i18n.blockEditor.embedUrl }}</span>\n <input\n type=\"url\"\n data-mk-focus\n [value]=\"url()\"\n [placeholder]=\"i18n.blockEditor.pasteEmbedUrl\"\n (change)=\"onUrl($event)\"\n />\n </label>\n @if (url() && !safeSrc() && !hasFallback()) {\n <p class=\"mk-embed-block__note\">{{ i18n.blockEditor.embedFallbackNote }}</p>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkTone, MkVariant } from '@mk-kit/ui/core';\nimport type { MkBlock } from './block-model';\n\ntype Align = 'left' | 'center' | 'right';\n\nconst TONES: MkTone[] = ['primary', 'neutral', 'success', 'warning', 'danger', 'info'];\n\n/**\n * Button/CTA block — a themed call-to-action link with configurable label,\n * href, tone, variant and alignment. Styling mirrors the mk-kit button tokens.\n */\n@Component({\n selector: 'mk-button-block',\n templateUrl: './button-block.html',\n styleUrl: './button-block.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkButtonBlock {\n protected readonly i18n = inject(MK_I18N);\n\n readonly block = input.required<MkBlock>();\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly blockChange = output<MkBlock>();\n\n protected readonly tones = TONES;\n protected readonly aligns: Align[] = ['left', 'center', 'right'];\n protected readonly variants: MkVariant[] = ['solid', 'soft', 'outline'];\n\n protected data(key: string): any {\n return this.block().data[key];\n }\n\n /** Localised captions for the tone / variant / alignment option buttons. */\n protected toneLabel(tone: MkTone): string {\n const s = this.i18n.blockEditor;\n const map: Record<MkTone, string> = {\n primary: s.tonePrimary,\n neutral: s.toneNeutral,\n success: s.toneSuccess,\n warning: s.toneWarning,\n danger: s.toneDanger,\n info: s.toneInfo,\n };\n return map[tone];\n }\n protected variantLabel(variant: MkVariant): string {\n const s = this.i18n.blockEditor;\n const map: Partial<Record<MkVariant, string>> = {\n solid: s.variantSolid,\n soft: s.variantSoft,\n outline: s.variantOutline,\n };\n return map[variant] ?? variant;\n }\n protected alignLabel(align: Align): string {\n const s = this.i18n.blockEditor;\n return { left: s.alignLeft, center: s.alignCenter, right: s.alignRight }[align];\n }\n\n protected onLabel(event: Event): void {\n this.patch({ label: (event.target as HTMLInputElement).value });\n }\n protected onHref(event: Event): void {\n this.patch({ href: (event.target as HTMLInputElement).value.trim() });\n }\n protected setTone(tone: MkTone): void {\n this.patch({ tone });\n }\n protected setVariant(variant: MkVariant): void {\n this.patch({ variant });\n }\n protected setAlign(align: Align): void {\n this.patch({ align });\n }\n\n private patch(data: Record<string, any>): void {\n const b = this.block();\n this.blockChange.emit({ ...b, data: { ...b.data, ...data } });\n }\n}\n","<div\n class=\"mk-button-block__preview\"\n [class.mk-button-block__preview--center]=\"(data('align') ?? 'left') === 'center'\"\n [class.mk-button-block__preview--right]=\"(data('align') ?? 'left') === 'right'\"\n>\n <a\n class=\"mk-cta\"\n [class.mk-cta--soft]=\"data('variant') === 'soft'\"\n [class.mk-cta--outline]=\"data('variant') === 'outline'\"\n [attr.data-tone]=\"data('tone') ?? 'primary'\"\n [attr.href]=\"readonly() ? (data('href') || null) : null\"\n [attr.target]=\"readonly() ? '_blank' : null\"\n rel=\"noopener noreferrer\"\n data-mk-focus\n >\n {{ data('label') || i18n.blockEditor.blockButton }}\n </a>\n</div>\n\n@if (!readonly()) {\n <div class=\"mk-button-block__settings\">\n <label class=\"mk-button-block__field\">\n <span>{{ i18n.blockEditor.buttonLabel }}</span>\n <input type=\"text\" [value]=\"data('label') ?? ''\" (input)=\"onLabel($event)\" />\n </label>\n <label class=\"mk-button-block__field\">\n <span>{{ i18n.blockEditor.buttonLink }}</span>\n <input type=\"url\" [value]=\"data('href') ?? ''\" placeholder=\"https://…\" (input)=\"onHref($event)\" />\n </label>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-tone\">{{ i18n.blockEditor.buttonTone }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-tone\">\n @for (t of tones; track t) {\n <button\n type=\"button\"\n class=\"mk-button-block__swatch\"\n [attr.data-tone]=\"t\"\n [class.mk-button-block__swatch--active]=\"(data('tone') ?? 'primary') === t\"\n [attr.aria-pressed]=\"(data('tone') ?? 'primary') === t\"\n [attr.aria-label]=\"toneLabel(t)\"\n [title]=\"toneLabel(t)\"\n (click)=\"setTone(t)\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-variant\">{{ i18n.blockEditor.buttonVariant }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-variant\">\n @for (v of variants; track v) {\n <button\n type=\"button\"\n class=\"mk-button-block__pill\"\n [class.mk-button-block__pill--active]=\"(data('variant') ?? 'solid') === v\"\n [attr.aria-pressed]=\"(data('variant') ?? 'solid') === v\"\n (click)=\"setVariant(v)\"\n >\n {{ variantLabel(v) }}\n </button>\n }\n </div>\n </div>\n\n <div class=\"mk-button-block__field\">\n <span id=\"mk-cta-align\">{{ i18n.blockEditor.alignment }}</span>\n <div class=\"mk-button-block__row\" role=\"group\" aria-labelledby=\"mk-cta-align\">\n @for (a of aligns; track a) {\n <button\n type=\"button\"\n class=\"mk-button-block__pill\"\n [class.mk-button-block__pill--active]=\"(data('align') ?? 'left') === a\"\n [attr.aria-pressed]=\"(data('align') ?? 'left') === a\"\n (click)=\"setAlign(a)\"\n >\n {{ alignLabel(a) }}\n </button>\n }\n </div>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n DestroyRef,\n ElementRef,\n Injectable,\n OnDestroy,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlockDefinition } from './block-registry';\n\n/** A definition annotated with its index in the flat filtered list. */\ninterface IndexedDef {\n def: MkBlockDefinition;\n /** Global index within `filtered()` — drives active-option highlighting. */\n index: number;\n}\n\n/** A group of definitions for the inserter list. */\ninterface DefGroup {\n name: string;\n items: IndexedDef[];\n}\n\n/**\n * Shares ONE capture-phase document `pointerdown` listener between every\n * mounted {@link MkBlockInserter} (a block list renders an inserter per block,\n * so per-instance listeners made document dispatch O(blocks)). The listener is\n * attached lazily with the first registration and detached when the last\n * callback unregisters. No-ops on the server (SSR).\n */\n@Injectable({ providedIn: 'root' })\nexport class MkDocumentPointerdownRegistry {\n private readonly document = inject(DOCUMENT);\n private readonly callbacks = new Set<(event: Event) => void>();\n private readonly listener = (event: Event): void => {\n // Copy so a callback closing (and unregistering) mid-dispatch is safe.\n for (const callback of [...this.callbacks]) callback(event);\n };\n\n /** Registers a callback; returns an unregister function. */\n register(callback: (event: Event) => void): () => void {\n if (typeof window === 'undefined') return () => {};\n if (this.callbacks.size === 0) {\n this.document.addEventListener('pointerdown', this.listener, true);\n }\n this.callbacks.add(callback);\n return () => {\n if (!this.callbacks.delete(callback)) return;\n if (this.callbacks.size === 0) {\n this.document.removeEventListener('pointerdown', this.listener, true);\n }\n };\n }\n}\n\n/**\n * Block inserter — a \"+ Add block\" control that opens a filterable, keyboard\n * accessible palette of the configured blocks, grouped by `group`. Renders\n * either as a full button or a slim between-blocks divider trigger.\n *\n * Keyboard: type to filter, ArrowUp/Down to move, Enter to insert, Esc to\n * close. Implements the combobox → listbox pattern.\n */\n@Component({\n selector: 'mk-block-inserter',\n templateUrl: './block-inserter.html',\n styleUrl: './block-inserter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-block-inserter',\n '[class.mk-block-inserter--slim]': \"variant() === 'slim'\",\n },\n})\nexport class MkBlockInserter implements OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly searchRef = viewChild<ElementRef<HTMLInputElement>>('search');\n protected readonly i18n = inject(MK_I18N);\n private focusTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // One shared document listener for all inserters (instead of N host\n // `(document:pointerdown)` bindings — one per rendered inserter).\n const unregister = inject(MkDocumentPointerdownRegistry).register((event) =>\n this.onDocumentPointerdown(event),\n );\n inject(DestroyRef).onDestroy(unregister);\n }\n\n ngOnDestroy(): void {\n if (this.focusTimer !== null) {\n clearTimeout(this.focusTimer);\n this.focusTimer = null;\n }\n }\n\n /** The blocks to offer. */\n readonly definitions = input<MkBlockDefinition[]>([]);\n /** Trigger presentation: `button` (default) or `slim` between-blocks rule. */\n readonly variant = input<'button' | 'slim'>('button');\n /** Trigger label. */\n readonly label = input<string>(this.i18n.blockEditor.addBlock);\n /** Disable the trigger. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** When true, only blocks allowed inside columns are shown. */\n readonly columnsOnly = input(false, { transform: booleanAttribute });\n\n /** Emitted with the chosen definition. */\n readonly pick = output<MkBlockDefinition>();\n\n protected readonly open = signal(false);\n protected readonly query = signal('');\n protected readonly activeIndex = signal(0);\n protected readonly panelId = mkUniqueId('mk-inserter-panel');\n protected readonly listId = mkUniqueId('mk-inserter-list');\n\n protected readonly available = computed(() =>\n this.definitions().filter((d) => (this.columnsOnly() ? d.allowedInColumns !== false : true)),\n );\n\n /** Flat, filtered list in display order (used for keyboard navigation). */\n protected readonly filtered = computed(() => {\n const q = this.query().trim().toLowerCase();\n if (!q) return this.available();\n return this.available().filter((d) => {\n const hay = [d.label, d.type, d.group ?? '', ...(d.keywords ?? [])].join(' ').toLowerCase();\n return hay.includes(q);\n });\n });\n\n /**\n * Filtered list grouped by `group` for rendering, with each option carrying\n * its flat index (single pass — the template previously resolved each\n * option's index with three `indexOf` scans, O(n²) per render).\n */\n protected readonly groups = computed<DefGroup[]>(() => {\n const map = new Map<string, IndexedDef[]>();\n this.filtered().forEach((def, index) => {\n const key = def.group ?? this.i18n.blockEditor.blocks;\n (map.get(key) ?? map.set(key, []).get(key)!).push({ def, index });\n });\n return [...map.entries()].map(([name, items]) => ({ name, items }));\n });\n\n protected optionId(index: number): string {\n return `${this.listId}-opt-${index}`;\n }\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n private openPanel(): void {\n this.open.set(true);\n this.query.set('');\n this.activeIndex.set(0);\n if (this.focusTimer !== null) clearTimeout(this.focusTimer);\n this.focusTimer = setTimeout(() => {\n this.focusTimer = null;\n this.searchRef()?.nativeElement.focus();\n });\n }\n\n protected close(): void {\n if (!this.open()) return;\n this.open.set(false);\n }\n\n protected onQuery(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const list = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.activeIndex.update((i) => (list.length ? (i + 1) % list.length : 0));\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.activeIndex.update((i) => (list.length ? (i - 1 + list.length) % list.length : 0));\n break;\n case 'Enter':\n event.preventDefault();\n if (list[this.activeIndex()]) this.choose(list[this.activeIndex()]);\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n protected choose(def: MkBlockDefinition): void {\n this.pick.emit(def);\n this.close();\n }\n\n protected onDocumentPointerdown(event: Event): void {\n if (!this.open()) return;\n if (!this.host.nativeElement.contains(event.target as Node)) this.close();\n }\n}\n","@if (variant() === 'slim') {\n <button\n type=\"button\"\n class=\"mk-block-inserter__slim-trigger\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.blockEditor.insertBlockHere\"\n (click)=\"toggle()\"\n >\n <span class=\"mk-block-inserter__plus\" aria-hidden=\"true\">+</span>\n </button>\n} @else {\n <button\n type=\"button\"\n class=\"mk-block-inserter__trigger\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\"\n >\n <span class=\"mk-block-inserter__plus\" aria-hidden=\"true\">+</span>\n {{ label() }}\n </button>\n}\n\n@if (open()) {\n <div class=\"mk-block-inserter__panel\" [id]=\"panelId\" role=\"dialog\" [attr.aria-label]=\"i18n.blockEditor.blockInserter\">\n <input\n #search\n type=\"text\"\n class=\"mk-block-inserter__search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"filtered().length ? optionId(activeIndex()) : null\"\n [placeholder]=\"i18n.blockEditor.searchBlocks\"\n [value]=\"query()\"\n (input)=\"onQuery($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n\n <div class=\"mk-block-inserter__list\" [id]=\"listId\" role=\"listbox\" [attr.aria-label]=\"i18n.blockEditor.blocks\">\n @for (group of groups(); track group.name) {\n <div class=\"mk-block-inserter__group\" role=\"group\" [attr.aria-label]=\"group.name\">\n <div class=\"mk-block-inserter__group-label\">{{ group.name }}</div>\n @for (item of group.items; track item.def.type) {\n <button\n type=\"button\"\n class=\"mk-block-inserter__option\"\n [class.mk-block-inserter__option--active]=\"item.index === activeIndex()\"\n [id]=\"optionId(item.index)\"\n role=\"option\"\n [attr.aria-selected]=\"item.index === activeIndex()\"\n (mouseenter)=\"activeIndex.set(item.index)\"\n (click)=\"choose(item.def)\"\n >\n <span class=\"mk-block-inserter__icon\" aria-hidden=\"true\">{{ item.def.icon ?? '▢' }}</span>\n <span class=\"mk-block-inserter__text\">\n <span class=\"mk-block-inserter__name\">{{ item.def.label }}</span>\n @if (item.def.description) {\n <span class=\"mk-block-inserter__desc\">{{ item.def.description }}</span>\n }\n </span>\n </button>\n }\n </div>\n }\n @if (!filtered().length) {\n <p class=\"mk-block-inserter__empty\">{{ i18n.blockEditor.noBlocksMatch(query()) }}</p>\n }\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { type MkBlock, mkBlockId, mkCloneBlock } from './block-model';\nimport type { MkBlockDefinition } from './block-registry';\nimport { MkBlockEditorContext } from './block-context';\nimport type { MkRichTextSplit } from '@mk-kit/ui/rich-text';\nimport { MkParagraphBlock } from './paragraph-block';\nimport { MkHeadingBlock } from './heading-block';\nimport { MkQuoteBlock } from './quote-block';\nimport { MkListBlock } from './list-block';\nimport { MkCodeBlock } from './code-block';\nimport { MkImageBlock } from './image-block';\nimport { MkEmbedBlock } from './embed-block';\nimport { MkButtonBlock } from './button-block';\nimport { MkBlockInserter } from './block-inserter';\n\n/**\n * Column ratio presets offered per column count. An empty label means \"equal\n * widths\" and is rendered with the localised `ratioEqual` caption.\n */\nconst RATIO_PRESETS: Record<number, { value: string; label: string }[]> = {\n 2: [\n { value: '50-50', label: '50 / 50' },\n { value: '66-33', label: '66 / 33' },\n { value: '33-66', label: '33 / 66' },\n { value: '75-25', label: '75 / 25' },\n { value: '25-75', label: '25 / 75' },\n ],\n 3: [\n { value: '33-33-33', label: '' },\n { value: '50-25-25', label: '50 / 25 / 25' },\n { value: '25-50-25', label: '25 / 50 / 25' },\n ],\n 4: [{ value: '25-25-25-25', label: '' }],\n};\n\n/**\n * Recursive block list — renders an ordered array of blocks, each wrapped with\n * move/duplicate/delete/transform chrome and the type-specific editor, with\n * inserters between. Layout (columns) blocks recurse into nested\n * `mk-block-list`s. Owns all structural operations for its own array and emits\n * the new array via `blocksChange`; nested lists bubble their changes upward.\n */\n@Component({\n selector: 'mk-block-list',\n imports: [\n MkParagraphBlock,\n MkHeadingBlock,\n MkQuoteBlock,\n MkListBlock,\n MkCodeBlock,\n MkImageBlock,\n MkEmbedBlock,\n MkButtonBlock,\n MkBlockInserter,\n ],\n templateUrl: './block-list.html',\n styleUrl: './block-list.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-block-list' },\n})\nexport class MkBlockList {\n protected readonly ctx = inject(MkBlockEditorContext);\n protected readonly i18n = inject(MK_I18N);\n\n /** The blocks to render. */\n readonly blocks = input.required<MkBlock[]>();\n /** Nesting depth (0 = top level). Used to forbid columns-in-columns. */\n readonly depth = input(0);\n /** Restrict the inserter to column-safe blocks. */\n readonly inColumn = input(false, { transform: booleanAttribute });\n\n /** Emitted with the full, updated array on any structural or content change. */\n readonly blocksChange = output<MkBlock[]>();\n\n /** Which block's toolbar menu is open (by index), or -1. */\n protected readonly menuOpen = signal(-1);\n\n protected readonly ratioPresets = RATIO_PRESETS;\n\n protected definition(type: string): MkBlockDefinition | undefined {\n return this.ctx.definitionFor(type);\n }\n\n // --- content updates ------------------------------------------------------\n\n protected update(index: number, block: MkBlock): void {\n const next = [...this.blocks()];\n next[index] = block;\n this.blocksChange.emit(next);\n }\n\n protected onColumnChange(blockIndex: number, colIndex: number, children: MkBlock[]): void {\n const block = this.blocks()[blockIndex];\n const columns = [...(block.children ?? [])];\n columns[colIndex] = { ...columns[colIndex], children };\n this.update(blockIndex, { ...block, children: columns });\n }\n\n // --- structural ops -------------------------------------------------------\n\n protected insertAt(index: number, def: MkBlockDefinition): void {\n const block = def.create();\n const next = [...this.blocks()];\n next.splice(index, 0, block);\n this.blocksChange.emit(next);\n this.ctx.announce(this.i18n.blockEditor.blockAdded(def.label));\n this.ctx.focusBlock(block.id, 'start');\n }\n\n protected duplicate(index: number): void {\n const clone = mkCloneBlock(this.blocks()[index]);\n const next = [...this.blocks()];\n next.splice(index + 1, 0, clone);\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.blockDuplicated);\n }\n\n protected remove(index: number): void {\n const removed = this.blocks()[index];\n const next = this.blocks().filter((_, i) => i !== index);\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.blockDeleted(this.ctx.labelFor(removed.type)));\n const focusTarget = next[index - 1] ?? next[index];\n if (focusTarget) this.ctx.focusBlock(focusTarget.id, 'end');\n }\n\n protected move(index: number, delta: number): void {\n const target = index + delta;\n if (target < 0 || target >= this.blocks().length) return;\n const next = [...this.blocks()];\n [next[index], next[target]] = [next[target], next[index]];\n this.blocksChange.emit(next);\n this.ctx.announce(\n delta < 0 ? this.i18n.blockEditor.blockMovedUp : this.i18n.blockEditor.blockMovedDown,\n );\n }\n\n protected transform(index: number, type: string): void {\n const def = this.definition(type);\n if (!def) return;\n const source = this.blocks()[index];\n const created = def.create();\n // Carry rich-text HTML across text-type transforms where it makes sense.\n const carriesHtml = 'html' in created.data && typeof source.data['html'] === 'string';\n const data = carriesHtml ? { ...created.data, html: source.data['html'] } : created.data;\n const next = [...this.blocks()];\n next[index] = { ...created, id: source.id, data };\n this.blocksChange.emit(next);\n this.menuOpen.set(-1);\n this.ctx.announce(this.i18n.blockEditor.turnedInto(def.label));\n }\n\n // --- text-block keyboard intents -----------------------------------------\n\n protected onSplit(index: number, split: MkRichTextSplit): void {\n const current = this.blocks()[index];\n const paragraphDef = this.definition('paragraph');\n const created = paragraphDef ? paragraphDef.create() : this.fallbackParagraph();\n const newBlock: MkBlock = { ...created, data: { ...created.data, html: split.after } };\n const next = [...this.blocks()];\n next[index] = { ...current, data: { ...current.data, html: split.before } };\n next.splice(index + 1, 0, newBlock);\n this.blocksChange.emit(next);\n this.ctx.focusBlock(newBlock.id, 'start');\n }\n\n protected onMergeBack(index: number): void {\n if (index <= 0) return;\n const prev = this.blocks()[index - 1];\n this.remove(index);\n this.ctx.focusBlock(prev.id, 'end');\n }\n\n protected onArrowOut(index: number, dir: 'up' | 'down'): void {\n const target = dir === 'up' ? index - 1 : index + 1;\n const block = this.blocks()[target];\n if (block) this.ctx.focusBlock(block.id, dir === 'up' ? 'end' : 'start');\n }\n\n // --- columns helpers ------------------------------------------------------\n\n protected setColumnCount(index: number, count: number): void {\n const block = this.blocks()[index];\n const current = [...(block.children ?? [])];\n while (current.length < count) current.push({ id: mkBlockId('column'), type: 'column', data: {}, children: [] });\n current.length = count;\n const presets = RATIO_PRESETS[count] ?? RATIO_PRESETS[2];\n this.update(index, {\n ...block,\n data: { ...block.data, count, ratio: presets[0].value },\n children: current,\n });\n }\n\n protected setColumnData(index: number, patch: Record<string, any>): void {\n const block = this.blocks()[index];\n this.update(index, { ...block, data: { ...block.data, ...patch } });\n }\n\n protected onRatioChange(index: number, event: Event): void {\n this.setColumnData(index, { ratio: (event.target as HTMLSelectElement).value });\n }\n protected onGapChange(index: number, event: Event): void {\n this.setColumnData(index, { gap: Number((event.target as HTMLInputElement).value) });\n }\n protected onAlignChange(index: number, event: Event): void {\n this.setColumnData(index, { align: (event.target as HTMLSelectElement).value });\n }\n protected onJustifyChange(index: number, event: Event): void {\n this.setColumnData(index, { justify: (event.target as HTMLSelectElement).value });\n }\n\n protected gridColumns(block: MkBlock): string {\n const ratio = String(block.data['ratio'] ?? '');\n const parts = ratio.split('-').map((n) => parseFloat(n)).filter((n) => n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${block.children?.length ?? 2}, 1fr)`;\n }\n protected gridGap(block: MkBlock): string {\n const g = Math.max(0, Math.min(8, Number(block.data['gap']) || 4));\n return `var(--mk-space-${g})`;\n }\n protected justifyValue(block: MkBlock): string {\n const map: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n return map[String(block.data['justify'] ?? 'start')] ?? 'flex-start';\n }\n\n // --- toolbar menu ---------------------------------------------------------\n\n protected toggleMenu(index: number): void {\n this.menuOpen.update((i) => (i === index ? -1 : index));\n }\n\n /** Escape inside the options popup closes it and restores the toggle's focus. */\n protected closeMenu(trigger: HTMLElement, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.menuOpen.set(-1);\n trigger.focus();\n }\n\n protected transformsFor(type: string): string[] {\n return this.definition(type)?.transforms ?? [];\n }\n\n private fallbackParagraph(): MkBlock {\n return { id: mkBlockId('paragraph'), type: 'paragraph', data: { html: '' } };\n }\n}\n","@let readonly = ctx.readonly() || ctx.disabled();\n\n@for (block of blocks(); track block.id; let i = $index; let last = $last) {\n @if (!readonly) {\n <mk-block-inserter\n variant=\"slim\"\n [definitions]=\"ctx.definitions()\"\n [columnsOnly]=\"inColumn()\"\n (pick)=\"insertAt(i, $event)\"\n />\n }\n\n <div class=\"mk-block\" [attr.data-block-id]=\"block.id\" [class.mk-block--readonly]=\"readonly\">\n @if (!readonly) {\n <div class=\"mk-block__gutter\" aria-hidden=\"false\">\n <button\n type=\"button\"\n class=\"mk-block__move\"\n [disabled]=\"i === 0\"\n [attr.aria-label]=\"i18n.blockEditor.moveBlockUp\"\n (click)=\"move(i, -1)\"\n >\n ▲\n </button>\n <span class=\"mk-block__handle\" [title]=\"i18n.blockEditor.dragHandle\" aria-hidden=\"true\">⠿</span>\n <button\n type=\"button\"\n class=\"mk-block__move\"\n [disabled]=\"last\"\n [attr.aria-label]=\"i18n.blockEditor.moveBlockDown\"\n (click)=\"move(i, 1)\"\n >\n ▼\n </button>\n </div>\n\n <div class=\"mk-block__bar\">\n <span class=\"mk-block__type\">\n <span class=\"mk-block__type-icon\" aria-hidden=\"true\">{{ definition(block.type)?.icon }}</span>\n {{ definition(block.type)?.label ?? block.type }}\n </span>\n <div class=\"mk-block__actions\">\n <button\n #menuTrigger\n type=\"button\"\n class=\"mk-block__action\"\n [attr.aria-expanded]=\"menuOpen() === i\"\n [attr.aria-controls]=\"'mk-block-menu-' + block.id\"\n [attr.aria-label]=\"i18n.blockEditor.blockOptions\"\n (click)=\"toggleMenu(i)\"\n >\n ⋯\n </button>\n @if (menuOpen() === i) {\n <div\n class=\"mk-block__menu\"\n [id]=\"'mk-block-menu-' + block.id\"\n (keydown.escape)=\"closeMenu(menuTrigger, $event)\"\n >\n <button type=\"button\" (click)=\"duplicate(i)\">{{ i18n.blockEditor.duplicate }}</button>\n @for (t of transformsFor(block.type); track t) {\n <button type=\"button\" (click)=\"transform(i, t)\">\n {{ i18n.blockEditor.turnInto(definition(t)?.label ?? t) }}\n </button>\n }\n <button type=\"button\" class=\"mk-block__menu-danger\" (click)=\"remove(i)\">\n {{ i18n.blockEditor.remove }}\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"mk-block__body\">\n @switch (block.type) {\n @case ('paragraph') {\n <mk-paragraph-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n [placeholder]=\"ctx.placeholder()\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('heading') {\n <mk-heading-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('quote') {\n <mk-quote-block\n [block]=\"block\"\n [readonly]=\"readonly\"\n (blockChange)=\"update(i, $event)\"\n (splitAt)=\"onSplit(i, $event)\"\n (removeEmpty)=\"onMergeBack(i)\"\n (arrowOut)=\"onArrowOut(i, $event)\"\n />\n }\n @case ('list') {\n <mk-list-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('code') {\n <mk-code-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('image') {\n <mk-image-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('embed') {\n <mk-embed-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('button') {\n <mk-button-block [block]=\"block\" [readonly]=\"readonly\" (blockChange)=\"update(i, $event)\" />\n }\n @case ('divider') {\n <hr class=\"mk-block__divider\" data-mk-focus tabindex=\"-1\" />\n }\n @case ('columns') {\n @if (!readonly) {\n <div class=\"mk-columns-settings\" role=\"group\" [attr.aria-label]=\"i18n.blockEditor.columnSettings\">\n <label>\n <span>{{ i18n.blockEditor.columns }}</span>\n <span class=\"mk-columns-settings__counts\">\n @for (n of [2, 3, 4]; track n) {\n <button\n type=\"button\"\n [class.mk-columns-settings__count--active]=\"(block.data['count'] || 2) === n\"\n [attr.aria-pressed]=\"(block.data['count'] || 2) === n\"\n (click)=\"setColumnCount(i, n)\"\n >\n {{ n }}\n </button>\n }\n </span>\n </label>\n <label>\n <span>{{ i18n.blockEditor.ratio }}</span>\n <select [value]=\"block.data['ratio']\" (change)=\"onRatioChange(i, $event)\">\n @for (preset of ratioPresets[block.data['count'] || 2]; track preset.value) {\n <option [value]=\"preset.value\">{{ preset.label || i18n.blockEditor.ratioEqual }}</option>\n }\n </select>\n </label>\n <label>\n <span>{{ i18n.blockEditor.gap }}</span>\n <input\n type=\"range\"\n min=\"0\"\n max=\"8\"\n [value]=\"block.data['gap'] ?? 4\"\n (input)=\"onGapChange(i, $event)\"\n />\n </label>\n <label>\n <span>{{ i18n.blockEditor.align }}</span>\n <select [value]=\"block.data['align'] ?? 'stretch'\" (change)=\"onAlignChange(i, $event)\">\n <option value=\"stretch\">{{ i18n.blockEditor.alignStretch }}</option>\n <option value=\"start\">{{ i18n.blockEditor.alignTop }}</option>\n <option value=\"center\">{{ i18n.blockEditor.alignMiddle }}</option>\n <option value=\"end\">{{ i18n.blockEditor.alignBottom }}</option>\n </select>\n </label>\n <label>\n <span>{{ i18n.blockEditor.justify }}</span>\n <select [value]=\"block.data['justify'] ?? 'start'\" (change)=\"onJustifyChange(i, $event)\">\n <option value=\"start\">{{ i18n.blockEditor.justifyStart }}</option>\n <option value=\"center\">{{ i18n.blockEditor.justifyCenter }}</option>\n <option value=\"end\">{{ i18n.blockEditor.justifyEnd }}</option>\n <option value=\"between\">{{ i18n.blockEditor.justifyBetween }}</option>\n </select>\n </label>\n </div>\n }\n <div\n class=\"mk-columns\"\n [style.grid-template-columns]=\"gridColumns(block)\"\n [style.gap]=\"gridGap(block)\"\n [style.align-items]=\"block.data['align'] ?? 'stretch'\"\n [style.justify-content]=\"justifyValue(block)\"\n >\n @for (col of block.children ?? []; track col.id; let c = $index) {\n <div class=\"mk-column\">\n <mk-block-list\n [blocks]=\"col.children ?? []\"\n [depth]=\"depth() + 1\"\n [inColumn]=\"true\"\n (blocksChange)=\"onColumnChange(i, c, $event)\"\n />\n </div>\n }\n </div>\n }\n @default {\n <p class=\"mk-block__unknown\">{{ i18n.blockEditor.unknownBlock(block.type) }}</p>\n }\n }\n </div>\n </div>\n}\n\n@if (!readonly) {\n <mk-block-inserter\n class=\"mk-block-list__add\"\n [definitions]=\"ctx.definitions()\"\n [columnsOnly]=\"inColumn()\"\n [label]=\"blocks().length ? i18n.blockEditor.addBlock : i18n.blockEditor.addFirstBlock\"\n (pick)=\"insertAt(blocks().length, $event)\"\n />\n}\n","/**\n * HTML → {@link MkBlockDocument} parser — the inverse of {@link mkBlocksToHtml}.\n *\n * Lets the block editor back a **string-typed richtext field** (e.g. a CMS\n * `richtext` column that stores an HTML string): seed the editor from stored\n * HTML, and serialise back to HTML on change. Best-effort and forgiving — any\n * HTML parses, with unrecognised block-level wrappers recursed into and loose\n * inline runs grouped into paragraphs. Round-trips the blocks `mkBlocksToHtml`\n * emits (paragraph, heading, list, quote, code, image, divider, button, embed,\n * columns).\n *\n * Uses the DOM (`DOMParser`) — available in browsers and jsdom. In a pure Node\n * context without a DOM it falls back to a single sanitised paragraph.\n */\nimport {\n MK_BLOCK_DOCUMENT_VERSION,\n type MkBlock,\n type MkBlockDocument,\n mkBlockId,\n mkEmptyDocument,\n} from './block-model';\nimport { mkEscapeHtml, sanitizeInlineHtml } from './block-serializer';\n\nconst HEADING_LEVEL: Record<string, number> = {\n h1: 1, h2: 2, h3: 3, h4: 4, h5: 4, h6: 4,\n};\n\n/** Block-level tags handled as their own block (others recurse or group). */\nconst BLOCK_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'blockquote', 'pre',\n 'figure', 'img', 'hr', 'div', 'section', 'article', 'table',\n]);\n\nfunction block(type: string, data: Record<string, unknown>, children?: MkBlock[]): MkBlock {\n const b: MkBlock = { id: mkBlockId(type), type, data };\n if (children) b.children = children;\n return b;\n}\n\nfunction parseRoot(html: string): ParentNode | null {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser().parseFromString(html, 'text/html').body;\n }\n if (typeof document !== 'undefined') {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n }\n return null;\n}\n\nconst TEXT_NODE = 3;\nconst ELEMENT_NODE = 1;\n\nfunction isBlockElement(node: Node): boolean {\n return (\n node.nodeType === ELEMENT_NODE &&\n BLOCK_TAGS.has((node as Element).tagName.toLowerCase())\n );\n}\n\n/** HTML for one node in an inline run (encoded text, element markup). */\nfunction nodeHtml(node: Node): string {\n if (node.nodeType === TEXT_NODE) return mkEscapeHtml(node.textContent ?? '');\n if (node.nodeType === ELEMENT_NODE) return (node as Element).outerHTML;\n return '';\n}\n\nfunction style(el: Element, prop: string): string {\n return (el as HTMLElement).style?.getPropertyValue(prop)?.trim() ?? '';\n}\n\n/** Walk a parent's children into blocks, grouping loose inline runs. */\nfunction collectBlocks(root: ParentNode, out: MkBlock[]): void {\n let inline: Node[] = [];\n const flush = () => {\n if (!inline.length) return;\n const html = inline.map(nodeHtml).join('').trim();\n if (html) out.push(block('paragraph', { html: sanitizeInlineHtml(html) }));\n inline = [];\n };\n\n for (const node of Array.from(root.childNodes)) {\n if (isBlockElement(node)) {\n flush();\n appendElement(node as Element, out);\n } else if (node.nodeType === TEXT_NODE && !node.textContent?.trim()) {\n // ignore whitespace between blocks\n } else {\n inline.push(node);\n }\n }\n flush();\n}\n\n/** Map a block-level element to one or more blocks (appended to `out`). */\nfunction appendElement(el: Element, out: MkBlock[]): void {\n const tag = el.tagName.toLowerCase();\n\n if (tag === 'p') {\n out.push(block('paragraph', { html: sanitizeInlineHtml(el.innerHTML) }));\n return;\n }\n if (tag in HEADING_LEVEL) {\n out.push(block('heading', {\n level: HEADING_LEVEL[tag],\n html: sanitizeInlineHtml(el.innerHTML),\n }));\n return;\n }\n if (tag === 'ul' || tag === 'ol') {\n const items = Array.from(el.querySelectorAll(':scope > li')).map((li) =>\n sanitizeInlineHtml(li.innerHTML),\n );\n out.push(block('list', { ordered: tag === 'ol', items: items.length ? items : [''] }));\n return;\n }\n if (tag === 'blockquote') {\n const cite = el.querySelector('cite');\n const p = el.querySelector('p');\n const body = p ? p.innerHTML : el.innerHTML;\n out.push(block('quote', {\n html: sanitizeInlineHtml(body),\n citation: cite?.textContent?.trim() ?? '',\n }));\n return;\n }\n if (tag === 'pre') {\n const codeEl = el.querySelector('code') ?? el;\n const lang = (codeEl.className.match(/language-([\\w-]+)/) ?? [])[1] ?? '';\n out.push(block('code', { code: codeEl.textContent ?? '', language: lang }));\n return;\n }\n if (tag === 'figure' || tag === 'img') {\n const img = tag === 'img' ? (el as HTMLImageElement) : el.querySelector('img');\n if (img) {\n const width = parseInt(style(img, 'max-width'), 10);\n const align =\n style(el, 'text-align') === 'left'\n ? 'left'\n : style(el, 'text-align') === 'right'\n ? 'right'\n : 'center';\n out.push(block('image', {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n caption: el.querySelector('figcaption')?.textContent?.trim() ?? '',\n align,\n width: Number.isFinite(width) && width > 0 ? width : 100,\n }));\n }\n return;\n }\n if (tag === 'hr') {\n out.push(block('divider', {}));\n return;\n }\n\n // <div> / generic containers: recognise the wrappers mkBlocksToHtml emits,\n // otherwise recurse into the children.\n if (el.classList.contains('mk-columns')) {\n const columns = Array.from(el.querySelectorAll(':scope > .mk-column')).map(\n (colEl) => {\n const children: MkBlock[] = [];\n collectBlocks(colEl, children);\n return block('column', {}, children);\n },\n );\n out.push(block('columns', { count: columns.length || 2 }, columns));\n return;\n }\n const cta = el.querySelector(':scope > a.mk-cta, a.mk-cta');\n if (cta) {\n const tone = (cta.className.match(/mk-cta--([\\w-]+)/) ?? [])[1] ?? 'primary';\n out.push(block('button', {\n label: cta.textContent?.trim() ?? 'Button',\n href: cta.getAttribute('href') ?? '',\n align: style(el, 'text-align') || 'left',\n tone,\n }));\n return;\n }\n if (el.classList.contains('mk-embed')) {\n const iframe = el.querySelector('iframe');\n out.push(block('embed', {\n url: '',\n embedUrl: iframe?.getAttribute('src') ?? '',\n aspectRatio: 16 / 9,\n }));\n return;\n }\n\n // Unknown container — recurse into its children.\n collectBlocks(el, out);\n}\n\n/**\n * Parse an HTML string into a {@link MkBlockDocument}. Empty / whitespace input\n * yields an empty document.\n */\nexport function mkHtmlToBlocks(html: string): MkBlockDocument {\n const source = String(html ?? '');\n if (!source.trim()) return mkEmptyDocument();\n\n const root = parseRoot(source);\n if (!root) {\n // No DOM (server) — degrade to a single sanitised paragraph.\n return {\n version: MK_BLOCK_DOCUMENT_VERSION,\n blocks: [block('paragraph', { html: sanitizeInlineHtml(source) })],\n };\n }\n\n const blocks: MkBlock[] = [];\n collectBlocks(root, blocks);\n return { version: MK_BLOCK_DOCUMENT_VERSION, blocks };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MK_I18N, type MkBlockEditorStrings } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core/signal-forms';\nimport {\n MK_BLOCK_DOCUMENT_VERSION,\n type MkBlock,\n type MkBlockDocument,\n mkEmptyDocument,\n} from './block-model';\nimport {\n MK_BLOCK_DEFINITIONS,\n MK_BLOCK_EMBED_PROVIDERS,\n MK_BLOCK_UPLOAD_HANDLER,\n MK_DEFAULT_BLOCKS,\n MK_DEFAULT_EMBED_PROVIDERS,\n type MkBlockDefinition,\n type MkBlockUploadHandler,\n type MkEmbedProvider,\n mkMergeBlockDefinitions,\n} from './block-registry';\nimport { MkBlockEditorContext } from './block-context';\nimport { MkBlockList } from './block-list';\nimport { mkBlocksToHtml } from './block-serializer';\nimport { mkHtmlToBlocks } from './block-parser';\n\n/** How the form/CVA value is exchanged: a document object or an HTML string. */\nexport type MkBlockValueFormat = 'document' | 'html';\n\n/**\n * Block editor — a configurable, Gutenberg-style block content editor. Renders\n * an ordered document of blocks (paragraph, heading, image, columns, embed,\n * list, quote, button, divider, code) with a filterable inserter, per-block\n * chrome (move/duplicate/transform/delete) and inline rich-text formatting.\n *\n * The palette is fully customisable: pass definitions via the `blocks` input or\n * the {@link MK_BLOCK_DEFINITIONS} token (mirrors `registerBlockType`). Both are\n * merged over {@link MK_DEFAULT_BLOCKS}.\n *\n * Implements `ControlValueAccessor` AND a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`.\n *\n * ```html\n * <mk-block-editor [(value)]=\"doc\" [uploadHandler]=\"upload\" />\n * ```\n */\n@Component({\n selector: 'mk-block-editor',\n imports: [MkBlockList],\n templateUrl: './block-editor.html',\n styleUrl: './block-editor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-block-editor',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n '[class.mk-block-editor--readonly]': 'readonly()',\n '[class.mk-block-editor--invalid]': 'isInvalid()',\n '[attr.aria-invalid]': 'isInvalid() || null',\n '[class.mk-block-editor--disabled]': 'disabled() || cvaDisabled()',\n '(focusout)': 'onFocusOut($event)',\n },\n providers: [\n MkBlockEditorContext,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkBlockEditor),\n multi: true,\n },\n ],\n})\nexport class MkBlockEditor implements ControlValueAccessor {\n protected readonly i18n = inject(MK_I18N);\n private readonly ctx = inject(MkBlockEditorContext);\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly tokenDefinitions = inject(MK_BLOCK_DEFINITIONS, { optional: true });\n private readonly tokenUpload = inject(MK_BLOCK_UPLOAD_HANDLER, { optional: true });\n private readonly tokenEmbeds = inject(MK_BLOCK_EMBED_PROVIDERS, { optional: true });\n\n /** Two-way document value (always an `MkBlockDocument`, regardless of format). */\n readonly value = model<MkBlockDocument>(mkEmptyDocument());\n /**\n * Form/CVA exchange format. `document` (default) reads/writes an\n * `MkBlockDocument`; `html` reads/writes an **HTML string** — so the editor\n * can back a string-typed richtext field (`[(ngModel)]=\"htmlString\"`). The\n * two-way `value` model stays an `MkBlockDocument` either way.\n */\n readonly valueFormat = input<MkBlockValueFormat>('document');\n /** Custom / extended block definitions (merged over the defaults + token). */\n readonly blocks = input<MkBlockDefinition[] | null>(null);\n /** Placeholder for empty text blocks. */\n readonly placeholder = input<string>(this.i18n.blockEditor.emptyBlockPlaceholder);\n /** Accessible label for the editor region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editorLabel);\n /** Read-only: renders content without editing chrome. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Disabled (form-level). */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Async upload handler (overrides the {@link MK_BLOCK_UPLOAD_HANDLER} token). */\n readonly uploadHandler = input<MkBlockUploadHandler | null>(null);\n /** Extra embed providers (merged with defaults + token). */\n readonly embedProviders = input<MkEmbedProvider[] | null>(null);\n\n /** Fires on any document change (in addition to the `value` model). */\n readonly change = output<MkBlockDocument>();\n /** Fires the serialised HTML on any change — convenient in `html` mode. */\n readonly htmlChange = output<string>();\n\n protected readonly cvaDisabled = signal(false);\n\n /** Invalid visual, forced by the `invalid` input. */\n /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */\n private readonly fieldTouched = mkInjectFieldTouched();\n protected readonly isInvalid = computed(() => this.invalid() && this.fieldTouched());\n\n private onChange: (value: MkBlockDocument | string) => void = () => {};\n private onTouched: () => void = () => {};\n\n /** Effective, merged block definitions (defaults localised via MK_I18N). */\n private readonly definitions = computed<MkBlockDefinition[]>(() =>\n mkMergeBlockDefinitions(\n localizeDefaultBlocks(this.i18n.blockEditor),\n ...(this.tokenDefinitions ?? []),\n this.blocks(),\n ),\n );\n\n protected readonly topBlocks = computed<MkBlock[]>(() => this.value()?.blocks ?? []);\n\n constructor() {\n this.ctx.hostRef = this.hostRef;\n\n // Connect the shared context straight to the input-derived signals (pull\n // based; no per-input mirror effects). Must happen before any child\n // renders, which the constructor guarantees: the context is provided by\n // this component, so children inject it only after we are constructed.\n this.ctx.definitions = this.definitions;\n this.ctx.readonly = this.readonly;\n this.ctx.disabled = computed(() => this.disabled() || this.cvaDisabled());\n this.ctx.placeholder = this.placeholder;\n this.ctx.uploadHandler = computed(\n () => this.uploadHandler() ?? this.tokenUpload ?? null,\n );\n this.ctx.embedProviders = computed(() => [\n ...MK_DEFAULT_EMBED_PROVIDERS,\n ...(this.tokenEmbeds?.flat() ?? []),\n ...(this.embedProviders() ?? []),\n ]);\n }\n\n protected onBlocksChange(blocks: MkBlock[]): void {\n const next: MkBlockDocument = {\n version: this.value()?.version ?? MK_BLOCK_DOCUMENT_VERSION,\n blocks,\n };\n this.value.set(next);\n // Serialising the whole document on every keystroke is expensive — do it\n // only when something actually consumes the HTML: `html` value format, or\n // a subscriber on `htmlChange`.\n const wantsHtml = this.valueFormat() === 'html' || hasObservers(this.htmlChange);\n const html = wantsHtml ? mkBlocksToHtml(next) : null;\n this.onChange(this.valueFormat() === 'html' ? html! : next);\n this.onTouched();\n this.change.emit(next);\n if (html !== null) this.htmlChange.emit(html);\n }\n\n /**\n * Marks the control touched once focus leaves it entirely, so a form that\n * gates its errors on `touched` behaves the same here as on a native input.\n */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.hostRef.nativeElement.contains(next)) return;\n this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: MkBlockDocument | string | null): void {\n if (this.valueFormat() === 'html') {\n this.value.set(\n typeof value === 'string'\n ? mkHtmlToBlocks(value)\n : ((value as MkBlockDocument | null) ?? mkEmptyDocument()),\n );\n } else {\n this.value.set((value as MkBlockDocument | null) ?? mkEmptyDocument());\n }\n }\n registerOnChange(fn: (value: MkBlockDocument | string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\n/**\n * Whether an `output()` emitter currently has any subscribers (template\n * `(htmlChange)` bindings and programmatic `.subscribe()` both register one).\n * Reads `OutputEmitterRef`'s internal `listeners` array — not public API, so\n * if the field ever disappears in a future Angular this reports `true` and we\n * fall back to always serialising (the documented pre-optimisation behaviour).\n */\nfunction hasObservers(ref: unknown): boolean {\n const listeners = (ref as { listeners?: unknown[] | null }).listeners;\n if (listeners === undefined) return true;\n return (listeners?.length ?? 0) > 0;\n}\n\n/**\n * Returns {@link MK_DEFAULT_BLOCKS} with the built-in labels, descriptions and\n * group headings resolved from the active i18n strings (custom definitions\n * merged on top keep their own text). The Button block's `create()` is wrapped\n * so a fresh block starts with the localised default label.\n */\nfunction localizeDefaultBlocks(s: MkBlockEditorStrings): MkBlockDefinition[] {\n const text: Record<string, { label: string; description: string }> = {\n paragraph: { label: s.blockParagraph, description: s.blockParagraphDesc },\n heading: { label: s.blockHeading, description: s.blockHeadingDesc },\n list: { label: s.blockList, description: s.blockListDesc },\n quote: { label: s.blockQuote, description: s.blockQuoteDesc },\n code: { label: s.blockCode, description: s.blockCodeDesc },\n image: { label: s.blockImage, description: s.blockImageDesc },\n embed: { label: s.blockEmbed, description: s.blockEmbedDesc },\n button: { label: s.blockButton, description: s.blockButtonDesc },\n divider: { label: s.blockDivider, description: s.blockDividerDesc },\n columns: { label: s.blockColumns, description: s.blockColumnsDesc },\n };\n const groups: Record<string, string> = {\n Text: s.groupText,\n Media: s.groupMedia,\n Layout: s.groupLayout,\n };\n return MK_DEFAULT_BLOCKS.map((def) => {\n const t = text[def.type];\n const localized: MkBlockDefinition = {\n ...def,\n label: t?.label ?? def.label,\n description: t?.description ?? def.description,\n group: groups[def.group ?? ''] ?? def.group,\n };\n if (def.type === 'button') {\n localized.create = () => {\n const b = def.create();\n return { ...b, data: { ...b.data, label: s.buttonDefaultLabel } };\n };\n }\n return localized;\n });\n}\n","<mk-block-list [blocks]=\"topBlocks()\" [depth]=\"0\" (blocksChange)=\"onBlocksChange($event)\" />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkBlock, MkBlockDocument } from './block-model';\nimport { mkIsSafeUrl, sanitizeInlineHtml } from './block-serializer';\n\n/**\n * Block renderer — read-only, themed display of a {@link MkBlockDocument} for\n * published content pages and blog posts. Reuses the same layout CSS as the\n * editor so authored columns look identical when published.\n *\n * SECURITY MODEL: rich-text HTML is passed through {@link sanitizeInlineHtml}\n * and then bound with `[innerHTML]`, so Angular's `DomSanitizer` sanitises it\n * again at render time (never bypassed for author HTML). The ONLY bypass is for\n * a stored embed's `embedUrl`, which came from an allow-listed provider.\n */\n@Component({\n selector: 'mk-block-renderer',\n templateUrl: './block-renderer.html',\n styleUrl: './block-renderer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-block-renderer' },\n})\nexport class MkBlockRenderer {\n protected readonly i18n = inject(MK_I18N);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly safeSrcCache = new Map<string, SafeResourceUrl>();\n\n /** The document to render. */\n readonly value = input<MkBlockDocument | null>(null);\n /** Internal: a block subtree (used when recursing into columns). */\n readonly blocks = input<MkBlock[] | null>(null);\n\n protected readonly items = computed<MkBlock[]>(\n () => this.blocks() ?? this.value()?.blocks ?? [],\n );\n\n /** Sanitised rich-text HTML for `[innerHTML]` binding. */\n protected safeHtml(html: unknown): string {\n return sanitizeInlineHtml(String(html ?? ''));\n }\n\n protected listItems(block: MkBlock): string[] {\n const items = block.data['items'];\n return Array.isArray(items) ? items : [];\n }\n\n protected headingLevel(block: MkBlock): number {\n const l = block.data['level'];\n return [1, 2, 3, 4].includes(l) ? l : 2;\n }\n\n protected isImageSafe(block: MkBlock): boolean {\n const src = String(block.data['src'] ?? '');\n return !!src && mkIsSafeUrl(src);\n }\n\n protected buttonHref(block: MkBlock): string {\n const href = String(block.data['href'] ?? '');\n return mkIsSafeUrl(href) && href ? href : '#';\n }\n\n protected paddingTop(block: MkBlock): string {\n const ratio = Number(block.data['aspectRatio']) || 16 / 9;\n return `${100 / ratio}%`;\n }\n\n /** Trusts only a provider-transformed https embed URL — see class doc. */\n protected embedSrc(block: MkBlock): SafeResourceUrl | null {\n const src = String(block.data['embedUrl'] ?? '');\n if (!src || !/^https:\\/\\//i.test(src) || !mkIsSafeUrl(src)) return null;\n let trusted = this.safeSrcCache.get(src);\n if (!trusted) {\n trusted = this.sanitizer.bypassSecurityTrustResourceUrl(src);\n this.safeSrcCache.set(src, trusted);\n }\n return trusted;\n }\n\n protected fallbackUrl(block: MkBlock): string | null {\n const url = String(block.data['url'] ?? '');\n return mkIsSafeUrl(url) && url ? url : null;\n }\n\n protected gridColumns(block: MkBlock): string {\n const ratio = String(block.data['ratio'] ?? '');\n const parts = ratio.split('-').map((n) => parseFloat(n)).filter((n) => n > 0);\n if (parts.length >= 2) return parts.map((n) => `${n}fr`).join(' ');\n return `repeat(${block.children?.length ?? 2}, 1fr)`;\n }\n protected gridGap(block: MkBlock): string {\n const g = Math.max(0, Math.min(8, Number(block.data['gap']) || 4));\n return `var(--mk-space-${g})`;\n }\n protected justifyValue(block: MkBlock): string {\n const map: Record<string, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between',\n };\n return map[String(block.data['justify'] ?? 'start')] ?? 'flex-start';\n }\n}\n","@for (block of items(); track block.id) {\n @switch (block.type) {\n @case ('paragraph') {\n <p class=\"mk-r-paragraph\" [innerHTML]=\"safeHtml(block.data['html'])\"></p>\n }\n @case ('heading') {\n @switch (headingLevel(block)) {\n @case (1) { <h1 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h1> }\n @case (2) { <h2 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h2> }\n @case (3) { <h3 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h3> }\n @case (4) { <h4 class=\"mk-r-heading\" [innerHTML]=\"safeHtml(block.data['html'])\"></h4> }\n }\n }\n @case ('list') {\n @if (block.data['ordered']) {\n <ol class=\"mk-r-list\">\n @for (item of listItems(block); track $index) {\n <li [innerHTML]=\"safeHtml(item)\"></li>\n }\n </ol>\n } @else {\n <ul class=\"mk-r-list\">\n @for (item of listItems(block); track $index) {\n <li [innerHTML]=\"safeHtml(item)\"></li>\n }\n </ul>\n }\n }\n @case ('quote') {\n <blockquote class=\"mk-r-quote\">\n <p [innerHTML]=\"safeHtml(block.data['html'])\"></p>\n @if (block.data['citation']) {\n <cite class=\"mk-r-cite\">{{ block.data['citation'] }}</cite>\n }\n </blockquote>\n }\n @case ('code') {\n <pre class=\"mk-r-code\"><code>{{ block.data['code'] }}</code></pre>\n }\n @case ('image') {\n @if (isImageSafe(block)) {\n <figure\n class=\"mk-r-figure\"\n [class.mk-r-figure--left]=\"block.data['align'] === 'left'\"\n [class.mk-r-figure--right]=\"block.data['align'] === 'right'\"\n >\n <img\n [src]=\"block.data['src']\"\n [alt]=\"block.data['alt'] ?? ''\"\n [style.width.%]=\"block.data['width'] || 100\"\n loading=\"lazy\"\n />\n @if (block.data['caption']) {\n <figcaption>{{ block.data['caption'] }}</figcaption>\n }\n </figure>\n }\n }\n @case ('button') {\n <div\n class=\"mk-r-cta-wrap\"\n [class.mk-r-cta-wrap--center]=\"block.data['align'] === 'center'\"\n [class.mk-r-cta-wrap--right]=\"block.data['align'] === 'right'\"\n >\n <a\n class=\"mk-cta\"\n [class.mk-cta--soft]=\"block.data['variant'] === 'soft'\"\n [class.mk-cta--outline]=\"block.data['variant'] === 'outline'\"\n [attr.data-tone]=\"block.data['tone'] ?? 'primary'\"\n [href]=\"buttonHref(block)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {{ block.data['label'] || i18n.blockEditor.blockButton }}\n </a>\n </div>\n }\n @case ('divider') {\n <hr class=\"mk-r-divider\" />\n }\n @case ('embed') {\n @if (embedSrc(block); as src) {\n <div class=\"mk-r-embed\" [style.padding-top]=\"paddingTop(block)\">\n <iframe\n [src]=\"src\"\n [title]=\"i18n.blockEditor.embeddedContent\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n sandbox=\"allow-scripts allow-same-origin allow-presentation allow-popups\"\n allowfullscreen\n ></iframe>\n </div>\n } @else if (fallbackUrl(block); as url) {\n <p class=\"mk-r-embed-fallback\">\n <a [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">{{ url }}</a>\n </p>\n }\n }\n @case ('columns') {\n <div\n class=\"mk-columns\"\n [style.grid-template-columns]=\"gridColumns(block)\"\n [style.gap]=\"gridGap(block)\"\n [style.align-items]=\"block.data['align'] ?? 'stretch'\"\n [style.justify-content]=\"justifyValue(block)\"\n >\n @for (col of block.children ?? []; track col.id) {\n <div class=\"mk-column\">\n <mk-block-renderer [blocks]=\"col.children ?? []\" />\n </div>\n }\n </div>\n }\n }\n}\n","/**\n * BLOCK EDITOR group barrel for @mk-kit/ui.\n *\n * Public surface for the Gutenberg-style block content editor and its\n * read-only renderer. Built-in block edit components stay internal — consumers\n * interact through the editor, the registry and the serializers.\n */\n\n// Editor + renderer components\nexport {\n MkBlockEditor,\n type MkBlockValueFormat,\n} from './block-editor';\nexport { MkBlockRenderer } from './block-renderer';\n\n// Document model\nexport {\n type MkBlock,\n type MkBlockDocument,\n MK_BLOCK_DOCUMENT_VERSION,\n mkEmptyDocument,\n mkBlockId,\n mkCloneBlock,\n} from './block-model';\n\n// Registry / config (extensibility layer)\nexport {\n type MkBlockDefinition,\n type MkBlockUploadHandler,\n type MkEmbedProvider,\n MK_DEFAULT_BLOCKS,\n MK_DEFAULT_EMBED_PROVIDERS,\n MK_BLOCK_DEFINITIONS,\n MK_BLOCK_UPLOAD_HANDLER,\n MK_BLOCK_EMBED_PROVIDERS,\n mkMergeBlockDefinitions,\n} from './block-registry';\n\n// Serializers + HTML parser (round-trip: MkBlockDocument ⇄ HTML)\nexport {\n mkBlocksToHtml,\n mkBlocksToText,\n mkEscapeHtml,\n mkEscapeAttr,\n mkIsSafeUrl,\n sanitizeInlineHtml,\n} from './block-serializer';\nexport { mkHtmlToBlocks } from './block-parser';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["block"],"mappings":";;;;;;;;;;AAAA;;;;;;AAMG;AA8BH;AACO,MAAM,yBAAyB,GAAG;AAEzC;SACgB,eAAe,GAAA;IAC7B,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,EAAE;AAC3D;AAEA,IAAI,YAAY,GAAG,CAAC;AAEpB;;;;AAIG;AACG,SAAU,SAAS,CAAC,MAAM,GAAG,KAAK,EAAA;AACtC,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,YAAY,CAAA,CAAA,EAAI,IAAI,EAAE;AAC9C;AAEA;AACM,SAAU,YAAY,CAAC,KAAc,EAAA;IACzC,OAAO;AACL,QAAA,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;KAC5C;AACH;AAEA;AACA,SAAS,mBAAmB,CAAI,KAAQ,EAAA;AACtC,IAAA,IAAI;AACF,QAAA,OAAO,eAAe,CAAC,KAAK,CAAC;IAC/B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAClD;AACF;;AC1CA;AACA,SAASA,OAAK,CAAC,IAAY,EAAE,IAAA,GAA4B,EAAE,EAAE,QAAoB,EAAA;IAC/E,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;AAC/E;AAEA;;;;;;;AAOG;AACI,MAAM,iBAAiB,GAAwB;AACpD,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,mCAAmC;AAChD,QAAA,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;AAC/B,QAAA,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;AACxC,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/C,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACrC,UAAU,EAAE,CAAC,WAAW,CAAC;AACzB,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACvD,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC5C,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7D,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,sCAAsC;AACnD,QAAA,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;QACpC,UAAU,EAAE,CAAC,WAAW,CAAC;AACzB,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACzD,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC;AACzC,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACxD,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;AAC/C,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC7F,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;AACxD,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AAC1C,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;AACnC,QAAA,MAAM,EAAE,MAAMA,OAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACjH,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,WAAW,EAAE,yBAAyB;AACtC,QAAA,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;QACrC,MAAM,EAAE,MAAMA,OAAK,CAAC,SAAS,EAAE,EAAE,CAAC;AACnC,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;AAC7C,QAAA,gBAAgB,EAAE,KAAK;QACvB,MAAM,EAAE,MACNA,OAAK,CACH,SAAS,EACT,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EACxE,CAACA,OAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAEA,OAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CACnD;AACJ,KAAA;;AAGH;;;;;;;;;;AAUG;MACU,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB;AAUxB;MACa,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB;AAsB3B;AACO,MAAM,0BAA0B,GAAsB;AAC3D,IAAA;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,0EAA0E;QAChF,WAAW,EAAE,EAAE,GAAG,CAAC;AACnB,QAAA,UAAU,CAAC,GAAW,EAAA;YACpB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CACjB,0EAA0E,CAC3E;AACD,YAAA,OAAO,CAAC,GAAG,0CAA0C,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,GAAG,IAAI;QACpE,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,EAAE,GAAG,CAAC;AACnB,QAAA,UAAU,CAAC,GAAW,EAAA;YACpB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC;AACrD,YAAA,OAAO,CAAC,GAAG,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,GAAG,IAAI;QAC5D,CAAC;AACF,KAAA;;AAGH;MACa,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B;AAG5B;;;AAGG;SACa,uBAAuB,CACrC,QAA6B,EAC7B,GAAG,OAAmD,EAAA;AAEtD,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B;IACnD,KAAK,MAAM,GAAG,IAAI,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AACrD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;IACrD;AACA,IAAA,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7B;;ACxOA;;;;;;;;;;;AAWG;MAEU,oBAAoB,CAAA;AA8BF,IAAA,SAAA;AA7BZ,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGvC,WAAW,GAAgC,MAAM,CAAsB,EAAE;oFAAC;;IAE1E,QAAQ,GAAoB,MAAM,CAAC,KAAK;iFAAC;;IAEzC,QAAQ,GAAoB,MAAM,CAAC,KAAK;iFAAC;;IAEzC,WAAW,GAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB;oFAAC;;IAEjF,aAAa,GAAwC,MAAM,CAA8B,IAAI;sFAAC;;IAE9F,cAAc,GAA8B,MAAM,CAAoB,EAAE;uFAAC;;IAGzE,OAAO,GAAmC,IAAI;AAE9C;;;;AAIG;AACc,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B;AAChD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5D,QAAA,OAAO,GAAG;IACZ,CAAC;sFAAC;AAEF,IAAA,WAAA,CAA6B,SAA0B,EAAA;QAA1B,IAAA,CAAA,SAAS,GAAT,SAAS;IAAoB;;AAG1D,IAAA,aAAa,CAAC,IAAY,EAAA;QACxB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IACvC;;AAGA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI;IAChD;;AAGA,IAAA,QAAQ,CAAC,OAAe,EAAA;QACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC5C;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,EAAU,EAAE,QAAA,GAA4B,KAAK,EAAA;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa;AACxC,QAAA,IAAI,CAAC,IAAI,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE;QAC5C,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAc,CAAA,gBAAA,EAAmB,SAAS,CAAC,EAAE,CAAC,CAAA,EAAA,CAAI,CAAC;YACrF,MAAM,QAAQ,GAAG,OAAO,EAAE,aAAa,CAAc,oBAAoB,CAAC;YAC1E,MAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,EAAE,aAAa,CAAc,iBAAiB,CAAC;AACjF,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,MAAM,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,QAAQ;AAAE,gBAAA,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC9C,QAAA,CAAC,CAAC;IACJ;uGA9DW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAApB,oBAAoB,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;AAkED;AACA,SAAS,SAAS,CAAC,KAAa,EAAA;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;AACxC;AAEA;AACM,SAAU,UAAU,CAAC,EAAe,EAAE,QAAyB,EAAA;AACnE,IAAA,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW;AACxC,IAAA,MAAM,SAAS,GAAG,GAAG,EAAE,YAAY,EAAE;AACrC,IAAA,IAAI,CAAC,SAAS;QAAE;IAChB,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE;AAC5C,IAAA,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;AAC5B,IAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC;IACpC,SAAS,CAAC,eAAe,EAAE;AAC3B,IAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC3B;;ACrFA;;;AAGG;MAkBU,gBAAgB,CAAA;AACR,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB;oFAAC;IAEhE,WAAW,GAAG,MAAM,EAAW;IAC/B,OAAO,GAAG,MAAM,EAAmB;IACnC,WAAW,GAAG,MAAM,EAAQ;IAC5B,QAAQ,GAAG,MAAM,EAAiB;AAEjC,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5D;uGAfW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAbjB;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAbS,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAef,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAjB5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,OAAO,EAAE,CAAC,gBAAgB,CAAC;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;;;AAWT,EAAA,CAAA;AACF,iBAAA;;;ACnBD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU;AAEpC;;;AAGG;MA0FU,cAAc,CAAA;AACN,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAExD,WAAW,GAAG,MAAM,EAAW;IAC/B,OAAO,GAAG,MAAM,EAAmB;IACnC,WAAW,GAAG,MAAM,EAAQ;IAC5B,QAAQ,GAAG,MAAM,EAAiB;IAExB,MAAM,GAAG,MAAM;AACf,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC,CAAC;8EAAC;AAEQ,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;IAC7D;AAEU,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5D;uGAzBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArFf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,koCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA/BS,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuFf,cAAc,EAAA,UAAA,EAAA,CAAA;kBAzF1B,SAAS;+BACE,kBAAkB,EAAA,OAAA,EACnB,CAAC,gBAAgB,CAAC,mBACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,koCAAA,CAAA,EAAA;;;ACxCH;MA6Da,YAAY,CAAA;AACJ,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAExD,WAAW,GAAG,MAAM,EAAW;IAC/B,OAAO,GAAG,MAAM,EAAmB;IACnC,WAAW,GAAG,MAAM,EAAQ;IAC5B,QAAQ,GAAG,MAAM,EAAiB;AAEjC,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5D;AAEU,IAAA,MAAM,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;QACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IAChE;uGApBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxDb;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA1BS,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA0Df,YAAY,EAAA,UAAA,EAAA,CAAA;kBA5DxB,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,gBAAgB,CAAC,mBACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA;;;AC5BH;MA+Ga,WAAW,CAAA;AACH,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,MAAM,EAAW;AAErB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gFAAC;AACxD,IAAA,KAAK,GAAG,QAAQ,CAAW,MAAK;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;QACxC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;IAC5D,CAAC;8EAAC;AAEQ,IAAA,UAAU,CAAC,OAAgB,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IAC/D;IAEU,MAAM,CAAC,KAAa,EAAE,IAAY,EAAA;QAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/B,QAAA,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvB;IAEU,OAAO,CAAC,KAAa,EAAE,KAAsB,EAAA;QACrD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/B,QAAA,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM;AAC3B,QAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvB;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/B,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE;AACvB,QAAA,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvB;AAEQ,IAAA,SAAS,CAAC,KAAe,EAAA;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;IAC7D;uGAzCW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1GZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,o2BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA5DS,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA4Gf,WAAW,EAAA,UAAA,EAAA,CAAA;kBA9GvB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,gBAAgB,CAAC,mBACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,o2BAAA,CAAA,EAAA;;;ACjEH;;;AAGG;MAoEU,WAAW,CAAA;AACH,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,MAAM,EAAW;IAE9B,IAAI,GAAA;QACZ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;AACxE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7C;AAEU,IAAA,MAAM,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,MAAM,IAAI,GAAI,KAAK,CAAC,MAA8B,CAAC,KAAK;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5D;AAEU,IAAA,MAAM,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;QACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IAChE;uGAtBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhEZ;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAwCU,WAAW,EAAA,UAAA,EAAA,CAAA;kBAnEvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,eAAA,EACR,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,EAAA;;;ACzBH;;;;;;AAMG;MAOU,YAAY,CAAA;AACN,IAAA,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAClC,SAAS,GAAG,SAAS,CAA+B,WAAW;kFAAC;AAC9D,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,MAAM,EAAW;IAErB,MAAM,GAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;IAClD,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;IACzB,KAAK,GAAG,MAAM,CAAgB,IAAI;8EAAC;IACnC,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAEnC,GAAG,GAAA;QACX,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACvC;;AAGU,IAAA,UAAU,CAAC,KAAiB,EAAA;AACpC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;QAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC;IACjF;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;AAEU,IAAA,cAAc,CAAC,KAAY,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AAC/B,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;AAEU,IAAA,MAAM,CAAC,KAAgB,EAAA;QAC/B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC;AAC3C,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IACjC;AAEU,IAAA,UAAU,CAAC,KAAgB,EAAA;QACnC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEU,IAAA,KAAK,CAAC,KAAY,EAAA;QAC1B,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,IAAI,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC5B;AAEU,IAAA,KAAK,CAAC,KAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC;IAC/D;AAEU,IAAA,SAAS,CAAC,KAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC;IACnE;AAEU,IAAA,QAAQ,CAAC,KAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IACvB;AAEU,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;IACzE;IAEU,KAAK,GAAA;QACb,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACzB;IAEQ,MAAM,UAAU,CAAC,IAAU,EAAA;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAChD;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxC,MAAM,GAAG,GAAG,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACpE,YAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QACrD;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;QACpD;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEQ,IAAA,aAAa,CAAC,IAAU,EAAA;QAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,YAAA,MAAM,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AAC3C,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,KAAK,CAAC,IAAyB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IAC/D;uGA7GW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,+eC9BzB,kkHAyGA,EAAA,MAAA,EAAA,CAAA,s7GAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD3Ea,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kkHAAA,EAAA,MAAA,EAAA,CAAA,s7GAAA,CAAA,EAAA;uEAIsB,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEXlF;AACM,SAAU,YAAY,CAAC,KAAa,EAAA;AACxC,IAAA,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE;AACtB,SAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAC1B;AAEA;AACM,SAAU,YAAY,CAAC,KAAa,EAAA;IACxC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpD;AAEA;AACM,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACxC,IAAI,OAAO,KAAK,EAAE;AAAE,QAAA,OAAO,KAAK;;AAEhC,IAAA,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI;AACzD,IAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI;AAC/C,IAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,OAAO,IAAI,CAAC;AACd;AAEA;AACM,SAAU,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAA;AAC3D,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;SAC7B,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;AACxB,SAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAClE,IAAA,OAAO,CAAA,OAAA,EAAU,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA,MAAA,CAAQ;AAClD;AAEA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE5C;AACA,SAAS,WAAW,CAAC,CAAU,EAAA;AAC7B,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,CAAA,GAAA,EAAM,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM;QAE7D,KAAK,SAAS,EAAE;YACd,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACvE,YAAA,OAAO,KAAK,KAAK,CAAA,CAAA,EAAI,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA,GAAA,EAAM,KAAK,GAAG;QAC7E;QAEA,KAAK,MAAM,EAAE;YACX,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI;YACjC,MAAM,KAAK,GAAa,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7E,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAA,IAAA,EAAO,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA,KAAA,CAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACjF,YAAA,OAAO,IAAI,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,EAAA,EAAK,GAAG,GAAG;QACjC;QAEA,KAAK,OAAO,EAAE;AACZ,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACpD,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAA,MAAA,EAAS,YAAY,CAAC,IAAI,CAAC,CAAA,OAAA,CAAS,GAAG,EAAE;AACjE,YAAA,OAAO,CAAA,eAAA,EAAkB,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA,IAAA,EAAO,QAAQ,eAAe;QACjG;QAEA,KAAK,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC/C,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACpD,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAA,iBAAA,EAAoB,YAAY,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;AACjE,YAAA,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,EAAI,IAAI,eAAe;QAChD;QAEA,KAAK,OAAO,EAAE;AACZ,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,EAAE;AACxC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;AACjD,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG;AAC5C,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7C,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACtD,MAAM,QAAQ,GAAG,CAAA,WAAA,EAAc,KAAK,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA,eAAA,CAAiB;YAClH,MAAM,GAAG,GAAG,CAAA,UAAA,EAAa,YAAY,CAAC,GAAG,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA,mDAAA,CAAqD;AACpK,YAAA,MAAM,GAAG,GAAG,OAAO,GAAG,CAAA,oEAAA,EAAuE,YAAY,CAAC,OAAO,CAAC,CAAA,aAAA,CAAe,GAAG,EAAE;AACtI,YAAA,OAAO,kBAAkB,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,GAAG,WAAW;QAC5D;QAEA,KAAK,QAAQ,EAAE;AACb,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACzC,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;AACvD,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;AAC/C,YAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG;AACjE,YAAA,MAAM,SAAS,GAAG,CAAA,WAAA,EAAc,KAAK,iBAAiB;YACtD,MAAM,QAAQ,GACZ,qGAAqG;YACvG,OAAO,CAAA,YAAA,EAAe,SAAS,CAAA,WAAA,EAAc,IAAI,2BAA2B,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,YAAY,QAAQ,CAAA,4BAAA,EAA+B,KAAK,CAAA,UAAA,CAAY;QAC3L;AAEA,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,MAAM;QAEf,KAAK,OAAO,EAAE;AACZ,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACvC,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACjD,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;AACrD,YAAA,IAAI,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpC,QACE,CAAA,sEAAA,EAAyE,GAAG,CAAA,kBAAA,CAAoB;AAChG,oBAAA,CAAA,aAAA,EAAgB,YAAY,CAAC,QAAQ,CAAC,CAAA,0CAAA,CAA4C;oBAClF,CAAA,0EAAA,CAA4E;oBAC5E,CAAA,iEAAA,CAAmE;AACnE,oBAAA,CAAA,sGAAA,CAAwG;YAE5G;AACA,YAAA,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE;gBAC3B,OAAO,CAAA,sCAAA,EAAyC,YAAY,CAAC,GAAG,CAAC,CAAA,4CAAA,EAA+C,YAAY,CAAC,GAAG,CAAC,CAAA,QAAA,CAAU;YAC7I;AACA,YAAA,OAAO,EAAE;QACX;QAEA,KAAK,SAAS,EAAE;YACd,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;AAClE,YAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;AAC3D,YAAA,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;AAC/C,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;AAClD,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC;AACpD,YAAA,MAAM,UAAU,GAA2B;AACzC,gBAAA,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe;aACjF;YACD,MAAM,KAAK,GACT,CAAA,mCAAA,EAAsC,IAAI,QAAQ,GAAG,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,CAAG;AAChF,gBAAA,CAAA,gBAAA,EAAmB,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,iBAAiB;YACzE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE;iBAC9B,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,uBAAA,EAA0B,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,MAAA,CAAQ;iBAC7F,IAAI,CAAC,EAAE,CAAC;AACX,YAAA,OAAO,CAAA,+BAAA,EAAkC,KAAK,CAAA,EAAA,EAAK,OAAO,QAAQ;QACpE;AAEA,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAErD,QAAA;AACE,YAAA,OAAO,EAAE;;AAEf;AAEA;;;;AAIG;AACG,SAAU,cAAc,CAAC,GAAuC,EAAA;AACpE,IAAA,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM;AAAE,QAAA,OAAO,EAAE;AACnC,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/C;AAEA;AACA,SAAS,SAAS,CAAC,IAAY,EAAA;AAC7B,IAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE;AACrB,SAAA,OAAO,CAAC,UAAU,EAAE,GAAG;AACvB,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,SAAA,OAAO,CAAC,QAAQ,EAAE,GAAG;AACrB,SAAA,OAAO,CAAC,OAAO,EAAE,GAAG;AACpB,SAAA,OAAO,CAAC,OAAO,EAAE,GAAG;AACpB,SAAA,OAAO,CAAC,MAAM,EAAE,GAAG;AACnB,SAAA,IAAI,EAAE;AACX;AAEA;AACA,SAAS,WAAW,CAAC,CAAU,EAAA;AAC7B,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,WAAW;AAChB,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACxC,QAAA,KAAK,MAAM;YACT,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;iBAC1D,GAAG,CAAC,CAAC,CAAS,KAAK,SAAS,CAAC,CAAC,CAAC;iBAC/B,MAAM,CAAC,OAAO;iBACd,IAAI,CAAC,KAAK,CAAC;AAChB,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC5C,QAAA,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAChE,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC7C,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC3C,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE;iBACrB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;iBAClE,MAAM,CAAC,OAAO;iBACd,IAAI,CAAC,GAAG,CAAC;AACd,QAAA;AACE,YAAA,OAAO,EAAE;;AAEf;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,GAAuC,EAAA;AACpE,IAAA,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM;AAAE,QAAA,OAAO,EAAE;IACnC,OAAO,GAAG,CAAC;SACR,GAAG,CAAC,WAAW;SACf,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;SAC1B,IAAI,CAAC,MAAM,CAAC;AACjB;;AClNA;;;;;;AAMG;MAOU,YAAY,CAAA;AACN,IAAA,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAClC,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAC9B,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,MAAM,EAAW;AAErB,IAAA,QAAQ,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;iFAAC;AACtE,IAAA,GAAG,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4EAAC;IAC5D,WAAW,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;oFAAC;AAChF,IAAA,YAAY,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;qFAAC;AAC1E,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG;mFAAC;;AAG3D,IAAA,OAAO,GAAG,QAAQ,CAAyB,MAAK;AACjE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC;IAC3D,CAAC;gFAAC;IAEiB,WAAW,GAAG,QAAQ,CACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oFAClE;AAES,IAAA,KAAK,CAAC,KAAY,EAAA;QAC1B,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,IAAI,EAAE;AAC3D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IACnB;AAEQ,IAAA,OAAO,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YACzF;QACF;QACA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;YAChD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;gBACzC,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,wBAAA,GAAG,CAAC;AACJ,wBAAA,IAAI,EAAE;4BACJ,GAAG,CAAC,CAAC,IAAI;AACT,4BAAA,GAAG,EAAE,GAAG;4BACR,QAAQ;4BACR,QAAQ,EAAE,QAAQ,CAAC,IAAI;AACvB,4BAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE,GAAG,CAAC;AAC5C,yBAAA;AACF,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAClE;gBACF;YACF;QACF;;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;IAC5F;uGA1DW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,uXC5BzB,w2CAqCA,EAAA,MAAA,EAAA,CAAA,yrDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDTa,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w2CAAA,EAAA,MAAA,EAAA,CAAA,yrDAAA,CAAA,EAAA;;;AEZjD,MAAM,KAAK,GAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;AAEtF;;;AAGG;MAOU,aAAa,CAAA;AACL,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAW;IACjC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,WAAW,GAAG,MAAM,EAAW;IAErB,KAAK,GAAG,KAAK;IACb,MAAM,GAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;IAC7C,QAAQ,GAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;AAE7D,IAAA,IAAI,CAAC,GAAW,EAAA;QACxB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B;;AAGU,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;AAC/B,QAAA,MAAM,GAAG,GAA2B;YAClC,OAAO,EAAE,CAAC,CAAC,WAAW;YACtB,OAAO,EAAE,CAAC,CAAC,WAAW;YACtB,OAAO,EAAE,CAAC,CAAC,WAAW;YACtB,OAAO,EAAE,CAAC,CAAC,WAAW;YACtB,MAAM,EAAE,CAAC,CAAC,UAAU;YACpB,IAAI,EAAE,CAAC,CAAC,QAAQ;SACjB;AACD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB;AACU,IAAA,YAAY,CAAC,OAAkB,EAAA;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;AAC/B,QAAA,MAAM,GAAG,GAAuC;YAC9C,KAAK,EAAE,CAAC,CAAC,YAAY;YACrB,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,OAAO,EAAE,CAAC,CAAC,cAAc;SAC1B;AACD,QAAA,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO;IAChC;AACU,IAAA,UAAU,CAAC,KAAY,EAAA;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;QAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC;IACjF;AAEU,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC;IACjE;AACU,IAAA,MAAM,CAAC,KAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IACvE;AACU,IAAA,OAAO,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACtB;AACU,IAAA,UAAU,CAAC,OAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB;AACU,IAAA,QAAQ,CAAC,KAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IACvB;AAEQ,IAAA,KAAK,CAAC,IAAyB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IAC/D;uGA7DW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,wXC1B1B,yoGAmFA,EAAA,MAAA,EAAA,CAAA,yvIAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDzDa,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yoGAAA,EAAA,MAAA,EAAA,CAAA,yvIAAA,CAAA,EAAA;;;AESjD;;;;;;AAMG;MAEU,6BAA6B,CAAA;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,SAAS,GAAG,IAAI,GAAG,EAA0B;AAC7C,IAAA,QAAQ,GAAG,CAAC,KAAY,KAAU;;QAEjD,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,KAAK,CAAC;AAC7D,IAAA,CAAC;;AAGD,IAAA,QAAQ,CAAC,QAAgC,EAAA;QACvC,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,MAAK,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;QACpE;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,QAAA,OAAO,MAAK;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE;YACtC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AAC7B,gBAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;YACvE;AACF,QAAA,CAAC;IACH;uGArBW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,cADhB,MAAM,EAAA,CAAA;;2FACnB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBADzC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAyBlC;;;;;;;AAOG;MAWU,eAAe,CAAA;AACT,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;IAClD,SAAS,GAAG,SAAS,CAA+B,QAAQ;kFAAC;AAC3D,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACjC,UAAU,GAAyC,IAAI;AAE/D,IAAA,WAAA,GAAA;;;QAGE,MAAM,UAAU,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,KACtE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAClC;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;IAC1C;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;AAC5B,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;IACF;;IAGS,WAAW,GAAG,KAAK,CAAsB,EAAE;oFAAC;;IAE5C,OAAO,GAAG,KAAK,CAAoB,QAAQ;gFAAC;;IAE5C,KAAK,GAAG,KAAK,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ;8EAAC;;IAErD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG3D,IAAI,GAAG,MAAM,EAAqB;IAExB,IAAI,GAAG,MAAM,CAAC,KAAK;6EAAC;IACpB,KAAK,GAAG,MAAM,CAAC,EAAE;8EAAC;IAClB,WAAW,GAAG,MAAM,CAAC,CAAC;oFAAC;AACvB,IAAA,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC;AACzC,IAAA,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC;AAEvC,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,gBAAgB,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC;kFAC7F;;AAGkB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC3C,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,EAAE;QAC/B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACnC,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;AAC3F,YAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxB,QAAA,CAAC,CAAC;IACJ,CAAC;iFAAC;AAEF;;;;AAIG;AACgB,IAAA,MAAM,GAAG,QAAQ,CAAa,MAAK;AACpD,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AACrC,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM;AACrD,YAAA,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACnE,QAAA,CAAC,CAAC;QACF,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;+EAAC;AAEQ,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA,KAAA,EAAQ,KAAK,EAAE;IACtC;IAEU,MAAM,GAAA;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;IAC/C;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC3D,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;AACzC,QAAA,CAAC,CAAC;IACJ;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB;AAEU,IAAA,OAAO,CAAC,KAAY,EAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzE;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvF;AACF,YAAA,KAAK,OAAO;gBACV,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnE;AACF,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,KAAK,EAAE;gBACZ;;IAEN;AAEU,IAAA,MAAM,CAAC,GAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACnB,IAAI,CAAC,KAAK,EAAE;IACd;AAEU,IAAA,qBAAqB,CAAC,KAAY,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;YAAE,IAAI,CAAC,KAAK,EAAE;IAC3E;uGAlIW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,4+BCnF5B,w1FA2EA,EAAA,MAAA,EAAA,CAAA,g6HAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDQa,eAAe,EAAA,UAAA,EAAA,CAAA;kBAV3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,eAAA,EAGZ,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,iCAAiC,EAAE,sBAAsB;AAC1D,qBAAA,EAAA,QAAA,EAAA,w1FAAA,EAAA,MAAA,EAAA,CAAA,g6HAAA,CAAA,EAAA;iGAIoE,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE7D/E;;;AAGG;AACH,MAAM,aAAa,GAAuD;AACxE,IAAA,CAAC,EAAE;AACD,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC,KAAA;AACD,IAAA,CAAC,EAAE;AACD,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;AAChC,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;AAC5C,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;AAC7C,KAAA;IACD,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CACzC;AAED;;;;;;AAMG;MAmBU,WAAW,CAAA;AACH,IAAA,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAClC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGhC,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAa;;IAEpC,KAAK,GAAG,KAAK,CAAC,CAAC;8EAAC;;IAEhB,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,YAAY,GAAG,MAAM,EAAa;;AAGxB,IAAA,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;iFAAC;IAErB,YAAY,GAAG,aAAa;AAErC,IAAA,UAAU,CAAC,IAAY,EAAA;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;IACrC;;IAIU,MAAM,CAAC,KAAa,EAAE,KAAc,EAAA;QAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEU,IAAA,cAAc,CAAC,UAAkB,EAAE,QAAgB,EAAE,QAAmB,EAAA;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC;AACvC,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE;AACtD,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC1D;;IAIU,QAAQ,CAAC,KAAa,EAAE,GAAsB,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE;QAC1B,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;IACxC;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;IAC1D;AAEU,IAAA,MAAM,CAAC,KAAa,EAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;AAClD,QAAA,IAAI,WAAW;YAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC;IAC7D;IAEU,IAAI,CAAC,KAAa,EAAE,KAAa,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK;QAC5B,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;YAAE;QAClD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CACf,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CACtF;IACH;IAEU,SAAS,CAAC,KAAa,EAAE,IAAY,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,GAAG;YAAE;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;AACnC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE;;AAE5B,QAAA,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;QACrF,MAAM,IAAI,GAAG,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI;QACxF,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE;AACjD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChE;;IAIU,OAAO,CAAC,KAAa,EAAE,KAAsB,EAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,QAAA,MAAM,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC/E,MAAM,QAAQ,GAAY,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE;QACtF,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE;QAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAC3C;AAEU,IAAA,WAAW,CAAC,KAAa,EAAA;QACjC,IAAI,KAAK,IAAI,CAAC;YAAE;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC;IACrC;IAEU,UAAU,CAAC,KAAa,EAAE,GAAkB,EAAA;AACpD,QAAA,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC;AACnC,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC;IAC1E;;IAIU,cAAc,CAAC,KAAa,EAAE,KAAa,EAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC3C,QAAA,OAAO,OAAO,CAAC,MAAM,GAAG,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAChH,QAAA,OAAO,CAAC,MAAM,GAAG,KAAK;QACtB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACjB,YAAA,GAAG,KAAK;AACR,YAAA,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AACvD,YAAA,QAAQ,EAAE,OAAO;AAClB,SAAA,CAAC;IACJ;IAEU,aAAa,CAAC,KAAa,EAAE,KAA0B,EAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;IACrE;IAEU,aAAa,CAAC,KAAa,EAAE,KAAY,EAAA;AACjD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAG,KAAK,CAAC,MAA4B,CAAC,KAAK,EAAE,CAAC;IACjF;IACU,WAAW,CAAC,KAAa,EAAE,KAAY,EAAA;AAC/C,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;IACtF;IACU,aAAa,CAAC,KAAa,EAAE,KAAY,EAAA;AACjD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAG,KAAK,CAAC,MAA4B,CAAC,KAAK,EAAE,CAAC;IACjF;IACU,eAAe,CAAC,KAAa,EAAE,KAAY,EAAA;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,OAAO,EAAG,KAAK,CAAC,MAA4B,CAAC,KAAK,EAAE,CAAC;IACnF;AAEU,IAAA,WAAW,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC/C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC7E,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAClE,OAAO,CAAA,OAAA,EAAU,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAA,MAAA,CAAQ;IACtD;AACU,IAAA,OAAO,CAAC,KAAc,EAAA;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,OAAO,CAAA,eAAA,EAAkB,CAAC,CAAA,CAAA,CAAG;IAC/B;AACU,IAAA,YAAY,CAAC,KAAc,EAAA;AACnC,QAAA,MAAM,GAAG,GAA2B;AAClC,YAAA,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe;SACjF;AACD,QAAA,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,YAAY;IACtE;;AAIU,IAAA,UAAU,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACzD;;IAGU,SAAS,CAAC,OAAoB,EAAE,KAAY,EAAA;QACpD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE;IACjB;AAEU,IAAA,aAAa,CAAC,IAAY,EAAA;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE;IAChD;IAEQ,iBAAiB,GAAA;QACvB,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IAC9E;uGA/LW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrExB,sjRAyNA,EAAA,MAAA,EAAA,CAAA,ioJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpJa,WAAW,8HAfpB,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,YAAY,0JACZ,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,YAAY,oHACZ,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAON,WAAW,EAAA,UAAA,EAAA,CAAA;kBAlBvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,gBAAgB;wBAChB,cAAc;wBACd,YAAY;wBACZ,WAAW;wBACX,WAAW;wBACX,YAAY;wBACZ,YAAY;wBACZ,aAAa;wBACb,eAAe;qBAChB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAA,QAAA,EAAA,sjRAAA,EAAA,MAAA,EAAA,CAAA,ioJAAA,CAAA,EAAA;;;AEnElC;;;;;;;;;;;;;AAaG;AAUH,MAAM,aAAa,GAA2B;IAC5C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CACzC;AAED;AACA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;AACzB,IAAA,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK;IACxE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;AAC5D,CAAA,CAAC;AAEF,SAAS,KAAK,CAAC,IAAY,EAAE,IAA6B,EAAE,QAAoB,EAAA;AAC9E,IAAA,MAAM,CAAC,GAAY,EAAE,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;AACtD,IAAA,IAAI,QAAQ;AAAE,QAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;AACnC,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,SAAS,CAAC,IAAY,EAAA;AAC7B,IAAA,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;AACpC,QAAA,OAAO,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI;IAChE;AACA,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;QACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9C,QAAA,GAAG,CAAC,SAAS,GAAG,IAAI;QACpB,OAAO,GAAG,CAAC,OAAO;IACpB;AACA,IAAA,OAAO,IAAI;AACb;AAEA,MAAM,SAAS,GAAG,CAAC;AACnB,MAAM,YAAY,GAAG,CAAC;AAEtB,SAAS,cAAc,CAAC,IAAU,EAAA;AAChC,IAAA,QACE,IAAI,CAAC,QAAQ,KAAK,YAAY;QAC9B,UAAU,CAAC,GAAG,CAAE,IAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AAE3D;AAEA;AACA,SAAS,QAAQ,CAAC,IAAU,EAAA;AAC1B,IAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AAC5E,IAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAQ,IAAgB,CAAC,SAAS;AACtE,IAAA,OAAO,EAAE;AACX;AAEA,SAAS,KAAK,CAAC,EAAW,EAAE,IAAY,EAAA;AACtC,IAAA,OAAQ,EAAkB,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;AACxE;AAEA;AACA,SAAS,aAAa,CAAC,IAAgB,EAAE,GAAc,EAAA;IACrD,IAAI,MAAM,GAAW,EAAE;IACvB,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE;AACpB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;AACjD,QAAA,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,EAAE;AACb,IAAA,CAAC;AAED,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC9C,QAAA,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE;AACxB,YAAA,KAAK,EAAE;AACP,YAAA,aAAa,CAAC,IAAe,EAAE,GAAG,CAAC;QACrC;AAAO,aAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE;;QAErE;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB;IACF;AACA,IAAA,KAAK,EAAE;AACT;AAEA;AACA,SAAS,aAAa,CAAC,EAAW,EAAE,GAAc,EAAA;IAChD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;AAEpC,IAAA,IAAI,GAAG,KAAK,GAAG,EAAE;AACf,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxE;IACF;AACA,IAAA,IAAI,GAAG,IAAI,aAAa,EAAE;AACxB,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACxB,YAAA,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC;AACvC,SAAA,CAAC,CAAC;QACH;IACF;IACA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAClE,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,CACjC;AACD,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF;IACF;AACA,IAAA,IAAI,GAAG,KAAK,YAAY,EAAE;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;AAC/B,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS;AAC3C,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACtB,YAAA,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC;YAC9B,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;AAC1C,SAAA,CAAC,CAAC;QACH;IACF;AACA,IAAA,IAAI,GAAG,KAAK,KAAK,EAAE;QACjB,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE;AAC7C,QAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;QACzE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E;IACF;IACA,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,EAAE;AACrC,QAAA,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,GAAI,EAAuB,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;QAC9E,IAAI,GAAG,EAAE;AACP,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,KAAK,GACT,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,KAAK;AAC1B,kBAAE;kBACA,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,KAAK;AAC5B,sBAAE;sBACA,QAAQ;AAChB,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gBACtB,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;gBAClC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAClC,gBAAA,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;gBAClE,KAAK;AACL,gBAAA,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG;AACzD,aAAA,CAAC,CAAC;QACL;QACA;IACF;AACA,IAAA,IAAI,GAAG,KAAK,IAAI,EAAE;QAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9B;IACF;;;IAIA,IAAI,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CACxE,CAAC,KAAK,KAAI;YACR,MAAM,QAAQ,GAAc,EAAE;AAC9B,YAAA,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC;AACtC,QAAA,CAAC,CACF;QACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnE;IACF;IACA,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,6BAA6B,CAAC;IAC3D,IAAI,GAAG,EAAE;AACP,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS;AAC5E,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACvB,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,QAAQ;YAC1C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE;YACpC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,MAAM;YACxC,IAAI;AACL,SAAA,CAAC,CAAC;QACH;IACF;IACA,IAAI,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACrC,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC;AACzC,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACtB,YAAA,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;YAC3C,WAAW,EAAE,EAAE,GAAG,CAAC;AACpB,SAAA,CAAC,CAAC;QACH;IACF;;AAGA,IAAA,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC;AACxB;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,IAAY,EAAA;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;AACjC,IAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,eAAe,EAAE;AAE5C,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE;;QAET,OAAO;AACL,YAAA,OAAO,EAAE,yBAAyB;AAClC,YAAA,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnE;IACH;IAEA,MAAM,MAAM,GAAc,EAAE;AAC5B,IAAA,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC;AAC3B,IAAA,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE;AACvD;;AC/KA;;;;;;;;;;;;;;;;AAgBG;MA0BU,aAAa,CAAA;AACL,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;AACxB,IAAA,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAClC,IAAA,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC;IACrD,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACnE,WAAW,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,WAAW,GAAG,MAAM,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG1E,IAAA,KAAK,GAAG,KAAK,CAAkB,eAAe,EAAE;8EAAC;AAC1D;;;;;AAKG;IACM,WAAW,GAAG,KAAK,CAAqB,UAAU;oFAAC;;IAEnD,MAAM,GAAG,KAAK,CAA6B,IAAI;+EAAC;;IAEhD,WAAW,GAAG,KAAK,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB;oFAAC;;IAExE,SAAS,GAAG,KAAK,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW;kFAAC;;IAE5D,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvD,aAAa,GAAG,KAAK,CAA8B,IAAI;sFAAC;;IAExD,cAAc,GAAG,KAAK,CAA2B,IAAI;uFAAC;;IAGtD,MAAM,GAAG,MAAM,EAAmB;;IAElC,UAAU,GAAG,MAAM,EAAU;IAEnB,WAAW,GAAG,MAAM,CAAC,KAAK;oFAAC;;;IAI7B,YAAY,GAAG,oBAAoB,EAAE;AACnC,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;kFAAC;AAE5E,IAAA,QAAQ,GAA8C,MAAK,EAAE,CAAC;AAC9D,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;;AAGvB,IAAA,WAAW,GAAG,QAAQ,CAAsB,MAC3D,uBAAuB,CACrB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAC5C,IAAI,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,CACd;oFACF;AAEkB,IAAA,SAAS,GAAG,QAAQ,CAAY,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,EAAE;kFAAC;AAEpF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;;;;;QAM/B,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;QACvC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;qFAAC;QACzE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AACvC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;0FACvD;QACD,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM;AACvC,YAAA,GAAG,0BAA0B;YAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACnC,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;AACjC,SAAA;2FAAC;IACJ;AAEU,IAAA,cAAc,CAAC,MAAiB,EAAA;AACxC,QAAA,MAAM,IAAI,GAAoB;YAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,IAAI,yBAAyB;YAC3D,MAAM;SACP;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;;;;AAIpB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAChF,QAAA,MAAM,IAAI,GAAG,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;AACpD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,GAAG,IAAK,GAAG,IAAI,CAAC;QAC3D,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,IAAI,KAAK,IAAI;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/C;AAEA;;;AAGG;AACO,IAAA,UAAU,CAAC,KAAiB,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;QAC/C,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE;QACvD,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,UAAU,CAAC,KAAsC,EAAA;AAC/C,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,OAAO,KAAK,KAAK;AACf,kBAAE,cAAc,CAAC,KAAK;mBAClB,KAAgC,IAAI,eAAe,EAAE,CAAC,CAC7D;QACH;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,KAAgC,IAAI,eAAe,EAAE,CAAC;QACxE;IACF;AACA,IAAA,gBAAgB,CAAC,EAA6C,EAAA;AAC5D,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AACA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;uGAhIW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,iCAAA,EAAA,YAAA,EAAA,gCAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,iCAAA,EAAA,6BAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EATb;YACT,oBAAoB;AACpB,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,aAAa,CAAC;AAC5C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjFH,sGACA,ohBD2DY,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuBV,aAAa,EAAA,UAAA,EAAA,CAAA;kBAzBzB,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,WAAW,CAAC,mBAGL,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,iBAAiB;AACxB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,mCAAmC,EAAE,YAAY;AACjD,wBAAA,kCAAkC,EAAE,aAAa;AACjD,wBAAA,qBAAqB,EAAE,qBAAqB;AAC5C,wBAAA,mCAAmC,EAAE,6BAA6B;AAClE,wBAAA,YAAY,EAAE,oBAAoB;qBACnC,EAAA,SAAA,EACU;wBACT,oBAAoB;AACpB,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,mBAAmB,CAAC;AAC5C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,MAAA,EAAA,CAAA,4dAAA,CAAA,EAAA;;AAqIH;;;;;;AAMG;AACH,SAAS,YAAY,CAAC,GAAY,EAAA;AAChC,IAAA,MAAM,SAAS,GAAI,GAAwC,CAAC,SAAS;IACrE,IAAI,SAAS,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IACxC,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACrC;AAEA;;;;;AAKG;AACH,SAAS,qBAAqB,CAAC,CAAuB,EAAA;AACpD,IAAA,MAAM,IAAI,GAA2D;AACnE,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,kBAAkB,EAAE;AACzE,QAAA,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,EAAE;AACnE,QAAA,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,aAAa,EAAE;AAC1D,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE;AAC7D,QAAA,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,aAAa,EAAE;AAC1D,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE;AAC7D,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE;AAC7D,QAAA,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,eAAe,EAAE;AAChE,QAAA,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,EAAE;AACnE,QAAA,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,EAAE;KACpE;AACD,IAAA,MAAM,MAAM,GAA2B;QACrC,IAAI,EAAE,CAAC,CAAC,SAAS;QACjB,KAAK,EAAE,CAAC,CAAC,UAAU;QACnB,MAAM,EAAE,CAAC,CAAC,WAAW;KACtB;AACD,IAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,MAAM,SAAS,GAAsB;AACnC,YAAA,GAAG,GAAG;AACN,YAAA,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC,KAAK;AAC5B,YAAA,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,GAAG,CAAC,WAAW;AAC9C,YAAA,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK;SAC5C;AACD,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,SAAS,CAAC,MAAM,GAAG,MAAK;AACtB,gBAAA,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;AACtB,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE;AACnE,YAAA,CAAC;QACH;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC,CAAC;AACJ;;AE/PA;;;;;;;;;AASG;MAQU,eAAe,CAAA;AACP,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,IAAA,YAAY,GAAG,IAAI,GAAG,EAA2B;;IAGzD,KAAK,GAAG,KAAK,CAAyB,IAAI;8EAAC;;IAE3C,MAAM,GAAG,KAAK,CAAmB,IAAI;+EAAC;AAE5B,IAAA,KAAK,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,EAAE;8EAClD;;AAGS,IAAA,QAAQ,CAAC,IAAa,EAAA;QAC9B,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C;AAEU,IAAA,SAAS,CAAC,KAAc,EAAA;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AACjC,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;IAC1C;AAEU,IAAA,YAAY,CAAC,KAAc,EAAA;QACnC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACzC;AAEU,IAAA,WAAW,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC;IAClC;AAEU,IAAA,UAAU,CAAC,KAAc,EAAA;AACjC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC7C,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG;IAC/C;AAEU,IAAA,UAAU,CAAC,KAAc,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;AACzD,QAAA,OAAO,CAAA,EAAG,GAAG,GAAG,KAAK,GAAG;IAC1B;;AAGU,IAAA,QAAQ,CAAC,KAAc,EAAA;AAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QACvE,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC;YAC5D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;QACrC;AACA,QAAA,OAAO,OAAO;IAChB;AAEU,IAAA,WAAW,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC3C,QAAA,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI;IAC7C;AAEU,IAAA,WAAW,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC/C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC7E,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAClE,OAAO,CAAA,OAAA,EAAU,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAA,MAAA,CAAQ;IACtD;AACU,IAAA,OAAO,CAAC,KAAc,EAAA;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,OAAO,CAAA,eAAA,EAAkB,CAAC,CAAA,CAAA,CAAG;IAC/B;AACU,IAAA,YAAY,CAAC,KAAc,EAAA;AACnC,QAAA,MAAM,GAAG,GAA2B;AAClC,YAAA,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe;SACjF;AACD,QAAA,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,YAAY;IACtE;uGA5EW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7B5B,0hIAmHA,EAAA,MAAA,EAAA,CAAA,0iJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtFa,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,mBAAmB,EAAA,eAAA,EAGZ,uBAAuB,CAAC,MAAM,QACzC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAA,QAAA,EAAA,0hIAAA,EAAA,MAAA,EAAA,CAAA,0iJAAA,CAAA,EAAA;;;AE3BtC;;;;;;AAMG;AAEH;;ACRA;;AAEG;;;;"}