@textbus/platform-browser 5.2.3 → 5.2.4

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":"index.esm.js","sources":["../src/_utils/uikit.ts","../src/_utils/env.ts","../src/injection-tokens.ts","../src/parser.ts","../src/selection-bridge.ts","../src/types.ts","../src/magic-input.ts","../src/collaborate-cursor.ts","../src/native-input.ts","../src/dom-adapter.ts","../src/browser-module.ts"],"sourcesContent":["/**\n * 选区焦点可视位置\n */\nexport interface Rect {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport interface UIElementParams {\n classes?: string[]\n attrs?: {[key: string]: any}\n props?: {[key: string]: any}\n styles?: {[key: string]: any}\n children?: (Node | null)[]\n on?: Record<string, (ev: Event) => void>\n}\n\nexport function createElement(tagName: string, options: UIElementParams = {}): HTMLElement {\n const el = document.createElement(tagName)\n if (options.classes) {\n el.classList.add(...options.classes)\n }\n if (options.attrs) {\n Object.keys(options.attrs).forEach(key => {\n el.setAttribute(key, options.attrs![key])\n })\n }\n if (options.props) {\n Object.keys(options.props).forEach(key => {\n (el as any)[key] = options.props![key]\n })\n }\n if (options.styles) {\n Object.assign(el.style, options.styles)\n }\n if (options.children) {\n options.children.filter(i => i).forEach(item => {\n el.appendChild(item as Node)\n })\n }\n if (options.on) {\n Object.keys(options.on).forEach(key => {\n el.addEventListener(key, options.on![key])\n })\n }\n return el\n}\n\nexport function getLayoutRectByRange(range: Range): Rect {\n let { startContainer, startOffset } = range\n if (startContainer.nodeType === Node.TEXT_NODE) {\n if (startOffset > 0) {\n return range.getBoundingClientRect()\n }\n const parentNode = startContainer.parentNode!\n startOffset = Array.from(parentNode.childNodes).indexOf(startContainer as any)\n startContainer = parentNode\n }\n\n const beforeNode = startContainer.childNodes[startOffset - 1]\n if (beforeNode) {\n if (beforeNode.nodeType === Node.ELEMENT_NODE && beforeNode.nodeName.toLowerCase() !== 'br') {\n const rect = (beforeNode as HTMLElement).getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n } else if (beforeNode.nodeType === Node.TEXT_NODE) {\n const range2 = document.createRange()\n range2.setStart(beforeNode, beforeNode.textContent!.length)\n range2.setEnd(beforeNode, beforeNode.textContent!.length)\n const rect = range2.getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n }\n const offsetNode = startContainer.childNodes[startOffset]\n let isInsertBefore = false\n if (!offsetNode) {\n const lastChild = startContainer.lastChild\n if (lastChild && lastChild.nodeType === Node.ELEMENT_NODE) {\n const rect = (lastChild as HTMLElement).getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n }\n if (offsetNode) {\n if (offsetNode.nodeType === Node.ELEMENT_NODE && offsetNode.nodeName.toLowerCase() !== 'br') {\n const rect = (offsetNode as HTMLElement).getBoundingClientRect()\n return {\n left: rect.left,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n isInsertBefore = true\n }\n const span = startContainer.ownerDocument!.createElement('span')\n span.innerText = '\\u200b'\n span.style.display = 'inline-block'\n if (isInsertBefore) {\n startContainer.insertBefore(span, offsetNode)\n } else {\n startContainer.appendChild(span)\n }\n const rect = span.getBoundingClientRect()\n startContainer.removeChild(span)\n return {\n left: rect.left,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n}\n","export const isWindows = () => /win(dows|32|64)/i.test(navigator.userAgent)\nexport const isMac = () => /mac os/i.test(navigator.userAgent)\nexport const isSafari = () => /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)\nexport const isFirefox = () => /Firefox/.test(navigator.userAgent)\n\nexport const isMobileBrowser = () => /Android|iPhone|iPad/.test(navigator.userAgent)\n","import { InjectionToken } from '@viewfly/core'\n\nimport { ViewOptions } from './browser-module'\n\n/**\n * 编辑器可选项依赖注入 token\n */\nexport const EDITOR_OPTIONS = new InjectionToken<ViewOptions>('EDITOR_OPTIONS')\n\n/**\n * 编辑器容器依赖注入 token\n */\nexport const VIEW_CONTAINER = new InjectionToken<HTMLElement>('VIEW_CONTAINER')\n\n/**\n * 编辑器容器依赖注入 token\n */\nexport const VIEW_DOCUMENT = new InjectionToken<HTMLElement>('VIEW_DOCUMENT')\n\n/**\n * 编辑器容器遮罩层 token\n */\nexport const VIEW_MASK = new InjectionToken<HTMLElement>('VIEW_MASK')\n","import { Inject, Injectable } from '@viewfly/core'\nimport { Attribute, Component, ContentType, FormatItem, Formatter, FormatValue, Slot, Textbus } from '@textbus/core'\n\nimport { EDITOR_OPTIONS } from './injection-tokens'\nimport { ViewOptions } from './browser-module'\n\n/**\n * 插槽解析器\n */\nexport interface SlotParser {\n /**\n * 将指定 DOM 节点解析为插槽数据\n * @param childSlot 储存数据的插槽\n * @param slotRootElement 插槽的根节点\n * @param slotContentHostElement 插槽的内容节点\n *\n * 注意:当不传入内容节点时,Textbus 会把根节点当成内容节点\n */<T extends Slot>(childSlot: T, slotRootElement: Element, slotContentHostElement?: Element): T\n}\n\n/**\n * 组件加载器\n */\nexport interface ComponentLoader {\n /** 识别组件的匹配方法 */\n match(element: Element,\n returnableContentTypes: ContentType[]): boolean\n\n /** 读取组件内容的方法 */\n read(element: Element, textbus: Textbus, slotParser: SlotParser): Component | Slot | void\n}\n\nexport interface FormatLoaderReadResult<T = FormatValue> {\n formatter: Formatter<T>\n value: T\n}\n\n/**\n * 格式加载器\n */\nexport interface FormatLoader<T = FormatValue> {\n /**\n * 匹配一个 DOM 节点是否是某个格式节点\n * @param element\n */\n match(element: Element): boolean\n\n /**\n * 读取匹配到的节点,并返回读取后的信息\n * @param element\n */\n read(element: Element): FormatLoaderReadResult<T>\n}\n\nexport interface AttributeLoaderReadResult<T = FormatValue> {\n attribute: Attribute<T>\n value: T\n}\n\n/**\n * 属性加载器\n */\nexport interface AttributeLoader<T = FormatValue> {\n /**\n * 匹配一个 DOM 节点是否是某个属性节点\n * @param element\n */\n match(element: Element): boolean\n\n /**\n * 读取匹配到的节点,并返回读取后的信息\n * @param element\n */\n read(element: Element): AttributeLoaderReadResult<T>\n}\n\n/**\n * 用于解析 HTML,并把 HTML 内容转换为 Textbus 可以支持的组件或插槽数据\n */\n@Injectable()\nexport class Parser {\n static parseHTML(html: string) {\n return new DOMParser().parseFromString(html, 'text/html').body\n }\n\n componentLoaders: ComponentLoader[]\n formatLoaders: FormatLoader<any>[]\n attributeLoaders: AttributeLoader<any>[]\n\n constructor(@Inject(EDITOR_OPTIONS) options: ViewOptions,\n private textbus: Textbus) {\n const componentLoaders = [\n ...(options.componentLoaders || [])\n ]\n const formatLoaders = [\n ...(options.formatLoaders || [])\n ]\n const attributeLoaders = [\n ...(options.attributeLoaders || [])\n ]\n // options.imports?.forEach(i => {\n // componentLoaders.push(...(i.componentLoaders || []))\n // formatLoaders.push(...(i.formatLoaders || []))\n // })\n this.componentLoaders = componentLoaders\n this.formatLoaders = formatLoaders\n this.attributeLoaders = attributeLoaders\n }\n\n /**\n * 使用指定的组件加载器解析一段 HTML 字符串或 DOM 元素\n * @param html\n * @param rootComponentLoader\n */\n parseDoc(html: string | HTMLElement, rootComponentLoader: ComponentLoader) {\n const element = typeof html === 'string' ? Parser.parseHTML(html) : html\n return rootComponentLoader.read(\n element,\n this.textbus,\n (childSlot, slotRootElement, slotContentHostElement = slotRootElement) => {\n return this.readSlot(childSlot, slotRootElement, slotContentHostElement)\n }\n )\n }\n\n /**\n * 将一段 HTML 或 DOM 元素解析到指定插槽\n * @param html\n * @param rootSlot\n */\n parse(html: string | HTMLElement, rootSlot: Slot) {\n const element = typeof html === 'string' ? Parser.parseHTML(html) : html\n return this.readFormats(element, rootSlot)\n }\n\n private readComponent(el: Node, slot: Slot) {\n if (el.nodeType === Node.ELEMENT_NODE) {\n if ((el as HTMLElement).tagName === 'BR') {\n slot.insert('\\n')\n return\n }\n const schema = [...slot.schema]\n for (const t of this.componentLoaders) {\n if (t.match(el as HTMLElement, schema)) {\n const result = t.read(\n el as HTMLElement,\n this.textbus,\n (childSlot, slotRootElement, slotContentHostElement = slotRootElement) => {\n return this.readSlot(childSlot, slotRootElement, slotContentHostElement)\n }\n )\n if (!result) {\n return\n }\n if (result instanceof Slot) {\n result.toDelta().forEach(i => slot.insert(i.insert, i.formats))\n return\n }\n slot.insert(result)\n return\n }\n }\n this.readFormats(el as HTMLElement, slot)\n } else if (el.nodeType === Node.TEXT_NODE) {\n this.readText(slot, el)\n }\n }\n\n private readText(slot: Slot, el: Node) {\n const textContent = el.textContent\n if (/^\\s*[\\r\\n\\u200b]+\\s*$/.test(textContent as string)) {\n return\n }\n slot.insert(textContent as string)\n }\n\n private readFormats(el: Element, slot: Slot) {\n const formats = this.formatLoaders.filter(f => {\n return f.match(el)\n }).map(f => {\n return f.read(el)\n })\n const startIndex = slot.index\n let startNode = el.firstChild\n while (startNode) {\n this.readComponent(startNode, slot)\n startNode = startNode.nextSibling\n }\n const endIndex = slot.index\n this.applyFormats(slot, formats.map<FormatItem<any>>(i => {\n return {\n formatter: i.formatter,\n value: i.value,\n startIndex,\n endIndex\n }\n }))\n slot.retain(endIndex)\n return slot\n }\n\n private readSlot<T extends Slot>(childSlot: T, slotRootElement: Element, slotContentElement: Element): T {\n if (slotRootElement.nodeType === Node.ELEMENT_NODE) {\n this.attributeLoaders.filter(a => {\n return a.match(slotRootElement)\n }).forEach(a => {\n const r = a.read(slotRootElement)\n childSlot.setAttribute(r.attribute, r.value)\n })\n }\n if (slotContentElement.nodeType === Node.ELEMENT_NODE) {\n this.readFormats(slotContentElement, childSlot)\n } else {\n this.readText(childSlot, slotContentElement)\n }\n return childSlot\n }\n\n private applyFormats(slot: Slot, formatItems: FormatItem<any>[]) {\n slot.background(() => {\n formatItems.forEach(i => {\n slot.retain(i.startIndex)\n slot.retain(i.endIndex - i.startIndex, i.formatter, i.value)\n })\n })\n }\n}\n","import { delay, filter, fromEvent, Observable, Subject, Subscription } from '@tanbo/stream'\nimport { Inject, Injectable } from '@viewfly/core'\nimport {\n NativeSelectionBridge,\n NativeSelectionConnector,\n SelectionPosition,\n Slot,\n AbstractSelection,\n RootComponentRef,\n Controller,\n Selection,\n Textbus,\n Scheduler\n} from '@textbus/core'\n\nimport { EDITOR_OPTIONS, VIEW_DOCUMENT } from './injection-tokens'\nimport { getLayoutRectByRange, Rect } from './_utils/uikit'\nimport { Input } from './types'\nimport { ViewOptions } from './browser-module'\nimport { DomAdapter } from './dom-adapter'\n\n/**\n * Textbus PC 端选区桥接实现\n */\n@Injectable()\nexport class SelectionBridge implements NativeSelectionBridge {\n onSelectionChange: Observable<Range | null>\n nativeSelection = document.getSelection()!\n\n syncSelectionFromNativeSelectionChange = true\n\n private selectionChangeEvent = new Subject<Range | null>()\n\n private subs: Subscription[] = []\n private sub: Subscription\n private connector: NativeSelectionConnector | null = null\n\n private ignoreSelectionChange = false\n\n private changeFromUser = false\n private docContainer: HTMLElement\n\n private cacheCaretPositionTimer!: any\n private oldCaretPosition!: Rect | null\n\n constructor(@Inject(EDITOR_OPTIONS) private config: ViewOptions,\n textbus: Textbus,\n controller: Controller,\n private selection: Selection,\n private rootComponentRef: RootComponentRef,\n private input: Input,\n private scheduler: Scheduler,\n private domAdapter: DomAdapter) {\n this.docContainer = textbus.get(VIEW_DOCUMENT)\n this.onSelectionChange = this.selectionChangeEvent.asObservable().pipe(filter(() => {\n return !controller.readonly\n }))\n this.sub = this.onSelectionChange.subscribe((r) => {\n if (r) {\n input.focus(r, this.changeFromUser)\n } else {\n input.blur()\n }\n })\n this.sub.add(\n fromEvent(document, 'focusin').subscribe(ev => {\n let target = ev.target as HTMLElement\n if (/^(input|textarea|select)$/i.test(target.nodeName)) {\n if (target.tagName.toLowerCase() === 'input' && /^(range|date)$/.test((target as HTMLInputElement).type)) {\n return\n }\n this.ignoreSelectionChange = true\n return\n }\n if (!config.useContentEditable) {\n while (target) {\n if (target.contentEditable === 'true') {\n this.ignoreSelectionChange = true\n return\n }\n target = target.parentNode as HTMLElement\n }\n }\n })\n )\n this.sub.add(\n fromEvent(document, 'focusout').subscribe(() => {\n this.ignoreSelectionChange = false\n })\n )\n }\n\n connect(connector: NativeSelectionConnector) {\n this.disConnect()\n this.connector = connector\n this.syncSelection(connector)\n this.listen(connector)\n }\n\n disConnect() {\n this.connector = null\n this.unListen()\n }\n\n getRect(location: SelectionPosition) {\n const { focus, anchor } = this.getPositionByRange({\n focusOffset: location.offset,\n anchorOffset: location.offset,\n focusSlot: location.slot,\n anchorSlot: location.slot\n })\n if (!focus || !anchor) {\n return null\n }\n const nativeRange = document.createRange()\n nativeRange.setStart(focus.node, focus.offset)\n nativeRange.collapse()\n return getLayoutRectByRange(nativeRange)\n }\n\n restore(abstractSelection: AbstractSelection | null, fromLocal: boolean) {\n this.changeFromUser = fromLocal\n if (this.ignoreSelectionChange || !this.connector) {\n return\n }\n this.unListen()\n if (!abstractSelection) {\n this.nativeSelection.removeAllRanges()\n this.selectionChangeEvent.next(null)\n this.listen(this.connector)\n return\n }\n\n const { focus, anchor } = this.getPositionByRange(abstractSelection)\n if (!focus || !anchor) {\n this.nativeSelection.removeAllRanges()\n this.selectionChangeEvent.next(null)\n this.listen(this.connector)\n return\n }\n\n function tryOffset(position: {node: Node, offset: number}) {\n if (!position.node) {\n return\n }\n if (position.node.nodeType === Node.TEXT_NODE) {\n const len = position.node.textContent!.length\n if (position.offset > len) {\n position.offset = len\n }\n } else if (position.node.nodeType === Node.ELEMENT_NODE) {\n const len = position.node.childNodes.length\n if (position.offset > len) {\n position.offset = len\n }\n }\n }\n\n try {\n tryOffset(focus)\n tryOffset(anchor)\n this.nativeSelection.setBaseAndExtent(anchor.node, anchor.offset, focus.node, focus.offset)\n } catch (e) {\n setTimeout(() => {\n throw e\n })\n }\n if (this.nativeSelection.rangeCount) {\n const nativeRange = this.nativeSelection.getRangeAt(0)\n this.selectionChangeEvent.next(nativeRange)\n } else {\n this.selectionChangeEvent.next(null)\n }\n\n // hack start 浏览器会触发上面选区更改事件\n const bind = () => {\n if (this.connector) {\n this.listen(this.connector)\n }\n }\n if (fromLocal) {\n Promise.resolve().then(bind)\n return\n }\n if (typeof requestIdleCallback === 'function') {\n requestIdleCallback(bind)\n } else {\n setTimeout(bind, 30)\n }\n // hack end\n }\n\n destroy() {\n this.subs.forEach(i => i.unsubscribe())\n this.sub.unsubscribe()\n }\n\n getPositionByRange(abstractSelection: AbstractSelection) {\n let focus!: {node: Node, offset: number} | null\n let anchor!: {node: Node, offset: number} | null\n try {\n focus = this.findSelectedNodeAndOffset(abstractSelection.focusSlot!, abstractSelection.focusOffset!)\n anchor = focus\n if (abstractSelection.anchorSlot !== abstractSelection.focusSlot ||\n abstractSelection.anchorOffset !== abstractSelection.focusOffset) {\n anchor = this.findSelectedNodeAndOffset(abstractSelection.anchorSlot!, abstractSelection.anchorOffset!)\n }\n return {\n focus,\n anchor\n }\n } catch (e) {\n return {\n focus: null,\n anchor: null\n }\n }\n }\n\n getPreviousLinePositionByCurrent(position: SelectionPosition): SelectionPosition | null {\n return this.getLinePosition(position, false)\n }\n\n getNextLinePositionByCurrent(position: SelectionPosition): SelectionPosition | null {\n return this.getLinePosition(position, true)\n }\n\n private getLinePosition(currentPosition: SelectionPosition, toNext: boolean): SelectionPosition | null {\n clearTimeout(this.cacheCaretPositionTimer)\n let p: SelectionPosition\n if (this.oldCaretPosition) {\n p = toNext ?\n this.getNextLinePositionByOffset(currentPosition, this.oldCaretPosition.left) :\n this.getPreviousLinePositionByOffset(currentPosition, this.oldCaretPosition.left)\n } else {\n this.oldCaretPosition = this.getRect(currentPosition)!\n p = toNext ?\n this.getNextLinePositionByOffset(currentPosition, this.oldCaretPosition.left) :\n this.getPreviousLinePositionByOffset(currentPosition, this.oldCaretPosition.left)\n }\n this.cacheCaretPositionTimer = setTimeout(() => {\n this.oldCaretPosition = null\n }, 3000)\n return p\n }\n\n /**\n * 获取选区向上移动一行的位置。\n * @param currentPosition\n * @param startLeft 参考位置。\n */\n private getPreviousLinePositionByOffset(currentPosition: SelectionPosition, startLeft: number): SelectionPosition {\n let isToPrevLine = false\n let loopCount = 0\n let minLeft = startLeft\n let focusSlot = currentPosition.slot\n let focusOffset = currentPosition.offset\n let minTop = this.getRect({\n slot: focusSlot,\n offset: focusOffset\n })!.top\n\n let position: SelectionPosition\n let oldPosition!: SelectionPosition\n let oldLeft = 0\n while (true) {\n loopCount++\n position = this.selection.getPreviousPositionByPosition(focusSlot, focusOffset)\n focusSlot = position.slot\n focusOffset = position.offset\n const rect2 = this.getRect(position)!\n if (!isToPrevLine) {\n if (rect2.left > minLeft || rect2.top + rect2.height <= minTop) {\n isToPrevLine = true\n } else if (rect2.left === minLeft && rect2.top === minTop) {\n return position\n }\n minLeft = rect2.left\n minTop = rect2.top\n // oldPosition = position\n }\n if (isToPrevLine) {\n if (rect2.left <= startLeft) {\n return position\n }\n if (oldPosition) {\n if (rect2.left >= oldLeft) {\n return oldPosition\n }\n }\n oldLeft = rect2.left\n oldPosition = position\n }\n if (loopCount > 10000) {\n break\n }\n }\n return position || {\n offset: 0,\n slot: focusSlot\n }\n }\n\n /**\n * 获取选区向下移动一行的位置。\n * @param currentPosition\n * @param startLeft 参考位置。\n */\n private getNextLinePositionByOffset(currentPosition: SelectionPosition, startLeft: number): SelectionPosition {\n let isToNextLine = false\n let loopCount = 0\n let maxRight = startLeft\n let focusSlot = currentPosition.slot\n let focusOffset = currentPosition.offset\n const rect = this.getRect({\n slot: focusSlot,\n offset: focusOffset\n })!\n let minTop = rect.top\n let oldPosition!: SelectionPosition\n let oldLeft = 0\n while (true) {\n loopCount++\n const position = this.selection.getNextPositionByPosition(focusSlot, focusOffset)\n focusSlot = position.slot\n focusOffset = position.offset\n const rect2 = this.getRect(position)!\n if (!isToNextLine) {\n if (rect2.left < maxRight || rect2.top >= minTop + rect.height) {\n isToNextLine = true\n } else if (rect2.left === maxRight && rect2.top === minTop) {\n return position\n }\n maxRight = rect2.left\n minTop = rect2.top\n oldPosition = position\n }\n if (isToNextLine) {\n if (rect2.left > startLeft) {\n return oldPosition\n }\n if (oldPosition) {\n if (rect2.left <= oldLeft) {\n return oldPosition\n }\n }\n oldPosition = position\n oldLeft = rect2.left\n }\n if (loopCount > 10000) {\n break\n }\n }\n return oldPosition || {\n offset: focusSlot.length,\n slot: focusSlot\n }\n }\n\n private unListen() {\n this.subs.forEach(i => i.unsubscribe())\n this.subs = []\n }\n\n private listen(connector: NativeSelectionConnector) {\n if (!this.config.useContentEditable) {\n const selection = this.nativeSelection\n this.subs.push(\n fromEvent<MouseEvent>(this.docContainer, 'mousedown').subscribe(ev => {\n if (this.ignoreSelectionChange || ev.button === 2) {\n return\n }\n if (!ev.shiftKey) {\n selection.removeAllRanges()\n }\n })\n )\n }\n let isUpdating = false\n this.subs.push(\n this.scheduler.onDocChange.subscribe(() => {\n isUpdating = true\n }),\n this.scheduler.onDocChanged.pipe(delay()).subscribe(() => {\n isUpdating = false\n }),\n fromEvent(document, 'selectionchange').subscribe(() => {\n if (isUpdating) {\n return\n }\n if (this.syncSelectionFromNativeSelectionChange) {\n this.syncSelection(connector)\n }\n })\n )\n }\n\n private syncSelection(connector: NativeSelectionConnector) {\n const selection = this.nativeSelection\n this.changeFromUser = true\n if (this.ignoreSelectionChange ||\n this.input.composition ||\n selection.rangeCount === 0 ||\n !this.docContainer.contains(selection.anchorNode) ||\n this.rootComponentRef.component.slots.length === 0) {\n return\n }\n const rawRange = selection.getRangeAt(0)\n const nativeRange = rawRange.cloneRange()\n const isFocusEnd = selection.focusNode === nativeRange.endContainer && selection.focusOffset === nativeRange.endOffset\n const isFocusStart = selection.focusNode === nativeRange.startContainer && selection.focusOffset === nativeRange.startOffset\n if (!this.docContainer.contains(selection.focusNode)) {\n if (isFocusEnd) {\n const nativeNode = this.domAdapter.getNativeNodeBySlot(this.rootComponentRef.component.slots.at(0)!)\n if (!nativeNode) {\n return\n }\n nativeRange.setEndAfter(nativeNode.lastChild!)\n } else {\n const nativeNode = this.domAdapter.getNativeNodeBySlot(this.rootComponentRef.component.slots.at(-1)!)\n if (!nativeNode) {\n return\n }\n nativeRange.setStartBefore(nativeNode.firstChild!)\n }\n }\n\n const startPosition = this.getCorrectedPosition(nativeRange.startContainer, nativeRange.startOffset, isFocusStart)\n const endPosition = nativeRange.collapsed ?\n startPosition :\n this.getCorrectedPosition(nativeRange.endContainer, nativeRange.endOffset, isFocusEnd)\n\n if ([Node.ELEMENT_NODE, Node.TEXT_NODE].includes(nativeRange.commonAncestorContainer?.nodeType as any) &&\n startPosition && endPosition) {\n const abstractSelection = connector.beforeChange(isFocusEnd ? {\n anchorSlot: startPosition.slot,\n anchorOffset: startPosition.offset,\n focusSlot: endPosition.slot,\n focusOffset: endPosition.offset\n } : {\n focusSlot: startPosition.slot,\n focusOffset: startPosition.offset,\n anchorSlot: endPosition.slot,\n anchorOffset: endPosition.offset\n })\n if (!abstractSelection) {\n this.selectionChangeEvent.next(null)\n connector.setSelection(null)\n return\n }\n const { focus, anchor } = this.getPositionByRange(abstractSelection)\n if (focus && anchor) {\n let start = anchor\n let end = focus\n if (isFocusStart) {\n start = focus\n end = anchor\n }\n if (nativeRange.startContainer !== start.node || nativeRange.startOffset !== start.offset) {\n nativeRange.setStart(start.node, start.offset)\n }\n if (nativeRange.endContainer !== end.node || nativeRange.endOffset !== end.offset) {\n nativeRange.setEnd(end.node, end.offset)\n }\n connector.setSelection(abstractSelection)\n if (selection.isCollapsed && (\n rawRange.startContainer !== start.node ||\n rawRange.startOffset !== start.offset ||\n rawRange.endContainer !== end.node ||\n rawRange.endOffset !== end.offset\n )) {\n rawRange.setStart(start.node, start.offset)\n rawRange.setEnd(end.node, end.offset)\n }\n this.selectionChangeEvent.next(nativeRange)\n } else {\n connector.setSelection(null)\n }\n return\n }\n connector.setSelection(null)\n }\n\n private findSelectedNodeAndOffset(slot: Slot, offset: number): {node: Node, offset: number} | null {\n const prev = slot.getContentAtIndex(offset - 1)\n const nodes = this.domAdapter.getNodesBySlot(slot)\n\n if (prev) {\n if (typeof prev !== 'string') {\n const nativeNode = this.domAdapter.getNativeNodeByComponent(prev)!\n return {\n node: nativeNode.parentNode!,\n offset: Array.from(nativeNode.parentNode!.childNodes).indexOf(nativeNode) + 1\n }\n } else if (prev === '\\n') {\n for (const node of nodes) {\n if (node instanceof Text) {\n continue\n }\n if (node.nodeName === 'BR') {\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (position.endIndex === offset) {\n const parentNode = node.parentNode!\n return {\n node: parentNode,\n offset: Array.from(parentNode.childNodes).indexOf(node as ChildNode) + 1\n }\n }\n }\n }\n }\n }\n }\n const current = slot.getContentAtIndex(offset)\n if (current && typeof current !== 'string') {\n const nativeNode = this.domAdapter.getNativeNodeByComponent(current)!\n return {\n node: nativeNode.parentNode!,\n offset: Array.from(nativeNode.parentNode!.childNodes).indexOf(nativeNode)\n }\n }\n for (const node of nodes) {\n if (node instanceof Element) {\n if (node.tagName === 'BR') {\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (position.startIndex === offset) {\n const parentNode = node.parentNode!\n return {\n node: parentNode,\n offset: Array.from(parentNode.childNodes).indexOf(node)\n }\n }\n }\n }\n continue\n }\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (offset >= position.startIndex && offset <= position.endIndex) {\n return {\n node: node,\n offset: offset - position.startIndex\n }\n }\n }\n }\n return null\n }\n\n private getCorrectedPosition(node: Node, offset: number, toAfter: boolean, excludeNodes: Node[] = []): SelectionPosition | null {\n excludeNodes.push(node)\n if (node.nodeType === Node.ELEMENT_NODE) {\n const containerPosition = this.domAdapter.getLocationByNativeNode(node)\n const childNode = node.childNodes[offset]\n if (childNode) {\n const childPosition = this.domAdapter.getLocationByNativeNode(childNode)\n if (childPosition) {\n if (containerPosition) {\n return {\n slot: childPosition.slot,\n offset: childPosition.startIndex\n }\n }\n return this.findFocusNode(childNode, toAfter, excludeNodes)\n }\n return this.findFocusNode(childNode, toAfter, excludeNodes)\n }\n const prevNode = node.childNodes[offset - 1]\n if (prevNode) {\n const prevPosition = this.domAdapter.getLocationByNativeNode(prevNode)\n if (prevPosition && containerPosition) {\n return {\n slot: prevPosition.slot,\n offset: prevPosition.endIndex\n }\n }\n }\n if (containerPosition) {\n return {\n slot: containerPosition.slot,\n offset: containerPosition.endIndex\n }\n }\n const nextNode = toAfter ? node.nextSibling : node.previousSibling\n if (nextNode) {\n return this.findFocusNode(nextNode, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n } else if (node.nodeType === Node.TEXT_NODE) {\n const containerPosition = this.domAdapter.getLocationByNativeNode(node)\n if (containerPosition) {\n return {\n slot: containerPosition.slot,\n offset: containerPosition.startIndex + offset\n }\n }\n const nextNode = toAfter ? node.nextSibling : node.previousSibling\n if (nextNode) {\n return this.findFocusNode(nextNode, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n return null\n }\n\n private findFocusNode(node: Node, toAfter = false, excludeNodes: Node[] = []): SelectionPosition | null {\n if (excludeNodes.includes(node)) {\n const next = toAfter ? node.nextSibling : node.previousSibling\n if (next) {\n return this.findFocusNode(next, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n excludeNodes.push(node)\n const position = this.domAdapter.getLocationByNativeNode(node as any)\n if (position) {\n return {\n slot: position.slot,\n offset: toAfter ? position.startIndex : position.endIndex\n }\n }\n const firstChild = toAfter ? node.firstChild : node.lastChild\n if (firstChild) {\n return this.findFocusNode(firstChild, toAfter, excludeNodes)\n }\n const nextSibling = toAfter ? node.nextSibling : node.previousSibling\n if (nextSibling) {\n return this.findFocusNode(nextSibling, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n\n private findFocusNodeByParent(node: Node, toAfter: boolean, excludeNodes: Node[]) {\n const parentNode = node.parentNode\n if (parentNode) {\n const parentPosition = this.domAdapter.getLocationByNativeNode(parentNode)\n if (parentPosition) {\n return {\n slot: parentPosition.slot,\n offset: toAfter ? parentPosition.endIndex : parentPosition.startIndex\n }\n }\n excludeNodes.push(node)\n return this.findFocusNode(parentNode, toAfter, excludeNodes)\n }\n return null\n }\n}\n","import { Observable } from '@tanbo/stream'\n\nimport { Rect } from './_utils/uikit'\n\nexport interface CaretLimit {\n top: number\n bottom: number\n}\n\nexport interface CaretPosition {\n left: number\n top: number\n height: number\n}\n\nexport interface Caret {\n onPositionChange: Observable<CaretPosition | null>\n readonly rect: Rect\n\n refresh(): void\n}\n\nexport abstract class Input {\n /**\n * @experimental\n */\n abstract composition: boolean\n /**\n * @experimental\n */\n abstract onReady: Promise<void>\n abstract caret: Caret\n abstract disabled: boolean\n\n abstract focus(nativeRange: Range, reFlash: boolean): void\n\n abstract blur(): void\n\n abstract destroy(): void\n}\n","import { distinctUntilChanged, filter, fromEvent, map, merge, Observable, Subject, Subscription } from '@tanbo/stream'\nimport { Injectable } from '@viewfly/core'\nimport {\n Commander,\n CompositionStartEventData,\n ContentType,\n Controller,\n Event,\n invokeListener,\n Keyboard,\n Scheduler,\n Selection,\n Slot,\n Textbus\n} from '@textbus/core'\n\nimport { createElement, getLayoutRectByRange } from './_utils/uikit'\nimport { Parser } from './parser'\nimport { isFirefox, isMac, isSafari, isWindows } from './_utils/env'\nimport { VIEW_MASK } from './injection-tokens'\nimport { Caret, CaretLimit, CaretPosition, Input } from './types'\nimport { DomAdapter } from './dom-adapter'\n\nconst iframeHTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Textbus</title>\n <style>\n html {position: fixed; left:0; overflow: hidden}\n html, body{height: 100%;width:100%}\n body{margin:0; overflow: hidden}\n textarea{width: 2000px;height: 100%;opacity: 0; padding: 0; outline: none; border: none; position: absolute; left:0; top:0;}\n </style>\n</head>\n<body>\n</body>\n</html>\n`\n\ninterface CaretStyle {\n height: string\n lineHeight: string\n fontSize: string\n}\n\nclass ExperimentalCaret implements Caret {\n onPositionChange: Observable<CaretPosition | null>\n onStyleChange: Observable<CaretStyle>\n elementRef: HTMLElement\n changeFromSelf = false\n\n getLimit = function (): CaretLimit {\n return {\n top: 0,\n bottom: document.documentElement.clientHeight\n }\n }\n\n get rect() {\n return this.caret.getBoundingClientRect()\n }\n\n private timer: any = null\n private caret: HTMLElement\n\n private set display(v: boolean) {\n this._display = v\n this.caret.style.visibility = v ? 'visible' : 'hidden'\n }\n\n private get display() {\n return this._display\n }\n\n private _display = true\n private flashing = true\n\n private subscription = new Subscription()\n\n private positionChangeEvent = new Subject<CaretPosition | null>()\n private styleChangeEvent = new Subject<CaretStyle>()\n private oldRange: Range | null = null\n\n constructor(\n private domRenderer: DomAdapter,\n private scheduler: Scheduler,\n private editorMask: HTMLElement) {\n this.onPositionChange = this.positionChangeEvent.pipe(distinctUntilChanged())\n this.onStyleChange = this.styleChangeEvent.asObservable()\n this.elementRef = createElement('div', {\n styles: {\n position: 'absolute',\n width: '2px',\n pointerEvents: 'none'\n },\n children: [\n this.caret = createElement('span', {\n styles: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n left: 0,\n top: 0\n }\n })\n ]\n })\n\n this.subscription.add(\n fromEvent(document, 'mousedown').subscribe(() => {\n this.flashing = false\n }),\n fromEvent(document, 'mouseup').subscribe(() => {\n this.flashing = true\n }),\n )\n this.editorMask.appendChild(this.elementRef)\n }\n\n refresh() {\n if (this.oldRange) {\n this.show(this.oldRange, false)\n }\n }\n\n show(range: Range, restart: boolean) {\n this.oldRange = range\n if (restart || this.scheduler.lastChangesHasLocalUpdate) {\n clearTimeout(this.timer)\n }\n this.updateCursorPosition(range)\n if (range.collapsed) {\n if (restart || this.scheduler.lastChangesHasLocalUpdate) {\n this.display = true\n const toggleShowHide = () => {\n this.display = !this.display || !this.flashing\n this.timer = setTimeout(toggleShowHide, 400)\n }\n clearTimeout(this.timer)\n this.timer = setTimeout(toggleShowHide, 400)\n }\n } else {\n this.display = false\n clearTimeout(this.timer)\n }\n }\n\n hide() {\n this.display = false\n clearTimeout(this.timer)\n this.positionChangeEvent.next(null)\n }\n\n destroy() {\n clearTimeout(this.timer)\n // this.caret.\n this.subscription.unsubscribe()\n }\n\n private updateCursorPosition(nativeRange: Range) {\n const startContainer = nativeRange.startContainer\n\n const node = (startContainer.nodeType === Node.ELEMENT_NODE ? startContainer : startContainer.parentNode) as HTMLElement\n if (node?.nodeType !== Node.ELEMENT_NODE) {\n this.positionChangeEvent.next(null)\n return\n }\n const compositionNode = this.domRenderer.compositionNode\n if (compositionNode) {\n nativeRange = nativeRange.cloneRange()\n nativeRange.selectNodeContents(compositionNode)\n nativeRange.collapse()\n }\n const rect = getLayoutRectByRange(nativeRange)\n const { fontSize, lineHeight, color, writingMode } = getComputedStyle(node)\n\n let height: number\n if (isNaN(+lineHeight)) {\n const f = parseFloat(lineHeight)\n if (isNaN(f)) {\n height = parseFloat(fontSize)\n } else {\n height = f\n }\n } else {\n height = parseFloat(fontSize) * parseFloat(lineHeight)\n }\n\n const boxHeight = Math.max(Math.floor(Math.max(height, rect.height)), 12)\n // const boxHeight = Math.floor(height)\n\n let rectTop = rect.top\n if (rect.height < height) {\n rectTop -= (height - rect.height) / 2\n }\n\n rectTop = Math.floor(rectTop)\n\n const containerRect = this.editorMask.getBoundingClientRect()\n\n const top = Math.floor(rectTop - containerRect.top)\n const left = Math.floor(rect.left + rect.width / 2 - containerRect.left)\n let rotate = 0\n if (nativeRange.collapsed) {\n rotate = Math.round(Math.atan2(rect.width, rect.height) * 180 / Math.PI)\n\n if (rotate !== 0) {\n const hackEle = document.createElement('span')\n // eslint-disable-next-line max-len\n hackEle.style.cssText = 'display: inline-block; width: 10px; height: 10px; position: relative; contain: layout style size; writing-mode: inherit'\n const pointEle = document.createElement('span')\n pointEle.style.cssText = 'position: absolute; left: 0; top: 0; width:0;height:0'\n hackEle.append(pointEle)\n node.append(hackEle)\n\n const p1 = pointEle.getBoundingClientRect()\n pointEle.style.right = '0'\n pointEle.style.left = ''\n const p2 = pointEle.getBoundingClientRect()\n\n const x = p1.x - p2.x\n const y = p1.y - p2.y\n\n rotate = Math.atan2(y, x) * 180 / Math.PI\n hackEle.remove()\n }\n }\n if (writingMode === 'vertical-lr' || writingMode === 'vertical-rl') {\n rotate += 90\n }\n Object.assign(this.elementRef.style, {\n left: left + 'px',\n top: top + 'px',\n height: boxHeight + 'px',\n lineHeight: boxHeight + 'px',\n fontSize,\n transform: `rotate(${rotate}deg)`,\n })\n\n this.caret.style.backgroundColor = color === 'rgba(0, 0, 0, 0)' ? '#000' : color\n this.styleChangeEvent.next({\n height: boxHeight + 'px',\n lineHeight: boxHeight + 'px',\n fontSize\n })\n this.positionChangeEvent.next({\n left,\n top: rectTop,\n height: boxHeight\n })\n\n if (this.changeFromSelf) {\n this.changeFromSelf = false\n const selfRect = this.elementRef.getBoundingClientRect()\n const scrollContainer = this.getScrollContainer(startContainer)\n const scrollRect = scrollContainer === document.documentElement ?\n { top: 0, bottom: document.documentElement.clientHeight } :\n scrollContainer.getBoundingClientRect()\n const limit = this.getLimit()\n\n const top = Math.max(limit.top, scrollRect.top)\n const bottom = Math.min(limit.bottom, scrollRect.bottom)\n\n if (selfRect.top < top) {\n scrollContainer.scrollTop -= top - selfRect.top\n } else if (selfRect.bottom > bottom) {\n scrollContainer.scrollTop += selfRect.bottom - bottom\n }\n }\n }\n\n private getScrollContainer(container: Node): Element {\n while (container) {\n if (container instanceof Element) {\n const styles = getComputedStyle(container)\n if (styles.overflow !== 'visible' || styles.overflowX !== 'visible' || styles.overflowY !== 'visible') {\n return container\n }\n }\n container = container.parentNode as Node\n }\n return document.documentElement\n }\n}\n\n\n/**\n * Textbus PC 端输入实现\n */\n@Injectable()\nexport class MagicInput extends Input {\n composition = false\n onReady: Promise<void>\n caret: ExperimentalCaret\n\n set disabled(b: boolean) {\n this._disabled = b\n if (b && this.textarea) {\n this.textarea.disabled = b\n }\n }\n\n get disabled() {\n return this._disabled\n }\n\n private isSafari = isSafari()\n private isFirefox = isFirefox()\n private isMac = isMac()\n private isWindows = isWindows()\n private _disabled = false\n private container = this.createEditableFrame()\n\n private subscription = new Subscription()\n private doc!: Document\n\n private textarea: HTMLTextAreaElement | null = null\n\n private isFocus = false\n private nativeFocus = false\n\n private ignoreComposition = false // 有 bug 版本搜狗拼音\n\n constructor(private domAdapter: DomAdapter,\n private parser: Parser,\n private keyboard: Keyboard,\n private commander: Commander,\n private selection: Selection,\n private controller: Controller,\n private scheduler: Scheduler,\n private textbus: Textbus) {\n super()\n this.caret = new ExperimentalCaret(this.domAdapter, this.scheduler, this.textbus.get(VIEW_MASK))\n this.onReady = new Promise<void>(resolve => {\n this.subscription.add(\n fromEvent(this.container, 'load').subscribe(() => {\n const doc = this.container.contentDocument!\n doc.open()\n doc.write(iframeHTML)\n doc.close()\n this.doc = doc\n this.init()\n resolve()\n }),\n controller.onReadonlyStateChange.subscribe(() => {\n if (controller.readonly) {\n this.blur()\n }\n })\n )\n })\n\n this.caret.elementRef.append(this.container)\n }\n\n focus(range: Range, restart: boolean) {\n if (!this.disabled) {\n this.caret.show(range, restart)\n }\n if (this.controller.readonly) {\n return\n }\n if (!this.isFocus) {\n this.textarea?.focus()\n setTimeout(() => {\n if (!this.nativeFocus && this.isFocus) {\n this.reInit()\n }\n })\n }\n this.isFocus = true\n }\n\n blur() {\n this.caret.hide()\n this.textarea?.blur()\n this.isFocus = false\n }\n\n destroy() {\n this.caret.destroy()\n this.subscription.unsubscribe()\n }\n\n private reInit(delay = false) {\n this.subscription.unsubscribe()\n this.textarea?.parentNode?.removeChild(this.textarea)\n this.subscription = new Subscription()\n this.init()\n if (delay) {\n setTimeout(() => {\n this.textarea?.focus()\n })\n } else {\n this.textarea?.focus()\n }\n }\n\n private init() {\n const doc = this.doc\n const contentBody = doc.body\n const textarea = doc.createElement('textarea')\n textarea.disabled = this.disabled\n contentBody.appendChild(textarea)\n this.textarea = textarea\n this.subscription.add(\n fromEvent(textarea, 'blur').subscribe(() => {\n // if (this.isFocus) {\n // this.isFocus = false\n // this.reInit(true)\n // }\n this.isFocus = false\n this.nativeFocus = false\n this.caret.hide()\n if (this.domAdapter.composition) {\n const slot = this.domAdapter.composition.slot\n this.domAdapter.composition = null\n this.domAdapter.compositionNode = null\n slot.__changeMarker__.forceMarkDirtied()\n }\n }),\n fromEvent(textarea, 'focus').subscribe(() => {\n this.nativeFocus = true\n }),\n this.caret.onStyleChange.subscribe(style => {\n Object.assign(textarea.style, style)\n })\n )\n this.handleInput(textarea)\n this.handleShortcut(textarea)\n this.handleDefaultActions(textarea)\n }\n\n private handleDefaultActions(textarea: HTMLTextAreaElement) {\n this.subscription.add(\n fromEvent<ClipboardEvent>(isFirefox() ? textarea : document, 'copy').subscribe(ev => {\n this.copyHandler(ev)\n }),\n fromEvent<ClipboardEvent>(textarea, 'paste').subscribe(ev => {\n this.pasteHandler(ev)\n })\n )\n }\n\n copyHandler(ev: ClipboardEvent) {\n const selection = this.selection\n if (!selection.isSelected) {\n return\n }\n if (selection.startSlot === selection.endSlot && selection.endOffset! - selection.startOffset! === 1) {\n const content = selection.startSlot!.getContentAtIndex(selection.startOffset!)\n if (typeof content === 'object') {\n const clipboardData = ev.clipboardData!\n const nativeSelection = document.getSelection()!\n const range = nativeSelection.getRangeAt(0)\n const div = document.createElement('div')\n const fragment = range.cloneContents()\n div.append(fragment)\n clipboardData.setData('text/html', div.innerHTML)\n clipboardData.setData('text', div.innerText)\n ev.preventDefault()\n }\n }\n }\n\n pasteHandler(ev: ClipboardEvent) {\n const text = ev.clipboardData!.getData('Text')\n\n const types = Array.from(ev.clipboardData!.types || [])\n const files = Array.from(ev.clipboardData!.files)\n if (types.every(type => type === 'Files') && files.length) {\n Promise.all(files.filter(i => {\n return /image/i.test(i.type)\n }).map(item => {\n const reader = new FileReader()\n return new Promise(resolve => {\n reader.onload = (event) => {\n resolve(event.target!.result)\n }\n reader.readAsDataURL(item)\n })\n })).then(urls => {\n const html = urls.map(i => {\n return `<img src=${i}>`\n }).join('')\n this.paste(html, text)\n })\n ev.preventDefault()\n return\n }\n\n const div = this.doc.createElement('div')\n div.style.cssText = 'width:1px; height:10px; overflow: hidden; position: fixed; left: 50%; top: 50%; opacity:0'\n div.contentEditable = 'true'\n this.doc.body.appendChild(div)\n div.focus()\n setTimeout(() => {\n this.doc.body.removeChild(div)\n div.style.cssText = ''\n this.paste(div, text)\n })\n }\n\n private paste(dom: HTMLElement | string, text: string) {\n const slot = this.parser.parse(dom, new Slot([\n ContentType.BlockComponent,\n ContentType.InlineComponent,\n ContentType.Text\n ]))\n\n this.commander.paste(slot, text)\n }\n\n private handleShortcut(textarea: HTMLTextAreaElement) {\n let isWriting = false\n let isIgnore = false\n this.subscription.add(\n fromEvent(textarea, 'compositionstart').subscribe(() => {\n isWriting = true\n }),\n fromEvent(textarea, 'compositionend').subscribe(() => {\n isWriting = false\n }),\n fromEvent<InputEvent>(textarea, 'beforeinput').subscribe(ev => {\n this.ignoreComposition = false\n if (this.isSafari) {\n if (ev.inputType === 'insertFromComposition') {\n isIgnore = true\n }\n }\n }),\n fromEvent<KeyboardEvent>(textarea, 'keydown').pipe(filter(() => {\n if (this.isSafari && isIgnore) {\n isIgnore = false\n return false\n }\n return !isWriting // || !this.textarea.value\n })).subscribe(ev => {\n this.ignoreComposition = false\n let key = ev.key\n const keys = ')!@#$%^Z&*('\n const b = key === 'Process' && /Digit\\d/.test(ev.code) && ev.shiftKey\n if (b) {\n // 大小写锁定为大写 + 全角 + shift + 数字键,还存在问题\n key = keys.charAt(+ev.code.substring(5))\n ev.preventDefault()\n }\n this.caret.changeFromSelf = true\n const is = this.keyboard.execShortcut({\n key: key,\n altKey: ev.altKey,\n shiftKey: ev.shiftKey,\n modKey: this.isMac ? ev.metaKey : ev.ctrlKey,\n agent: {\n key: ev.key,\n code: ev.code,\n keyCode: ev.keyCode,\n }\n })\n if (is) {\n this.ignoreComposition = true\n ev.preventDefault()\n } else {\n this.caret.changeFromSelf = false\n }\n })\n )\n }\n\n private handleInput(textarea: HTMLTextAreaElement) {\n let startIndex = 0\n this.subscription.add(\n fromEvent<CompositionEvent>(textarea, 'compositionstart').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(() => {\n if (!this.selection.isCollapsed) {\n this.caret.changeFromSelf = true\n this.commander.delete()\n }\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }),\n fromEvent<CompositionEvent>(textarea, 'compositionupdate').pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(distinctUntilChanged((prev, next) => {\n return prev.data !== next.data\n })).subscribe(ev => {\n if (ev.data === ' ') {\n // 处理搜狗五笔不符合 composition 事件预期,会意外跳光标的问题\n return\n }\n const startSlot = this.selection.startSlot!\n this.domAdapter.composition = {\n slot: startSlot,\n text: ev.data,\n offset: ev.data.length,\n index: startIndex\n }\n\n this.caret.changeFromSelf = true\n this.caret.refresh()\n const event = new Event(startSlot, {\n index: startIndex,\n data: ev.data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n startSlot.__changeMarker__.forceMarkDirtied()\n })\n )\n let isCompositionEnd = false\n this.subscription.add(\n merge(\n fromEvent<InputEvent>(textarea, 'beforeinput').pipe(\n filter(ev => {\n ev.preventDefault()\n if (this.isFirefox && ev.inputType === 'insertFromPaste') {\n return false\n }\n if (this.isSafari) {\n isCompositionEnd = ev.inputType === 'insertFromComposition'\n return ev.inputType === 'insertText' || ev.inputType === 'insertFromComposition'\n }\n return !ev.isComposing && !!ev.data\n }),\n map(ev => {\n return ev.data as string\n })\n ),\n this.isSafari ? new Observable<string>() : fromEvent<CompositionEvent>(textarea, 'compositionend')\n .pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(\n map(ev => {\n isCompositionEnd = true\n ev.preventDefault()\n textarea.value = ''\n return ev.data\n })\n )\n ).subscribe(text => {\n this.composition = false\n this.domAdapter.composition = null\n if (text) {\n this.caret.changeFromSelf = true\n this.commander.write(text)\n } else {\n this.selection.startSlot?.__changeMarker__.forceMarkDirtied()\n }\n if (isCompositionEnd) {\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n isCompositionEnd = false\n })\n )\n }\n\n private createEditableFrame() {\n return createElement('iframe', {\n attrs: {\n scrolling: 'no'\n },\n styles: {\n border: 'none',\n width: '100%',\n display: 'block',\n height: '100%',\n position: 'relative',\n top: this.isWindows ? '3px' : '0'\n }\n }) as HTMLIFrameElement\n }\n}\n","import { Injectable, Optional } from '@viewfly/core'\nimport { Selection, AbstractSelection, Scheduler, Textbus, SelectionPaths } from '@textbus/core'\nimport { fromEvent, Subject, Subscription } from '@tanbo/stream'\n\nimport { VIEW_CONTAINER } from './injection-tokens'\nimport { SelectionBridge } from './selection-bridge'\nimport { createElement, getLayoutRectByRange, Rect } from './_utils/uikit'\n\nexport interface SelectionRect extends Rect {\n color: string\n username: string\n}\n\nexport interface RemoteSelectionCursor {\n cursor: HTMLElement\n anchor: HTMLElement\n userTip: HTMLElement\n}\n\n/**\n * 远程光标绘制范围计算代理类,可用于定制特定场景下的远程选区绘制,如表格有选区,不会遵守常见的文档流形式\n */\nexport abstract class CollaborateSelectionAwarenessDelegate {\n abstract getRects(abstractSelection: AbstractSelection,\n nativeRange: Range,\n selectionCursor: UserSelectionCursor): false | Rect[]\n}\n\n/**\n * 协作用户虚拟光标信息\n */\nexport interface UserSelectionCursor {\n username: string\n color: string\n selection: SelectionPaths\n data?: any\n}\n\n/**\n * 协作光标绘制类\n */\n@Injectable()\nexport class CollaborateCursor {\n private host = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 1\n }\n })\n private canvasContainer = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n }\n })\n private canvas = createElement('canvas', {\n styles: {\n position: 'absolute',\n opacity: 0.5,\n left: 0,\n top: 0,\n width: '100%',\n height: document.documentElement.clientHeight + 'px',\n pointerEvents: 'none',\n }\n }) as HTMLCanvasElement\n private context = this.canvas.getContext('2d')!\n private tooltips = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n fontSize: '12px',\n zIndex: 10\n }\n })\n\n private onRectsChange = new Subject<SelectionRect[]>()\n\n private subscription = new Subscription()\n private selectionCursors: UserSelectionCursor[] = []\n private container: HTMLElement\n private ratio = window.devicePixelRatio || 1\n\n constructor(textbus: Textbus,\n private nativeSelection: SelectionBridge,\n private scheduler: Scheduler,\n private selection: Selection,\n @Optional() private awarenessDelegate?: CollaborateSelectionAwarenessDelegate) {\n this.container = textbus.get(VIEW_CONTAINER)\n this.canvasContainer.append(this.canvas)\n this.host.append(this.canvasContainer, this.tooltips)\n this.container.prepend(this.host)\n this.subscription.add(this.onRectsChange.subscribe(rects => {\n for (const rect of rects) {\n this.context.fillStyle = rect.color\n this.context.beginPath()\n this.context.rect(rect.left, rect.top, rect.width, rect.height)\n this.context.fill()\n this.context.closePath()\n }\n }), fromEvent(window, 'resize').subscribe(() => {\n this.canvas.style.height = document.documentElement.clientHeight + 'px'\n this.refresh()\n }), this.scheduler.onDocChanged.subscribe(() => {\n this.refresh()\n }))\n }\n\n /**\n * 刷新协作光标,由于 Textbus 只会绘制可视区域的光标,当可视区域发生变化时,需要重新绘制\n */\n refresh() {\n this.draw(this.selectionCursors)\n }\n\n destroy() {\n this.subscription.unsubscribe()\n }\n\n /**\n * 根据远程用户光标位置,绘制协作光标\n * @param paths\n */\n draw(paths: UserSelectionCursor[]) {\n this.selectionCursors = paths\n const containerRect = this.container.getBoundingClientRect()\n this.canvas.style.top = containerRect.top * -1 + 'px'\n this.canvas.width = this.canvas.offsetWidth * this.ratio\n this.canvas.height = this.canvas.offsetHeight * this.ratio\n this.context.scale(this.ratio, this.ratio)\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\n const users: SelectionRect[] = []\n\n paths.filter(i => {\n return i.selection.anchor.length && i.selection.focus.length\n }).forEach(item => {\n const anchorPaths = [...item.selection.anchor]\n const focusPaths = [...item.selection.focus]\n const anchorOffset = anchorPaths.pop()!\n const anchorSlot = this.selection.findSlotByPaths(anchorPaths)\n const focusOffset = focusPaths.pop()!\n const focusSlot = this.selection.findSlotByPaths(focusPaths)\n if (!anchorSlot || !focusSlot) {\n return\n }\n\n const { focus, anchor } = this.nativeSelection.getPositionByRange({\n focusOffset,\n anchorOffset,\n focusSlot,\n anchorSlot\n })\n if (!focus || !anchor) {\n return\n }\n const nativeRange = document.createRange()\n try {\n nativeRange.setStart(anchor.node, anchor.offset)\n nativeRange.setEnd(focus.node, focus.offset)\n } catch (e) {\n return\n }\n if ((anchor.node !== focus.node || anchor.offset !== focus.offset) && nativeRange.collapsed) {\n nativeRange.setStart(focus.node, focus.offset)\n nativeRange.setEnd(anchor.node, anchor.offset)\n }\n\n let rects: Rect[] | DOMRectList | false = false\n if (this.awarenessDelegate) {\n rects = this.awarenessDelegate.getRects({\n focusOffset,\n anchorOffset,\n focusSlot,\n anchorSlot\n }, nativeRange, item)\n }\n if (!rects) {\n rects = nativeRange.getClientRects()\n }\n const selectionRects: SelectionRect[] = []\n for (let i = rects.length - 1; i >= 0; i--) {\n const rect = rects[i]\n selectionRects.push({\n color: item.color,\n username: item.username,\n left: rect.left - containerRect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n })\n }\n this.onRectsChange.next(selectionRects)\n\n const cursorRange = nativeRange.cloneRange()\n cursorRange.setStart(focus.node, focus.offset)\n cursorRange.collapse(true)\n\n const cursorRect = getLayoutRectByRange(cursorRange)\n\n const rect: SelectionRect = {\n username: item.username,\n color: item.color,\n left: cursorRect.left - containerRect.left,\n top: cursorRect.top - containerRect.top,\n width: 1,\n height: cursorRect.height\n }\n if (rect.left < 0 || rect.top < 0 || rect.left > containerRect.width) {\n return\n }\n users.push(rect)\n })\n this.drawUserCursor(users)\n }\n\n protected drawUserCursor(rects: SelectionRect[]) {\n for (let i = 0; i < rects.length; i++) {\n const rect = rects[i]\n const { cursor, userTip, anchor } = this.getUserCursor(i)\n Object.assign(cursor.style, {\n left: rect.left + 'px',\n top: rect.top + 'px',\n width: rect.width + 'px',\n height: rect.height + 'px',\n background: rect.color,\n display: 'block'\n })\n anchor.style.background = rect.color\n userTip.innerText = rect.username\n userTip.style.background = rect.color\n }\n\n for (let i = rects.length; i < this.tooltips.children.length; i++) {\n this.tooltips.removeChild(this.tooltips.children[i])\n }\n }\n\n private getUserCursor(index: number): RemoteSelectionCursor {\n let child: HTMLElement = this.tooltips.children[index] as HTMLElement\n if (child) {\n const anchor = child.children[0] as HTMLElement\n return {\n cursor: child,\n anchor,\n userTip: anchor.children[0] as HTMLElement\n }\n }\n const userTip = createElement('span', {\n styles: {\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '2px',\n bottom: '100%',\n whiteSpace: 'nowrap',\n color: '#fff',\n boxShadow: '0 1px 2px rgba(0,0,0,.1)',\n opacity: 0.8,\n borderRadius: '3px',\n padding: '3px 5px',\n pointerEvents: 'none',\n }\n })\n\n const anchor = createElement('span', {\n styles: {\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n width: '5px',\n height: '5px',\n borderRadius: '50%',\n pointerEvents: 'auto',\n pointer: 'cursor',\n },\n children: [userTip]\n })\n child = createElement('span', {\n styles: {\n position: 'absolute',\n },\n children: [\n anchor\n ]\n })\n this.tooltips.append(child)\n return {\n cursor: child,\n anchor,\n userTip\n }\n }\n}\n","import { Injectable } from '@viewfly/core'\nimport {\n distinctUntilChanged,\n filter,\n fromEvent,\n map,\n merge,\n Observable,\n Subject,\n Subscription,\n} from '@tanbo/stream'\nimport {\n Commander,\n CompositionStartEventData,\n CompositionUpdateEventData,\n ContentType,\n Controller,\n Event,\n invokeListener,\n Keyboard,\n Selection,\n Slot,\n Textbus\n} from '@textbus/core'\n\nimport { Caret, CaretPosition, Input } from './types'\nimport { VIEW_DOCUMENT } from './injection-tokens'\nimport { isSafari, isMac, isMobileBrowser, isFirefox } from './_utils/env'\nimport { Parser } from './parser'\nimport { getLayoutRectByRange } from './_utils/uikit'\nimport { DomAdapter } from './dom-adapter'\n\nclass NativeCaret implements Caret {\n onPositionChange: Observable<CaretPosition | null>\n\n set nativeRange(range: Range | null) {\n this._nativeRange = range\n if (range) {\n const r = range.cloneRange()\n r.collapse(true)\n const rect = getLayoutRectByRange(r)\n this.positionChangeEvent.next({\n left: rect.left,\n top: rect.top,\n height: rect.height\n })\n } else {\n this.positionChangeEvent.next(null)\n }\n }\n\n get nativeRange() {\n return this._nativeRange\n }\n\n get rect() {\n if (this.nativeRange) {\n const range = this.nativeRange.cloneRange()\n range.collapse(true)\n return getLayoutRectByRange(range)\n }\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n }\n }\n\n private _nativeRange: Range | null = null\n private subs: Subscription[] = []\n\n private positionChangeEvent = new Subject<CaretPosition | null>()\n\n constructor() {\n this.onPositionChange = this.positionChangeEvent.pipe(distinctUntilChanged())\n }\n\n refresh() {\n //\n }\n\n destroy() {\n this.subs.forEach(i => i.unsubscribe())\n this.subs = []\n }\n}\n\n@Injectable()\nexport class NativeInput extends Input {\n caret = new NativeCaret()\n\n composition = false\n // compositionState: CompositionState | null = null\n\n onReady = Promise.resolve()\n\n set disabled(b: boolean) {\n this._disabled = b\n if (this.controller.readonly) {\n this.documentView.contentEditable = 'false'\n return\n }\n this.documentView.contentEditable = b ? 'false' : 'true'\n }\n\n get disabled() {\n return this._disabled\n }\n\n private _disabled = false\n private documentView: HTMLElement\n private nativeSelection = document.getSelection()!\n\n private subscription = new Subscription()\n private nativeRange: Range | null = null\n\n private isSafari = isSafari()\n private isMac = isMac()\n private isMobileBrowser = isMobileBrowser()\n\n private ignoreComposition = false // 有 bug 版本搜狗拼音\n\n constructor(textbus: Textbus,\n private parser: Parser,\n private selection: Selection,\n private keyboard: Keyboard,\n private domAdapter: DomAdapter,\n private commander: Commander,\n private controller: Controller) {\n super()\n this.documentView = textbus.get(VIEW_DOCUMENT)\n if (!controller.readonly) {\n this.documentView.contentEditable = 'true'\n }\n this.subscription.add(\n controller.onReadonlyStateChange.subscribe(() => {\n this.documentView.contentEditable = controller.readonly ? 'false' : 'true'\n })\n )\n this.handleShortcut(this.documentView)\n this.handleInput(this.documentView)\n this.handleDefaultActions(this.documentView)\n }\n\n focus(nativeRange: Range) {\n if (this.controller.readonly) {\n return\n }\n this.caret.nativeRange = nativeRange\n this.nativeRange = nativeRange\n }\n\n blur() {\n if (this.nativeRange && this.nativeSelection.rangeCount > 0) {\n const current = this.nativeSelection.getRangeAt(0)\n if (current === this.nativeRange) {\n this.nativeSelection.removeAllRanges()\n this.nativeRange = null\n return\n }\n }\n }\n\n destroy() {\n this.caret.destroy()\n this.subscription.unsubscribe()\n }\n\n private handleDefaultActions(textarea: HTMLElement) {\n this.subscription.add(\n fromEvent<ClipboardEvent>(isFirefox() ? textarea : document, 'copy').subscribe(ev => {\n this.copyHandler(ev)\n }),\n fromEvent<ClipboardEvent>(textarea, 'paste').subscribe(ev => {\n this.pasteHandler(ev)\n })\n )\n }\n\n copyHandler(ev: ClipboardEvent) {\n const selection = this.selection\n if (!selection.isSelected) {\n return\n }\n if (selection.startSlot === selection.endSlot && selection.endOffset! - selection.startOffset! === 1) {\n const content = selection.startSlot!.getContentAtIndex(selection.startOffset!)\n if (typeof content === 'object') {\n const clipboardData = ev.clipboardData!\n const nativeSelection = document.getSelection()!\n const range = nativeSelection.getRangeAt(0)\n const div = document.createElement('div')\n const fragment = range.cloneContents()\n div.append(fragment)\n clipboardData.setData('text/html', div.innerHTML)\n clipboardData.setData('text', div.innerText)\n ev.preventDefault()\n }\n }\n }\n\n pasteHandler(ev: ClipboardEvent) {\n const text = ev.clipboardData!.getData('Text')\n\n const types = Array.from(ev.clipboardData!.types || [])\n const files = Array.from(ev.clipboardData!.files)\n if (types.every(type => type === 'Files') && files.length) {\n Promise.all(files.filter(i => {\n return /image/i.test(i.type)\n }).map(item => {\n const reader = new FileReader()\n return new Promise(resolve => {\n reader.onload = (event) => {\n resolve(event.target!.result)\n }\n reader.readAsDataURL(item)\n })\n })).then(urls => {\n const html = urls.map(i => {\n return `<img src=${i}>`\n }).join('')\n this.paste(html, text)\n })\n ev.preventDefault()\n return\n }\n\n const div = document.createElement('div')\n div.style.cssText = 'width:1px; height:10px; overflow: hidden; position: fixed; left: 50%; top: 50%; opacity:0'\n div.contentEditable = 'true'\n document.body.appendChild(div)\n div.focus()\n setTimeout(() => {\n document.body.removeChild(div)\n div.style.cssText = ''\n this.paste(div, text)\n })\n }\n\n private paste(dom: HTMLElement | string, text: string) {\n const slot = this.parser.parse(dom, new Slot([\n ContentType.BlockComponent,\n ContentType.InlineComponent,\n ContentType.Text\n ]))\n\n this.commander.paste(slot, text)\n }\n\n private handleShortcut(input: HTMLElement) {\n let isWriting = false\n let isIgnore = false\n this.subscription.add(\n fromEvent(input, 'compositionstart').subscribe(() => {\n isWriting = true\n }),\n fromEvent(input, 'compositionend').subscribe(() => {\n isWriting = false\n }),\n fromEvent<InputEvent>(input, 'beforeinput').subscribe(ev => {\n if (this.isSafari) {\n if (ev.inputType === 'insertFromComposition') {\n isIgnore = true\n }\n }\n }),\n fromEvent<KeyboardEvent>(input, 'keydown').pipe(filter(() => {\n if (this.isSafari && isIgnore) {\n isIgnore = false\n return false\n }\n return !isWriting // || !this.textarea.value\n })).subscribe(ev => {\n this.ignoreComposition = false\n let key = ev.key\n const keys = ')!@#$%^Z&*('\n const b = key === 'Process' && /Digit\\d/.test(ev.code) && ev.shiftKey\n if (b) {\n key = keys.charAt(+ev.code.substring(5))\n ev.preventDefault()\n }\n const is = this.keyboard.execShortcut({\n key: key,\n altKey: ev.altKey,\n shiftKey: ev.shiftKey,\n modKey: this.isMac ? ev.metaKey : ev.ctrlKey,\n agent: {\n key: ev.key,\n keyCode: ev.keyCode,\n code: ev.code\n }\n })\n if (is) {\n this.ignoreComposition = true\n ev.preventDefault()\n }\n })\n )\n }\n\n private handleInput(input: HTMLElement) {\n if (this.isMobileBrowser) {\n this.handleMobileInput(input)\n } else {\n this.handlePCInput(input)\n }\n }\n\n private handleMobileInput(input: HTMLElement) {\n let isCompositionStart = true\n let startIndex: number\n const compositionStart = () => {\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }\n const compositionUpdate = (data: string) => {\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionUpdateEventData>(startSlot, {\n index: startIndex,\n data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n }\n const compositionEnd = (data: string) => {\n this.composition = false\n\n if (data) {\n this.commander.write(data)\n }\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n this.subscription.add(\n fromEvent(input, 'compositionstart').subscribe(() => {\n compositionStart()\n }),\n fromEvent<CompositionEvent>(input, 'compositionupdate').subscribe(ev => {\n compositionUpdate(ev.data)\n }),\n fromEvent<CompositionEvent>(input, 'compositionend').subscribe(ev => {\n compositionEnd(ev.data)\n const startContainer = this.nativeSelection.focusNode\n if (startContainer instanceof Text && startContainer.textContent === ev.data) {\n startContainer.remove()\n }\n }),\n fromEvent<InputEvent>(input, 'beforeinput').subscribe(ev => {\n switch (ev.inputType) {\n case 'insertText':\n if (ev.data) {\n this.commander.write(ev.data)\n ev.preventDefault()\n }\n break\n case 'insertCompositionText':\n if (isCompositionStart) {\n isCompositionStart = false\n compositionStart()\n } else {\n compositionUpdate(ev.data || '')\n }\n break\n case 'deleteCompositionText':\n this.composition = false\n break\n case 'deleteContentBackward': {\n this.composition = false\n const range = ev.getTargetRanges()[0]\n if (!range) {\n break\n }\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot\n if (startSlot) {\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n }\n break\n }\n case 'insertReplacementText': {\n this.composition = false\n const range = ev.getTargetRanges()[0]\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot!\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n const text = ev.dataTransfer?.getData('text') || ev.data || null\n if (text) {\n this.commander.write(text)\n }\n break\n }\n //\n // case 'insertFromComposition': {\n // compositionEnd(ev.data || '')\n // break\n // }\n }\n })\n )\n }\n\n private handlePCInput(input: HTMLElement) {\n let startIndex = 0\n let isCompositionEnd = false\n this.subscription.add(\n fromEvent(input, 'compositionstart').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(() => {\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }),\n fromEvent<CompositionEvent>(input, 'compositionupdate').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(ev => {\n const startSlot = this.selection.startSlot!\n const event = new Event(startSlot, {\n index: startIndex,\n data: ev.data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n }),\n merge(\n fromEvent<InputEvent>(input, 'beforeinput').pipe(\n map(ev => {\n ev.preventDefault()\n if (ev.inputType === 'insertCompositionText') {\n return null\n }\n if (ev.inputType === 'insertReplacementText') {\n const range = ev.getTargetRanges()[0]\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot!\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n return ev.dataTransfer?.getData('text') || ev.data || null\n }\n isCompositionEnd = ev.inputType === 'insertFromComposition'\n if (isCompositionEnd && this.composition) {\n return null\n }\n if (this.isSafari) {\n if (ev.inputType === 'insertText' || isCompositionEnd) {\n return ev.data\n }\n }\n if (!ev.isComposing && !!ev.data) {\n return ev.data\n }\n return null\n }),\n filter(text => {\n return text\n })\n ),\n this.isSafari ? new Observable<string>() :\n fromEvent<CompositionEvent>(input, 'compositionend').pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(\n filter(() => {\n return this.composition\n }),\n map(ev => {\n isCompositionEnd = true\n ev.preventDefault()\n return ev.data\n }),\n filter(() => {\n const b = this.ignoreComposition\n this.ignoreComposition = false\n return !b\n })\n )\n ).subscribe(text => {\n this.composition = false\n if (text) {\n const startContainer = this.nativeSelection.focusNode\n if (startContainer instanceof Text && startContainer.textContent === text) {\n startContainer.remove()\n }\n this.commander.write(text)\n }\n if (isCompositionEnd) {\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n isCompositionEnd = false\n })\n )\n }\n}\n","import { Adapter } from '@textbus/core'\nimport { Subject } from '@tanbo/stream'\n\nimport { createElement } from './_utils/uikit'\nimport { VIEW_DOCUMENT } from './injection-tokens'\n\nexport abstract class DomAdapter<\n ViewComponent extends object = object,\n ViewElement extends object = object> extends Adapter<Element, Node, ViewComponent, ViewElement> {\n onViewUpdated = new Subject<void>()\n host = createElement('div', {\n styles: {\n cursor: 'text',\n wordBreak: 'break-all',\n boxSizing: 'border-box',\n flex: 1,\n outline: 'none'\n },\n attrs: {\n 'data-textbus-view': VIEW_DOCUMENT,\n },\n props: {\n id: 'textbus-' + Number((Math.random() + '').substring(2)).toString(16)\n }\n })\n}\n","import {\n ComponentConstructor,\n Component,\n ComponentLiteral,\n FocusManager,\n makeError,\n Module,\n NativeSelectionBridge,\n Registry,\n Textbus,\n Adapter,\n} from '@textbus/core'\nimport { Provider } from '@viewfly/core'\nimport { distinctUntilChanged, map, Subject } from '@tanbo/stream'\n\nimport { AttributeLoader, ComponentLoader, FormatLoader, Parser } from './parser'\nimport { EDITOR_OPTIONS, VIEW_CONTAINER, VIEW_DOCUMENT, VIEW_MASK } from './injection-tokens'\nimport { SelectionBridge } from './selection-bridge'\nimport { Input } from './types'\nimport { MagicInput } from './magic-input'\nimport { CollaborateCursor } from './collaborate-cursor'\nimport { createElement } from './_utils/uikit'\nimport { NativeInput } from './native-input'\nimport { DomAdapter } from './dom-adapter'\n\nconst browserErrorFn = makeError('BrowserModule')\n\n/**\n * Textbus PC 端配置接口\n */\nexport interface ViewOptions {\n /** 跨平台适配器 */\n adapter: DomAdapter<any, any>\n\n /** 编辑器根节点 */\n renderTo(): HTMLElement\n\n /** 自动获取焦点 */\n autoFocus?: boolean\n /** 编辑区最小高度 */\n minHeight?: string\n /** 组件加载器 */\n componentLoaders?: ComponentLoader[]\n /** 格式加载器 */\n formatLoaders?: FormatLoader<any>[]\n /** 属性加载器 */\n attributeLoaders?: AttributeLoader<any>[]\n /** 使用 contentEditable 作为编辑器控制可编辑范围 */\n useContentEditable?: boolean\n}\n\nexport class BrowserModule implements Module {\n providers: Provider[]\n\n private workbench!: HTMLElement\n\n constructor(public config: ViewOptions) {\n const { mask, wrapper } = BrowserModule.createLayout()\n wrapper.prepend(config.adapter.host)\n if (config.minHeight) {\n config.adapter.host.style.minHeight = config.minHeight\n }\n this.providers = [{\n provide: EDITOR_OPTIONS,\n useValue: config\n }, {\n provide: VIEW_CONTAINER,\n useValue: wrapper\n }, {\n provide: VIEW_DOCUMENT,\n useValue: config.adapter.host\n }, {\n provide: VIEW_MASK,\n useValue: mask\n }, {\n provide: NativeSelectionBridge,\n useExisting: SelectionBridge\n }, {\n provide: Input,\n useClass: config.useContentEditable ? NativeInput : MagicInput\n }, {\n provide: Adapter,\n useValue: config.adapter\n }, {\n provide: DomAdapter,\n useValue: config.adapter\n }, {\n provide: FocusManager,\n useFactory: (input: Input): FocusManager => {\n const focusEvent = new Subject<void>()\n const blurEvent = new Subject<void>()\n input.caret.onPositionChange.pipe(\n map(p => !!p),\n distinctUntilChanged()\n ).subscribe(b => {\n if (b) {\n focusEvent.next()\n } else {\n blurEvent.next()\n }\n })\n return {\n onFocus: focusEvent,\n onBlur: blurEvent\n }\n },\n deps: [Input]\n },\n Parser,\n SelectionBridge,\n CollaborateCursor\n ]\n\n this.workbench = wrapper\n }\n\n /**\n * 解析 HTML 并返回一个组件实例\n * @param html 要解析的 HTML\n * @param rootComponentLoader 文档根组件加载器\n * @param textbus\n */\n readDocumentByHTML(html: string, rootComponentLoader: ComponentLoader, textbus: Textbus): Component {\n const parser = textbus.get(Parser)\n const doc = parser.parseDoc(html, rootComponentLoader)\n if (doc instanceof Component) {\n return doc\n }\n throw browserErrorFn('rootComponentLoader must return a component instance.')\n }\n\n /**\n * 将组件数据解析到组件实例中\n * @param data 要解析的 JSON 数据\n * @param rootComponent 根组件\n * @param textbus\n */\n readDocumentByComponentLiteral(data: ComponentLiteral, rootComponent: ComponentConstructor, textbus: Textbus): Component {\n const registry = textbus.get(Registry)\n return registry.createComponentByFactory(data, rootComponent)\n }\n\n async setup(textbus: Textbus) {\n const host = this.config.renderTo()\n if (!(host instanceof HTMLElement)) {\n throw browserErrorFn('view container is not a HTMLElement')\n }\n\n host.append(this.workbench)\n await textbus.get(Input).onReady\n return () => {\n this.workbench.remove()\n }\n }\n\n onAfterStartup(textbus: Textbus) {\n if (this.config.autoFocus) {\n textbus.focus()\n }\n }\n\n onDestroy(textbus: Textbus) {\n textbus.get(Input).destroy()\n textbus.get(SelectionBridge).destroy()\n textbus.get(CollaborateCursor).destroy()\n }\n\n private static createLayout() {\n const mask = createElement('div', {\n attrs: {\n 'data-textbus-view': VIEW_MASK,\n },\n styles: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n pointerEvents: 'none',\n // overflow: 'hidden'\n }\n })\n const maskWrapper = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n margin: '0 -2px',\n zIndex: 1,\n pointerEvents: 'none',\n overflow: 'hidden'\n },\n children: [mask]\n })\n const wrapper = createElement('div', {\n attrs: {\n 'data-textbus-view': VIEW_CONTAINER,\n },\n styles: {\n display: 'flex',\n minHeight: '100%',\n position: 'relative',\n flexDirection: 'column'\n },\n children: [maskWrapper]\n })\n return {\n wrapper,\n mask\n }\n }\n}\n"],"names":["rect","__decorateClass","__decorateParam","position","top","delay","anchor"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/_utils/uikit.ts","../src/_utils/env.ts","../src/injection-tokens.ts","../src/parser.ts","../src/types.ts","../src/dom-adapter.ts","../src/selection-bridge.ts","../src/magic-input.ts","../src/collaborate-cursor.ts","../src/native-input.ts","../src/browser-module.ts"],"sourcesContent":["/**\n * 选区焦点可视位置\n */\nexport interface Rect {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport interface UIElementParams {\n classes?: string[]\n attrs?: {[key: string]: any}\n props?: {[key: string]: any}\n styles?: {[key: string]: any}\n children?: (Node | null)[]\n on?: Record<string, (ev: Event) => void>\n}\n\nexport function createElement(tagName: string, options: UIElementParams = {}): HTMLElement {\n const el = document.createElement(tagName)\n if (options.classes) {\n el.classList.add(...options.classes)\n }\n if (options.attrs) {\n Object.keys(options.attrs).forEach(key => {\n el.setAttribute(key, options.attrs![key])\n })\n }\n if (options.props) {\n Object.keys(options.props).forEach(key => {\n (el as any)[key] = options.props![key]\n })\n }\n if (options.styles) {\n Object.assign(el.style, options.styles)\n }\n if (options.children) {\n options.children.filter(i => i).forEach(item => {\n el.appendChild(item as Node)\n })\n }\n if (options.on) {\n Object.keys(options.on).forEach(key => {\n el.addEventListener(key, options.on![key])\n })\n }\n return el\n}\n\nexport function getLayoutRectByRange(range: Range): Rect {\n let { startContainer, startOffset } = range\n if (startContainer.nodeType === Node.TEXT_NODE) {\n if (startOffset > 0) {\n return range.getBoundingClientRect()\n }\n const parentNode = startContainer.parentNode!\n startOffset = Array.from(parentNode.childNodes).indexOf(startContainer as any)\n startContainer = parentNode\n }\n\n const beforeNode = startContainer.childNodes[startOffset - 1]\n if (beforeNode) {\n if (beforeNode.nodeType === Node.ELEMENT_NODE && beforeNode.nodeName.toLowerCase() !== 'br') {\n const rect = (beforeNode as HTMLElement).getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n } else if (beforeNode.nodeType === Node.TEXT_NODE) {\n const range2 = document.createRange()\n range2.setStart(beforeNode, beforeNode.textContent!.length)\n range2.setEnd(beforeNode, beforeNode.textContent!.length)\n const rect = range2.getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n }\n const offsetNode = startContainer.childNodes[startOffset]\n let isInsertBefore = false\n if (!offsetNode) {\n const lastChild = startContainer.lastChild\n if (lastChild && lastChild.nodeType === Node.ELEMENT_NODE) {\n const rect = (lastChild as HTMLElement).getBoundingClientRect()\n return {\n left: rect.right,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n }\n if (offsetNode) {\n if (offsetNode.nodeType === Node.ELEMENT_NODE && offsetNode.nodeName.toLowerCase() !== 'br') {\n const rect = (offsetNode as HTMLElement).getBoundingClientRect()\n return {\n left: rect.left,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n }\n isInsertBefore = true\n }\n const span = startContainer.ownerDocument!.createElement('span')\n span.innerText = '\\u200b'\n span.style.display = 'inline-block'\n if (isInsertBefore) {\n startContainer.insertBefore(span, offsetNode)\n } else {\n startContainer.appendChild(span)\n }\n const rect = span.getBoundingClientRect()\n startContainer.removeChild(span)\n return {\n left: rect.left,\n top: rect.top,\n width: range.collapsed ? 1 : rect.width,\n height: rect.height\n }\n}\n","export const isWindows = () => /win(dows|32|64)/i.test(navigator.userAgent)\nexport const isMac = () => /mac os/i.test(navigator.userAgent)\nexport const isSafari = () => /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)\nexport const isFirefox = () => /Firefox/.test(navigator.userAgent)\n\nexport const isMobileBrowser = () => /Android|iPhone|iPad/.test(navigator.userAgent)\n","import { InjectionToken } from '@viewfly/core'\n\nimport type { ViewOptions } from './browser-module'\n\n/**\n * 编辑器可选项依赖注入 token\n */\nexport const EDITOR_OPTIONS = new InjectionToken<ViewOptions>('EDITOR_OPTIONS')\n\n/**\n * 编辑器容器依赖注入 token\n */\nexport const VIEW_CONTAINER = new InjectionToken<HTMLElement>('VIEW_CONTAINER')\n\n/**\n * 编辑器容器依赖注入 token\n */\nexport const VIEW_DOCUMENT = new InjectionToken<HTMLElement>('VIEW_DOCUMENT')\n\n/**\n * 编辑器容器遮罩层 token\n */\nexport const VIEW_MASK = new InjectionToken<HTMLElement>('VIEW_MASK')\n","import { Inject, Injectable } from '@viewfly/core'\nimport { Attribute, Component, ContentType, FormatItem, Formatter, FormatValue, Slot, Textbus } from '@textbus/core'\n\nimport { EDITOR_OPTIONS } from './injection-tokens'\nimport type { ViewOptions } from './browser-module'\n\n/**\n * 插槽解析器\n */\nexport interface SlotParser {\n /**\n * 将指定 DOM 节点解析为插槽数据\n * @param childSlot 储存数据的插槽\n * @param slotRootElement 插槽的根节点\n * @param slotContentHostElement 插槽的内容节点\n *\n * 注意:当不传入内容节点时,Textbus 会把根节点当成内容节点\n */<T extends Slot>(childSlot: T, slotRootElement: Element, slotContentHostElement?: Element): T\n}\n\n/**\n * 组件加载器\n */\nexport interface ComponentLoader {\n /** 识别组件的匹配方法 */\n match(element: Element,\n returnableContentTypes: ContentType[]): boolean\n\n /** 读取组件内容的方法 */\n read(element: Element, textbus: Textbus, slotParser: SlotParser): Component | Slot | void\n}\n\nexport interface FormatLoaderReadResult<T = FormatValue> {\n formatter: Formatter<T>\n value: T\n}\n\n/**\n * 格式加载器\n */\nexport interface FormatLoader<T = FormatValue> {\n /**\n * 匹配一个 DOM 节点是否是某个格式节点\n * @param element\n */\n match(element: Element): boolean\n\n /**\n * 读取匹配到的节点,并返回读取后的信息\n * @param element\n */\n read(element: Element): FormatLoaderReadResult<T>\n}\n\nexport interface AttributeLoaderReadResult<T = FormatValue> {\n attribute: Attribute<T>\n value: T\n}\n\n/**\n * 属性加载器\n */\nexport interface AttributeLoader<T = FormatValue> {\n /**\n * 匹配一个 DOM 节点是否是某个属性节点\n * @param element\n */\n match(element: Element): boolean\n\n /**\n * 读取匹配到的节点,并返回读取后的信息\n * @param element\n */\n read(element: Element): AttributeLoaderReadResult<T>\n}\n\n/**\n * 用于解析 HTML,并把 HTML 内容转换为 Textbus 可以支持的组件或插槽数据\n */\n@Injectable()\nexport class Parser {\n static parseHTML(html: string) {\n return new DOMParser().parseFromString(html, 'text/html').body\n }\n\n componentLoaders: ComponentLoader[]\n formatLoaders: FormatLoader<any>[]\n attributeLoaders: AttributeLoader<any>[]\n\n constructor(@Inject(EDITOR_OPTIONS) options: ViewOptions,\n private textbus: Textbus) {\n const componentLoaders = [\n ...(options.componentLoaders || [])\n ]\n const formatLoaders = [\n ...(options.formatLoaders || [])\n ]\n const attributeLoaders = [\n ...(options.attributeLoaders || [])\n ]\n // options.imports?.forEach(i => {\n // componentLoaders.push(...(i.componentLoaders || []))\n // formatLoaders.push(...(i.formatLoaders || []))\n // })\n this.componentLoaders = componentLoaders\n this.formatLoaders = formatLoaders\n this.attributeLoaders = attributeLoaders\n }\n\n /**\n * 使用指定的组件加载器解析一段 HTML 字符串或 DOM 元素\n * @param html\n * @param rootComponentLoader\n */\n parseDoc(html: string | HTMLElement, rootComponentLoader: ComponentLoader) {\n const element = typeof html === 'string' ? Parser.parseHTML(html) : html\n return rootComponentLoader.read(\n element,\n this.textbus,\n (childSlot, slotRootElement, slotContentHostElement = slotRootElement) => {\n return this.readSlot(childSlot, slotRootElement, slotContentHostElement)\n }\n )\n }\n\n /**\n * 将一段 HTML 或 DOM 元素解析到指定插槽\n * @param html\n * @param rootSlot\n */\n parse(html: string | HTMLElement, rootSlot: Slot) {\n const element = typeof html === 'string' ? Parser.parseHTML(html) : html\n return this.readFormats(element, rootSlot)\n }\n\n private readComponent(el: Node, slot: Slot) {\n if (el.nodeType === Node.ELEMENT_NODE) {\n if ((el as HTMLElement).tagName === 'BR') {\n slot.insert('\\n')\n return\n }\n const schema = [...slot.schema]\n for (const t of this.componentLoaders) {\n if (t.match(el as HTMLElement, schema)) {\n const result = t.read(\n el as HTMLElement,\n this.textbus,\n (childSlot, slotRootElement, slotContentHostElement = slotRootElement) => {\n return this.readSlot(childSlot, slotRootElement, slotContentHostElement)\n }\n )\n if (!result) {\n return\n }\n if (result instanceof Slot) {\n result.toDelta().forEach(i => slot.insert(i.insert, i.formats))\n return\n }\n slot.insert(result)\n return\n }\n }\n this.readFormats(el as HTMLElement, slot)\n } else if (el.nodeType === Node.TEXT_NODE) {\n this.readText(slot, el)\n }\n }\n\n private readText(slot: Slot, el: Node) {\n const textContent = el.textContent\n if (/^\\s*[\\r\\n\\u200b]+\\s*$/.test(textContent as string)) {\n return\n }\n slot.insert(textContent as string)\n }\n\n private readFormats(el: Element, slot: Slot) {\n const formats = this.formatLoaders.filter(f => {\n return f.match(el)\n }).map(f => {\n return f.read(el)\n })\n const startIndex = slot.index\n let startNode = el.firstChild\n while (startNode) {\n this.readComponent(startNode, slot)\n startNode = startNode.nextSibling\n }\n const endIndex = slot.index\n this.applyFormats(slot, formats.map<FormatItem<any>>(i => {\n return {\n formatter: i.formatter,\n value: i.value,\n startIndex,\n endIndex\n }\n }))\n slot.retain(endIndex)\n return slot\n }\n\n private readSlot<T extends Slot>(childSlot: T, slotRootElement: Element, slotContentElement: Element): T {\n if (slotRootElement.nodeType === Node.ELEMENT_NODE) {\n this.attributeLoaders.filter(a => {\n return a.match(slotRootElement)\n }).forEach(a => {\n const r = a.read(slotRootElement)\n childSlot.setAttribute(r.attribute, r.value)\n })\n }\n if (slotContentElement.nodeType === Node.ELEMENT_NODE) {\n this.readFormats(slotContentElement, childSlot)\n } else {\n this.readText(childSlot, slotContentElement)\n }\n return childSlot\n }\n\n private applyFormats(slot: Slot, formatItems: FormatItem<any>[]) {\n slot.background(() => {\n formatItems.forEach(i => {\n slot.retain(i.startIndex)\n slot.retain(i.endIndex - i.startIndex, i.formatter, i.value)\n })\n })\n }\n}\n","import { Observable } from '@tanbo/stream'\n\nimport { Rect } from './_utils/uikit'\n\nexport interface CaretLimit {\n top: number\n bottom: number\n}\n\nexport interface CaretPosition {\n left: number\n top: number\n height: number\n}\n\nexport interface Caret {\n onPositionChange: Observable<CaretPosition | null>\n readonly rect: Rect\n\n refresh(): void\n}\n\nexport abstract class Input {\n /**\n * @experimental\n */\n abstract composition: boolean\n /**\n * @experimental\n */\n abstract onReady: Promise<void>\n abstract caret: Caret\n abstract disabled: boolean\n\n abstract focus(nativeRange: Range, reFlash: boolean): void\n\n abstract blur(): void\n\n abstract destroy(): void\n}\n","import { Adapter } from '@textbus/core'\nimport { Subject } from '@tanbo/stream'\n\nimport { createElement } from './_utils/uikit'\nimport { VIEW_DOCUMENT } from './injection-tokens'\n\nexport abstract class DomAdapter<\n ViewComponent extends object = object,\n ViewElement extends object = object> extends Adapter<Element, Node, ViewComponent, ViewElement> {\n onViewUpdated = new Subject<void>()\n host = createElement('div', {\n styles: {\n cursor: 'text',\n wordBreak: 'break-all',\n boxSizing: 'border-box',\n flex: 1,\n outline: 'none'\n },\n attrs: {\n 'data-textbus-view': VIEW_DOCUMENT,\n },\n props: {\n id: 'textbus-' + Number((Math.random() + '').substring(2)).toString(16)\n }\n })\n}\n","import { delay, filter, fromEvent, Observable, Subject, Subscription } from '@tanbo/stream'\nimport { Inject, Injectable } from '@viewfly/core'\nimport {\n NativeSelectionBridge,\n NativeSelectionConnector,\n SelectionPosition,\n Slot,\n AbstractSelection,\n RootComponentRef,\n Controller,\n Selection,\n Textbus,\n Scheduler\n} from '@textbus/core'\n\nimport { EDITOR_OPTIONS, VIEW_DOCUMENT } from './injection-tokens'\nimport { getLayoutRectByRange, Rect } from './_utils/uikit'\nimport { Input } from './types'\nimport type { ViewOptions } from './browser-module'\nimport { DomAdapter } from './dom-adapter'\n\n/**\n * Textbus PC 端选区桥接实现\n */\n@Injectable()\nexport class SelectionBridge implements NativeSelectionBridge {\n onSelectionChange: Observable<Range | null>\n nativeSelection = document.getSelection()!\n\n syncSelectionFromNativeSelectionChange = true\n\n private selectionChangeEvent = new Subject<Range | null>()\n\n private subs: Subscription[] = []\n private sub: Subscription\n private connector: NativeSelectionConnector | null = null\n\n private ignoreSelectionChange = false\n\n private changeFromUser = false\n private docContainer: HTMLElement\n\n private cacheCaretPositionTimer!: any\n private oldCaretPosition!: Rect | null\n\n constructor(@Inject(EDITOR_OPTIONS) private config: ViewOptions,\n textbus: Textbus,\n controller: Controller,\n private selection: Selection,\n private rootComponentRef: RootComponentRef,\n private input: Input,\n private scheduler: Scheduler,\n private domAdapter: DomAdapter) {\n this.docContainer = textbus.get(VIEW_DOCUMENT)\n this.onSelectionChange = this.selectionChangeEvent.asObservable().pipe(filter(() => {\n return !controller.readonly\n }))\n this.sub = this.onSelectionChange.subscribe((r) => {\n if (r) {\n input.focus(r, this.changeFromUser)\n } else {\n input.blur()\n }\n })\n this.sub.add(\n fromEvent(document, 'focusin').subscribe(ev => {\n let target = ev.target as HTMLElement\n if (/^(input|textarea|select)$/i.test(target.nodeName)) {\n if (target.tagName.toLowerCase() === 'input' && /^(range|date)$/.test((target as HTMLInputElement).type)) {\n return\n }\n this.ignoreSelectionChange = true\n return\n }\n if (!config.useContentEditable) {\n while (target) {\n if (target.contentEditable === 'true') {\n this.ignoreSelectionChange = true\n return\n }\n target = target.parentNode as HTMLElement\n }\n }\n })\n )\n this.sub.add(\n fromEvent(document, 'focusout').subscribe(() => {\n this.ignoreSelectionChange = false\n })\n )\n }\n\n connect(connector: NativeSelectionConnector) {\n this.disConnect()\n this.connector = connector\n this.syncSelection(connector)\n this.listen(connector)\n }\n\n disConnect() {\n this.connector = null\n this.unListen()\n }\n\n getRect(location: SelectionPosition) {\n const { focus, anchor } = this.getPositionByRange({\n focusOffset: location.offset,\n anchorOffset: location.offset,\n focusSlot: location.slot,\n anchorSlot: location.slot\n })\n if (!focus || !anchor) {\n return null\n }\n const nativeRange = document.createRange()\n nativeRange.setStart(focus.node, focus.offset)\n nativeRange.collapse()\n return getLayoutRectByRange(nativeRange)\n }\n\n restore(abstractSelection: AbstractSelection | null, fromLocal: boolean) {\n this.changeFromUser = fromLocal\n if (this.ignoreSelectionChange || !this.connector) {\n return\n }\n this.unListen()\n if (!abstractSelection) {\n this.nativeSelection.removeAllRanges()\n this.selectionChangeEvent.next(null)\n this.listen(this.connector)\n return\n }\n\n const { focus, anchor } = this.getPositionByRange(abstractSelection)\n if (!focus || !anchor) {\n this.nativeSelection.removeAllRanges()\n this.selectionChangeEvent.next(null)\n this.listen(this.connector)\n return\n }\n\n function tryOffset(position: {node: Node, offset: number}) {\n if (!position.node) {\n return\n }\n if (position.node.nodeType === Node.TEXT_NODE) {\n const len = position.node.textContent!.length\n if (position.offset > len) {\n position.offset = len\n }\n } else if (position.node.nodeType === Node.ELEMENT_NODE) {\n const len = position.node.childNodes.length\n if (position.offset > len) {\n position.offset = len\n }\n }\n }\n\n try {\n tryOffset(focus)\n tryOffset(anchor)\n this.nativeSelection.setBaseAndExtent(anchor.node, anchor.offset, focus.node, focus.offset)\n } catch (e) {\n setTimeout(() => {\n throw e\n })\n }\n if (this.nativeSelection.rangeCount) {\n const nativeRange = this.nativeSelection.getRangeAt(0)\n this.selectionChangeEvent.next(nativeRange)\n } else {\n this.selectionChangeEvent.next(null)\n }\n\n // hack start 浏览器会触发上面选区更改事件\n const bind = () => {\n if (this.connector) {\n this.listen(this.connector)\n }\n }\n if (fromLocal) {\n Promise.resolve().then(bind)\n return\n }\n if (typeof requestIdleCallback === 'function') {\n requestIdleCallback(bind)\n } else {\n setTimeout(bind, 30)\n }\n // hack end\n }\n\n destroy() {\n this.subs.forEach(i => i.unsubscribe())\n this.sub.unsubscribe()\n }\n\n getPositionByRange(abstractSelection: AbstractSelection) {\n let focus!: {node: Node, offset: number} | null\n let anchor!: {node: Node, offset: number} | null\n try {\n focus = this.findSelectedNodeAndOffset(abstractSelection.focusSlot!, abstractSelection.focusOffset!)\n anchor = focus\n if (abstractSelection.anchorSlot !== abstractSelection.focusSlot ||\n abstractSelection.anchorOffset !== abstractSelection.focusOffset) {\n anchor = this.findSelectedNodeAndOffset(abstractSelection.anchorSlot!, abstractSelection.anchorOffset!)\n }\n return {\n focus,\n anchor\n }\n } catch (e) {\n return {\n focus: null,\n anchor: null\n }\n }\n }\n\n getPreviousLinePositionByCurrent(position: SelectionPosition): SelectionPosition | null {\n return this.getLinePosition(position, false)\n }\n\n getNextLinePositionByCurrent(position: SelectionPosition): SelectionPosition | null {\n return this.getLinePosition(position, true)\n }\n\n private getLinePosition(currentPosition: SelectionPosition, toNext: boolean): SelectionPosition | null {\n clearTimeout(this.cacheCaretPositionTimer)\n let p: SelectionPosition\n if (this.oldCaretPosition) {\n p = toNext ?\n this.getNextLinePositionByOffset(currentPosition, this.oldCaretPosition.left) :\n this.getPreviousLinePositionByOffset(currentPosition, this.oldCaretPosition.left)\n } else {\n this.oldCaretPosition = this.getRect(currentPosition)!\n p = toNext ?\n this.getNextLinePositionByOffset(currentPosition, this.oldCaretPosition.left) :\n this.getPreviousLinePositionByOffset(currentPosition, this.oldCaretPosition.left)\n }\n this.cacheCaretPositionTimer = setTimeout(() => {\n this.oldCaretPosition = null\n }, 3000)\n return p\n }\n\n /**\n * 获取选区向上移动一行的位置。\n * @param currentPosition\n * @param startLeft 参考位置。\n */\n private getPreviousLinePositionByOffset(currentPosition: SelectionPosition, startLeft: number): SelectionPosition {\n let isToPrevLine = false\n let loopCount = 0\n let minLeft = startLeft\n let focusSlot = currentPosition.slot\n let focusOffset = currentPosition.offset\n let minTop = this.getRect({\n slot: focusSlot,\n offset: focusOffset\n })!.top\n\n let position: SelectionPosition\n let oldPosition!: SelectionPosition\n let oldLeft = 0\n while (true) {\n loopCount++\n position = this.selection.getPreviousPositionByPosition(focusSlot, focusOffset)\n focusSlot = position.slot\n focusOffset = position.offset\n const rect2 = this.getRect(position)!\n if (!isToPrevLine) {\n if (rect2.left > minLeft || rect2.top + rect2.height <= minTop) {\n isToPrevLine = true\n } else if (rect2.left === minLeft && rect2.top === minTop) {\n return position\n }\n minLeft = rect2.left\n minTop = rect2.top\n // oldPosition = position\n }\n if (isToPrevLine) {\n if (rect2.left <= startLeft) {\n return position\n }\n if (oldPosition) {\n if (rect2.left >= oldLeft) {\n return oldPosition\n }\n }\n oldLeft = rect2.left\n oldPosition = position\n }\n if (loopCount > 10000) {\n break\n }\n }\n return position || {\n offset: 0,\n slot: focusSlot\n }\n }\n\n /**\n * 获取选区向下移动一行的位置。\n * @param currentPosition\n * @param startLeft 参考位置。\n */\n private getNextLinePositionByOffset(currentPosition: SelectionPosition, startLeft: number): SelectionPosition {\n let isToNextLine = false\n let loopCount = 0\n let maxRight = startLeft\n let focusSlot = currentPosition.slot\n let focusOffset = currentPosition.offset\n const rect = this.getRect({\n slot: focusSlot,\n offset: focusOffset\n })!\n let minTop = rect.top\n let oldPosition!: SelectionPosition\n let oldLeft = 0\n while (true) {\n loopCount++\n const position = this.selection.getNextPositionByPosition(focusSlot, focusOffset)\n focusSlot = position.slot\n focusOffset = position.offset\n const rect2 = this.getRect(position)!\n if (!isToNextLine) {\n if (rect2.left < maxRight || rect2.top >= minTop + rect.height) {\n isToNextLine = true\n } else if (rect2.left === maxRight && rect2.top === minTop) {\n return position\n }\n maxRight = rect2.left\n minTop = rect2.top\n oldPosition = position\n }\n if (isToNextLine) {\n if (rect2.left > startLeft) {\n return oldPosition\n }\n if (oldPosition) {\n if (rect2.left <= oldLeft) {\n return oldPosition\n }\n }\n oldPosition = position\n oldLeft = rect2.left\n }\n if (loopCount > 10000) {\n break\n }\n }\n return oldPosition || {\n offset: focusSlot.length,\n slot: focusSlot\n }\n }\n\n private unListen() {\n this.subs.forEach(i => i.unsubscribe())\n this.subs = []\n }\n\n private listen(connector: NativeSelectionConnector) {\n if (!this.config.useContentEditable) {\n const selection = this.nativeSelection\n this.subs.push(\n fromEvent<MouseEvent>(this.docContainer, 'mousedown').subscribe(ev => {\n if (this.ignoreSelectionChange || ev.button === 2) {\n return\n }\n if (!ev.shiftKey) {\n selection.removeAllRanges()\n }\n })\n )\n }\n let isUpdating = false\n this.subs.push(\n this.scheduler.onDocChange.subscribe(() => {\n isUpdating = true\n }),\n this.scheduler.onDocChanged.pipe(delay()).subscribe(() => {\n isUpdating = false\n }),\n fromEvent(document, 'selectionchange').subscribe(() => {\n if (isUpdating) {\n return\n }\n if (this.syncSelectionFromNativeSelectionChange) {\n this.syncSelection(connector)\n }\n })\n )\n }\n\n private syncSelection(connector: NativeSelectionConnector) {\n const selection = this.nativeSelection\n this.changeFromUser = true\n if (this.ignoreSelectionChange ||\n this.input.composition ||\n selection.rangeCount === 0 ||\n !this.docContainer.contains(selection.anchorNode) ||\n this.rootComponentRef.component.slots.length === 0) {\n return\n }\n const rawRange = selection.getRangeAt(0)\n const nativeRange = rawRange.cloneRange()\n const isFocusEnd = selection.focusNode === nativeRange.endContainer && selection.focusOffset === nativeRange.endOffset\n const isFocusStart = selection.focusNode === nativeRange.startContainer && selection.focusOffset === nativeRange.startOffset\n if (!this.docContainer.contains(selection.focusNode)) {\n if (isFocusEnd) {\n const nativeNode = this.domAdapter.getNativeNodeBySlot(this.rootComponentRef.component.slots.at(0)!)\n if (!nativeNode) {\n return\n }\n nativeRange.setEndAfter(nativeNode.lastChild!)\n } else {\n const nativeNode = this.domAdapter.getNativeNodeBySlot(this.rootComponentRef.component.slots.at(-1)!)\n if (!nativeNode) {\n return\n }\n nativeRange.setStartBefore(nativeNode.firstChild!)\n }\n }\n\n const startPosition = this.getCorrectedPosition(nativeRange.startContainer, nativeRange.startOffset, isFocusStart)\n const endPosition = nativeRange.collapsed ?\n startPosition :\n this.getCorrectedPosition(nativeRange.endContainer, nativeRange.endOffset, isFocusEnd)\n\n if ([Node.ELEMENT_NODE, Node.TEXT_NODE].includes(nativeRange.commonAncestorContainer?.nodeType as any) &&\n startPosition && endPosition) {\n const abstractSelection = connector.beforeChange(isFocusEnd ? {\n anchorSlot: startPosition.slot,\n anchorOffset: startPosition.offset,\n focusSlot: endPosition.slot,\n focusOffset: endPosition.offset\n } : {\n focusSlot: startPosition.slot,\n focusOffset: startPosition.offset,\n anchorSlot: endPosition.slot,\n anchorOffset: endPosition.offset\n })\n if (!abstractSelection) {\n this.selectionChangeEvent.next(null)\n connector.setSelection(null)\n return\n }\n const { focus, anchor } = this.getPositionByRange(abstractSelection)\n if (focus && anchor) {\n let start = anchor\n let end = focus\n if (isFocusStart) {\n start = focus\n end = anchor\n }\n if (nativeRange.startContainer !== start.node || nativeRange.startOffset !== start.offset) {\n nativeRange.setStart(start.node, start.offset)\n }\n if (nativeRange.endContainer !== end.node || nativeRange.endOffset !== end.offset) {\n nativeRange.setEnd(end.node, end.offset)\n }\n connector.setSelection(abstractSelection)\n if (selection.isCollapsed && (\n rawRange.startContainer !== start.node ||\n rawRange.startOffset !== start.offset ||\n rawRange.endContainer !== end.node ||\n rawRange.endOffset !== end.offset\n )) {\n rawRange.setStart(start.node, start.offset)\n rawRange.setEnd(end.node, end.offset)\n }\n this.selectionChangeEvent.next(nativeRange)\n } else {\n connector.setSelection(null)\n }\n return\n }\n connector.setSelection(null)\n }\n\n private findSelectedNodeAndOffset(slot: Slot, offset: number): {node: Node, offset: number} | null {\n const prev = slot.getContentAtIndex(offset - 1)\n const nodes = this.domAdapter.getNodesBySlot(slot)\n\n if (prev) {\n if (typeof prev !== 'string') {\n const nativeNode = this.domAdapter.getNativeNodeByComponent(prev)!\n return {\n node: nativeNode.parentNode!,\n offset: Array.from(nativeNode.parentNode!.childNodes).indexOf(nativeNode) + 1\n }\n } else if (prev === '\\n') {\n for (const node of nodes) {\n if (node instanceof Text) {\n continue\n }\n if (node.nodeName === 'BR') {\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (position.endIndex === offset) {\n const parentNode = node.parentNode!\n return {\n node: parentNode,\n offset: Array.from(parentNode.childNodes).indexOf(node as ChildNode) + 1\n }\n }\n }\n }\n }\n }\n }\n const current = slot.getContentAtIndex(offset)\n if (current && typeof current !== 'string') {\n const nativeNode = this.domAdapter.getNativeNodeByComponent(current)!\n return {\n node: nativeNode.parentNode!,\n offset: Array.from(nativeNode.parentNode!.childNodes).indexOf(nativeNode)\n }\n }\n for (const node of nodes) {\n if (node instanceof Element) {\n if (node.tagName === 'BR') {\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (position.startIndex === offset) {\n const parentNode = node.parentNode!\n return {\n node: parentNode,\n offset: Array.from(parentNode.childNodes).indexOf(node)\n }\n }\n }\n }\n continue\n }\n const position = this.domAdapter.getLocationByNativeNode(node)\n if (position) {\n if (offset >= position.startIndex && offset <= position.endIndex) {\n return {\n node: node,\n offset: offset - position.startIndex\n }\n }\n }\n }\n return null\n }\n\n private getCorrectedPosition(node: Node, offset: number, toAfter: boolean, excludeNodes: Node[] = []): SelectionPosition | null {\n excludeNodes.push(node)\n if (node.nodeType === Node.ELEMENT_NODE) {\n const containerPosition = this.domAdapter.getLocationByNativeNode(node)\n const childNode = node.childNodes[offset]\n if (childNode) {\n const childPosition = this.domAdapter.getLocationByNativeNode(childNode)\n if (childPosition) {\n if (containerPosition) {\n return {\n slot: childPosition.slot,\n offset: childPosition.startIndex\n }\n }\n return this.findFocusNode(childNode, toAfter, excludeNodes)\n }\n return this.findFocusNode(childNode, toAfter, excludeNodes)\n }\n const prevNode = node.childNodes[offset - 1]\n if (prevNode) {\n const prevPosition = this.domAdapter.getLocationByNativeNode(prevNode)\n if (prevPosition && containerPosition) {\n return {\n slot: prevPosition.slot,\n offset: prevPosition.endIndex\n }\n }\n }\n if (containerPosition) {\n return {\n slot: containerPosition.slot,\n offset: containerPosition.endIndex\n }\n }\n const nextNode = toAfter ? node.nextSibling : node.previousSibling\n if (nextNode) {\n return this.findFocusNode(nextNode, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n } else if (node.nodeType === Node.TEXT_NODE) {\n const containerPosition = this.domAdapter.getLocationByNativeNode(node)\n if (containerPosition) {\n return {\n slot: containerPosition.slot,\n offset: containerPosition.startIndex + offset\n }\n }\n const nextNode = toAfter ? node.nextSibling : node.previousSibling\n if (nextNode) {\n return this.findFocusNode(nextNode, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n return null\n }\n\n private findFocusNode(node: Node, toAfter = false, excludeNodes: Node[] = []): SelectionPosition | null {\n if (excludeNodes.includes(node)) {\n const next = toAfter ? node.nextSibling : node.previousSibling\n if (next) {\n return this.findFocusNode(next, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n excludeNodes.push(node)\n const position = this.domAdapter.getLocationByNativeNode(node as any)\n if (position) {\n return {\n slot: position.slot,\n offset: toAfter ? position.startIndex : position.endIndex\n }\n }\n const firstChild = toAfter ? node.firstChild : node.lastChild\n if (firstChild) {\n return this.findFocusNode(firstChild, toAfter, excludeNodes)\n }\n const nextSibling = toAfter ? node.nextSibling : node.previousSibling\n if (nextSibling) {\n return this.findFocusNode(nextSibling, toAfter, excludeNodes)\n }\n return this.findFocusNodeByParent(node, toAfter, excludeNodes)\n }\n\n private findFocusNodeByParent(node: Node, toAfter: boolean, excludeNodes: Node[]) {\n const parentNode = node.parentNode\n if (parentNode) {\n const parentPosition = this.domAdapter.getLocationByNativeNode(parentNode)\n if (parentPosition) {\n return {\n slot: parentPosition.slot,\n offset: toAfter ? parentPosition.endIndex : parentPosition.startIndex\n }\n }\n excludeNodes.push(node)\n return this.findFocusNode(parentNode, toAfter, excludeNodes)\n }\n return null\n }\n}\n","import { distinctUntilChanged, filter, fromEvent, map, merge, Observable, Subject, Subscription } from '@tanbo/stream'\nimport { Injectable } from '@viewfly/core'\nimport {\n Commander,\n CompositionStartEventData,\n ContentType,\n Controller,\n Event,\n invokeListener,\n Keyboard,\n Scheduler,\n Selection,\n Slot,\n Textbus\n} from '@textbus/core'\n\nimport { createElement, getLayoutRectByRange } from './_utils/uikit'\nimport { Parser } from './parser'\nimport { isFirefox, isMac, isSafari, isWindows } from './_utils/env'\nimport { VIEW_MASK } from './injection-tokens'\nimport { Caret, CaretLimit, CaretPosition, Input } from './types'\nimport { DomAdapter } from './dom-adapter'\n\nconst iframeHTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Textbus</title>\n <style>\n html {position: fixed; left:0; overflow: hidden}\n html, body{height: 100%;width:100%}\n body{margin:0; overflow: hidden}\n textarea{width: 2000px;height: 100%;opacity: 0; padding: 0; outline: none; border: none; position: absolute; left:0; top:0;}\n </style>\n</head>\n<body>\n</body>\n</html>\n`\n\ninterface CaretStyle {\n height: string\n lineHeight: string\n fontSize: string\n}\n\nclass ExperimentalCaret implements Caret {\n onPositionChange: Observable<CaretPosition | null>\n onStyleChange: Observable<CaretStyle>\n elementRef: HTMLElement\n changeFromSelf = false\n\n getLimit = function (): CaretLimit {\n return {\n top: 0,\n bottom: document.documentElement.clientHeight\n }\n }\n\n get rect() {\n return this.caret.getBoundingClientRect()\n }\n\n private timer: any = null\n private caret: HTMLElement\n\n private set display(v: boolean) {\n this._display = v\n this.caret.style.visibility = v ? 'visible' : 'hidden'\n }\n\n private get display() {\n return this._display\n }\n\n private _display = true\n private flashing = true\n\n private subscription = new Subscription()\n\n private positionChangeEvent = new Subject<CaretPosition | null>()\n private styleChangeEvent = new Subject<CaretStyle>()\n private oldRange: Range | null = null\n\n constructor(\n private domRenderer: DomAdapter,\n private scheduler: Scheduler,\n private editorMask: HTMLElement) {\n this.onPositionChange = this.positionChangeEvent.pipe(distinctUntilChanged())\n this.onStyleChange = this.styleChangeEvent.asObservable()\n this.elementRef = createElement('div', {\n styles: {\n position: 'absolute',\n width: '2px',\n pointerEvents: 'none'\n },\n children: [\n this.caret = createElement('span', {\n styles: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n left: 0,\n top: 0\n }\n })\n ]\n })\n\n this.subscription.add(\n fromEvent(document, 'mousedown').subscribe(() => {\n this.flashing = false\n }),\n fromEvent(document, 'mouseup').subscribe(() => {\n this.flashing = true\n }),\n )\n this.editorMask.appendChild(this.elementRef)\n }\n\n refresh() {\n if (this.oldRange) {\n this.show(this.oldRange, false)\n }\n }\n\n show(range: Range, restart: boolean) {\n this.oldRange = range\n if (restart || this.scheduler.lastChangesHasLocalUpdate) {\n clearTimeout(this.timer)\n }\n this.updateCursorPosition(range)\n if (range.collapsed) {\n if (restart || this.scheduler.lastChangesHasLocalUpdate) {\n this.display = true\n const toggleShowHide = () => {\n this.display = !this.display || !this.flashing\n this.timer = setTimeout(toggleShowHide, 400)\n }\n clearTimeout(this.timer)\n this.timer = setTimeout(toggleShowHide, 400)\n }\n } else {\n this.display = false\n clearTimeout(this.timer)\n }\n }\n\n hide() {\n this.display = false\n clearTimeout(this.timer)\n this.positionChangeEvent.next(null)\n }\n\n destroy() {\n clearTimeout(this.timer)\n // this.caret.\n this.subscription.unsubscribe()\n }\n\n private updateCursorPosition(nativeRange: Range) {\n const startContainer = nativeRange.startContainer\n\n const node = (startContainer.nodeType === Node.ELEMENT_NODE ? startContainer : startContainer.parentNode) as HTMLElement\n if (node?.nodeType !== Node.ELEMENT_NODE) {\n this.positionChangeEvent.next(null)\n return\n }\n const compositionNode = this.domRenderer.compositionNode\n if (compositionNode) {\n nativeRange = nativeRange.cloneRange()\n nativeRange.selectNodeContents(compositionNode)\n nativeRange.collapse()\n }\n const rect = getLayoutRectByRange(nativeRange)\n const { fontSize, lineHeight, color, writingMode } = getComputedStyle(node)\n\n let height: number\n if (isNaN(+lineHeight)) {\n const f = parseFloat(lineHeight)\n if (isNaN(f)) {\n height = parseFloat(fontSize)\n } else {\n height = f\n }\n } else {\n height = parseFloat(fontSize) * parseFloat(lineHeight)\n }\n\n const boxHeight = Math.max(Math.floor(Math.max(height, rect.height)), 12)\n // const boxHeight = Math.floor(height)\n\n let rectTop = rect.top\n if (rect.height < height) {\n rectTop -= (height - rect.height) / 2\n }\n\n rectTop = Math.floor(rectTop)\n\n const containerRect = this.editorMask.getBoundingClientRect()\n\n const top = Math.floor(rectTop - containerRect.top)\n const left = Math.floor(rect.left + rect.width / 2 - containerRect.left)\n let rotate = 0\n if (nativeRange.collapsed) {\n rotate = Math.round(Math.atan2(rect.width, rect.height) * 180 / Math.PI)\n\n if (rotate !== 0) {\n const hackEle = document.createElement('span')\n // eslint-disable-next-line max-len\n hackEle.style.cssText = 'display: inline-block; width: 10px; height: 10px; position: relative; contain: layout style size; writing-mode: inherit'\n const pointEle = document.createElement('span')\n pointEle.style.cssText = 'position: absolute; left: 0; top: 0; width:0;height:0'\n hackEle.append(pointEle)\n node.append(hackEle)\n\n const p1 = pointEle.getBoundingClientRect()\n pointEle.style.right = '0'\n pointEle.style.left = ''\n const p2 = pointEle.getBoundingClientRect()\n\n const x = p1.x - p2.x\n const y = p1.y - p2.y\n\n rotate = Math.atan2(y, x) * 180 / Math.PI\n hackEle.remove()\n }\n }\n if (writingMode === 'vertical-lr' || writingMode === 'vertical-rl') {\n rotate += 90\n }\n Object.assign(this.elementRef.style, {\n left: left + 'px',\n top: top + 'px',\n height: boxHeight + 'px',\n lineHeight: boxHeight + 'px',\n fontSize,\n transform: `rotate(${rotate}deg)`,\n })\n\n this.caret.style.backgroundColor = color === 'rgba(0, 0, 0, 0)' ? '#000' : color\n this.styleChangeEvent.next({\n height: boxHeight + 'px',\n lineHeight: boxHeight + 'px',\n fontSize\n })\n this.positionChangeEvent.next({\n left,\n top: rectTop,\n height: boxHeight\n })\n\n if (this.changeFromSelf) {\n this.changeFromSelf = false\n const selfRect = this.elementRef.getBoundingClientRect()\n const scrollContainer = this.getScrollContainer(startContainer)\n const scrollRect = scrollContainer === document.documentElement ?\n { top: 0, bottom: document.documentElement.clientHeight } :\n scrollContainer.getBoundingClientRect()\n const limit = this.getLimit()\n\n const top = Math.max(limit.top, scrollRect.top)\n const bottom = Math.min(limit.bottom, scrollRect.bottom)\n\n if (selfRect.top < top) {\n scrollContainer.scrollTop -= top - selfRect.top\n } else if (selfRect.bottom > bottom) {\n scrollContainer.scrollTop += selfRect.bottom - bottom\n }\n }\n }\n\n private getScrollContainer(container: Node): Element {\n while (container) {\n if (container instanceof Element) {\n const styles = getComputedStyle(container)\n if (styles.overflow !== 'visible' || styles.overflowX !== 'visible' || styles.overflowY !== 'visible') {\n return container\n }\n }\n container = container.parentNode as Node\n }\n return document.documentElement\n }\n}\n\n\n/**\n * Textbus PC 端输入实现\n */\n@Injectable()\nexport class MagicInput extends Input {\n composition = false\n onReady: Promise<void>\n caret: ExperimentalCaret\n\n set disabled(b: boolean) {\n this._disabled = b\n if (b && this.textarea) {\n this.textarea.disabled = b\n }\n }\n\n get disabled() {\n return this._disabled\n }\n\n private isSafari = isSafari()\n private isFirefox = isFirefox()\n private isMac = isMac()\n private isWindows = isWindows()\n private _disabled = false\n private container = this.createEditableFrame()\n\n private subscription = new Subscription()\n private doc!: Document\n\n private textarea: HTMLTextAreaElement | null = null\n\n private isFocus = false\n private nativeFocus = false\n\n private ignoreComposition = false // 有 bug 版本搜狗拼音\n\n constructor(private domAdapter: DomAdapter,\n private parser: Parser,\n private keyboard: Keyboard,\n private commander: Commander,\n private selection: Selection,\n private controller: Controller,\n private scheduler: Scheduler,\n private textbus: Textbus) {\n super()\n this.caret = new ExperimentalCaret(this.domAdapter, this.scheduler, this.textbus.get(VIEW_MASK))\n this.onReady = new Promise<void>(resolve => {\n this.subscription.add(\n fromEvent(this.container, 'load').subscribe(() => {\n const doc = this.container.contentDocument!\n doc.open()\n doc.write(iframeHTML)\n doc.close()\n this.doc = doc\n this.init()\n resolve()\n }),\n controller.onReadonlyStateChange.subscribe(() => {\n if (controller.readonly) {\n this.blur()\n }\n })\n )\n })\n\n this.caret.elementRef.append(this.container)\n }\n\n focus(range: Range, restart: boolean) {\n if (!this.disabled) {\n this.caret.show(range, restart)\n }\n if (this.controller.readonly) {\n return\n }\n if (!this.isFocus) {\n this.textarea?.focus()\n setTimeout(() => {\n if (!this.nativeFocus && this.isFocus) {\n this.reInit()\n }\n })\n }\n this.isFocus = true\n }\n\n blur() {\n this.caret.hide()\n this.textarea?.blur()\n this.isFocus = false\n }\n\n destroy() {\n this.caret.destroy()\n this.subscription.unsubscribe()\n }\n\n private reInit(delay = false) {\n this.subscription.unsubscribe()\n this.textarea?.parentNode?.removeChild(this.textarea)\n this.subscription = new Subscription()\n this.init()\n if (delay) {\n setTimeout(() => {\n this.textarea?.focus()\n })\n } else {\n this.textarea?.focus()\n }\n }\n\n private init() {\n const doc = this.doc\n const contentBody = doc.body\n const textarea = doc.createElement('textarea')\n textarea.disabled = this.disabled\n contentBody.appendChild(textarea)\n this.textarea = textarea\n this.subscription.add(\n fromEvent(textarea, 'blur').subscribe(() => {\n // if (this.isFocus) {\n // this.isFocus = false\n // this.reInit(true)\n // }\n this.isFocus = false\n this.nativeFocus = false\n this.caret.hide()\n if (this.domAdapter.composition) {\n const slot = this.domAdapter.composition.slot\n this.domAdapter.composition = null\n this.domAdapter.compositionNode = null\n slot.__changeMarker__.forceMarkDirtied()\n }\n }),\n fromEvent(textarea, 'focus').subscribe(() => {\n this.nativeFocus = true\n }),\n this.caret.onStyleChange.subscribe(style => {\n Object.assign(textarea.style, style)\n })\n )\n this.handleInput(textarea)\n this.handleShortcut(textarea)\n this.handleDefaultActions(textarea)\n }\n\n private handleDefaultActions(textarea: HTMLTextAreaElement) {\n this.subscription.add(\n fromEvent<ClipboardEvent>(isFirefox() ? textarea : document, 'copy').subscribe(ev => {\n this.copyHandler(ev)\n }),\n fromEvent<ClipboardEvent>(textarea, 'paste').subscribe(ev => {\n this.pasteHandler(ev)\n })\n )\n }\n\n copyHandler(ev: ClipboardEvent) {\n const selection = this.selection\n if (!selection.isSelected) {\n return\n }\n if (selection.startSlot === selection.endSlot && selection.endOffset! - selection.startOffset! === 1) {\n const content = selection.startSlot!.getContentAtIndex(selection.startOffset!)\n if (typeof content === 'object') {\n const clipboardData = ev.clipboardData!\n const nativeSelection = document.getSelection()!\n const range = nativeSelection.getRangeAt(0)\n const div = document.createElement('div')\n const fragment = range.cloneContents()\n div.append(fragment)\n clipboardData.setData('text/html', div.innerHTML)\n clipboardData.setData('text', div.innerText)\n ev.preventDefault()\n }\n }\n }\n\n pasteHandler(ev: ClipboardEvent) {\n const text = ev.clipboardData!.getData('Text')\n\n const types = Array.from(ev.clipboardData!.types || [])\n const files = Array.from(ev.clipboardData!.files)\n if (types.every(type => type === 'Files') && files.length) {\n Promise.all(files.filter(i => {\n return /image/i.test(i.type)\n }).map(item => {\n const reader = new FileReader()\n return new Promise(resolve => {\n reader.onload = (event) => {\n resolve(event.target!.result)\n }\n reader.readAsDataURL(item)\n })\n })).then(urls => {\n const html = urls.map(i => {\n return `<img src=${i}>`\n }).join('')\n this.paste(html, text)\n })\n ev.preventDefault()\n return\n }\n\n const div = this.doc.createElement('div')\n div.style.cssText = 'width:1px; height:10px; overflow: hidden; position: fixed; left: 50%; top: 50%; opacity:0'\n div.contentEditable = 'true'\n this.doc.body.appendChild(div)\n div.focus()\n setTimeout(() => {\n this.doc.body.removeChild(div)\n div.style.cssText = ''\n this.paste(div, text)\n })\n }\n\n private paste(dom: HTMLElement | string, text: string) {\n const slot = this.parser.parse(dom, new Slot([\n ContentType.BlockComponent,\n ContentType.InlineComponent,\n ContentType.Text\n ]))\n\n this.commander.paste(slot, text)\n }\n\n private handleShortcut(textarea: HTMLTextAreaElement) {\n let isWriting = false\n let isIgnore = false\n this.subscription.add(\n fromEvent(textarea, 'compositionstart').subscribe(() => {\n isWriting = true\n }),\n fromEvent(textarea, 'compositionend').subscribe(() => {\n isWriting = false\n }),\n fromEvent<InputEvent>(textarea, 'beforeinput').subscribe(ev => {\n this.ignoreComposition = false\n if (this.isSafari) {\n if (ev.inputType === 'insertFromComposition') {\n isIgnore = true\n }\n }\n }),\n fromEvent<KeyboardEvent>(textarea, 'keydown').pipe(filter(() => {\n if (this.isSafari && isIgnore) {\n isIgnore = false\n return false\n }\n return !isWriting // || !this.textarea.value\n })).subscribe(ev => {\n this.ignoreComposition = false\n let key = ev.key\n const keys = ')!@#$%^Z&*('\n const b = key === 'Process' && /Digit\\d/.test(ev.code) && ev.shiftKey\n if (b) {\n // 大小写锁定为大写 + 全角 + shift + 数字键,还存在问题\n key = keys.charAt(+ev.code.substring(5))\n ev.preventDefault()\n }\n this.caret.changeFromSelf = true\n const is = this.keyboard.execShortcut({\n key: key,\n altKey: ev.altKey,\n shiftKey: ev.shiftKey,\n modKey: this.isMac ? ev.metaKey : ev.ctrlKey,\n agent: {\n key: ev.key,\n code: ev.code,\n keyCode: ev.keyCode,\n }\n })\n if (is) {\n this.ignoreComposition = true\n ev.preventDefault()\n } else {\n this.caret.changeFromSelf = false\n }\n })\n )\n }\n\n private handleInput(textarea: HTMLTextAreaElement) {\n let startIndex = 0\n this.subscription.add(\n fromEvent<CompositionEvent>(textarea, 'compositionstart').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(() => {\n if (!this.selection.isCollapsed) {\n this.caret.changeFromSelf = true\n this.commander.delete()\n }\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }),\n fromEvent<CompositionEvent>(textarea, 'compositionupdate').pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(distinctUntilChanged((prev, next) => {\n return prev.data !== next.data\n })).subscribe(ev => {\n if (ev.data === ' ') {\n // 处理搜狗五笔不符合 composition 事件预期,会意外跳光标的问题\n return\n }\n const startSlot = this.selection.startSlot!\n this.domAdapter.composition = {\n slot: startSlot,\n text: ev.data,\n offset: ev.data.length,\n index: startIndex\n }\n\n this.caret.changeFromSelf = true\n this.caret.refresh()\n const event = new Event(startSlot, {\n index: startIndex,\n data: ev.data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n startSlot.__changeMarker__.forceMarkDirtied()\n })\n )\n let isCompositionEnd = false\n this.subscription.add(\n merge(\n fromEvent<InputEvent>(textarea, 'beforeinput').pipe(\n filter(ev => {\n ev.preventDefault()\n if (this.isFirefox && ev.inputType === 'insertFromPaste') {\n return false\n }\n if (this.isSafari) {\n isCompositionEnd = ev.inputType === 'insertFromComposition'\n return ev.inputType === 'insertText' || ev.inputType === 'insertFromComposition'\n }\n return !ev.isComposing && !!ev.data\n }),\n map(ev => {\n return ev.data as string\n })\n ),\n this.isSafari ? new Observable<string>() : fromEvent<CompositionEvent>(textarea, 'compositionend')\n .pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(\n map(ev => {\n isCompositionEnd = true\n ev.preventDefault()\n textarea.value = ''\n return ev.data\n })\n )\n ).subscribe(text => {\n this.composition = false\n this.domAdapter.composition = null\n if (text) {\n this.caret.changeFromSelf = true\n this.commander.write(text)\n } else {\n this.selection.startSlot?.__changeMarker__.forceMarkDirtied()\n }\n if (isCompositionEnd) {\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n isCompositionEnd = false\n })\n )\n }\n\n private createEditableFrame() {\n return createElement('iframe', {\n attrs: {\n scrolling: 'no'\n },\n styles: {\n border: 'none',\n width: '100%',\n display: 'block',\n height: '100%',\n position: 'relative',\n top: this.isWindows ? '3px' : '0'\n }\n }) as HTMLIFrameElement\n }\n}\n","import { Injectable, Optional } from '@viewfly/core'\nimport { Selection, AbstractSelection, Scheduler, Textbus, SelectionPaths } from '@textbus/core'\nimport { fromEvent, Subject, Subscription } from '@tanbo/stream'\n\nimport { VIEW_CONTAINER } from './injection-tokens'\nimport { SelectionBridge } from './selection-bridge'\nimport { createElement, getLayoutRectByRange, Rect } from './_utils/uikit'\n\nexport interface SelectionRect extends Rect {\n color: string\n username: string\n}\n\nexport interface RemoteSelectionCursor {\n cursor: HTMLElement\n anchor: HTMLElement\n userTip: HTMLElement\n}\n\n/**\n * 远程光标绘制范围计算代理类,可用于定制特定场景下的远程选区绘制,如表格有选区,不会遵守常见的文档流形式\n */\nexport abstract class CollaborateSelectionAwarenessDelegate {\n abstract getRects(abstractSelection: AbstractSelection,\n nativeRange: Range,\n selectionCursor: UserSelectionCursor): false | Rect[]\n}\n\n/**\n * 协作用户虚拟光标信息\n */\nexport interface UserSelectionCursor {\n username: string\n color: string\n selection: SelectionPaths\n data?: any\n}\n\n/**\n * 协作光标绘制类\n */\n@Injectable()\nexport class CollaborateCursor {\n private host = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 1\n }\n })\n private canvasContainer = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n }\n })\n private canvas = createElement('canvas', {\n styles: {\n position: 'absolute',\n opacity: 0.5,\n left: 0,\n top: 0,\n width: '100%',\n height: document.documentElement.clientHeight + 'px',\n pointerEvents: 'none',\n }\n }) as HTMLCanvasElement\n private context = this.canvas.getContext('2d')!\n private tooltips = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n fontSize: '12px',\n zIndex: 10\n }\n })\n\n private onRectsChange = new Subject<SelectionRect[]>()\n\n private subscription = new Subscription()\n private selectionCursors: UserSelectionCursor[] = []\n private container: HTMLElement\n private ratio = window.devicePixelRatio || 1\n\n constructor(textbus: Textbus,\n private nativeSelection: SelectionBridge,\n private scheduler: Scheduler,\n private selection: Selection,\n @Optional() private awarenessDelegate?: CollaborateSelectionAwarenessDelegate) {\n this.container = textbus.get(VIEW_CONTAINER)\n this.canvasContainer.append(this.canvas)\n this.host.append(this.canvasContainer, this.tooltips)\n this.container.prepend(this.host)\n this.subscription.add(this.onRectsChange.subscribe(rects => {\n for (const rect of rects) {\n this.context.fillStyle = rect.color\n this.context.beginPath()\n this.context.rect(rect.left, rect.top, rect.width, rect.height)\n this.context.fill()\n this.context.closePath()\n }\n }), fromEvent(window, 'resize').subscribe(() => {\n this.canvas.style.height = document.documentElement.clientHeight + 'px'\n this.refresh()\n }), this.scheduler.onDocChanged.subscribe(() => {\n this.refresh()\n }))\n }\n\n /**\n * 刷新协作光标,由于 Textbus 只会绘制可视区域的光标,当可视区域发生变化时,需要重新绘制\n */\n refresh() {\n this.draw(this.selectionCursors)\n }\n\n destroy() {\n this.subscription.unsubscribe()\n }\n\n /**\n * 根据远程用户光标位置,绘制协作光标\n * @param paths\n */\n draw(paths: UserSelectionCursor[]) {\n this.selectionCursors = paths\n const containerRect = this.container.getBoundingClientRect()\n this.canvas.style.top = containerRect.top * -1 + 'px'\n this.canvas.width = this.canvas.offsetWidth * this.ratio\n this.canvas.height = this.canvas.offsetHeight * this.ratio\n this.context.scale(this.ratio, this.ratio)\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\n const users: SelectionRect[] = []\n\n paths.filter(i => {\n return i.selection.anchor.length && i.selection.focus.length\n }).forEach(item => {\n const anchorPaths = [...item.selection.anchor]\n const focusPaths = [...item.selection.focus]\n const anchorOffset = anchorPaths.pop()!\n const anchorSlot = this.selection.findSlotByPaths(anchorPaths)\n const focusOffset = focusPaths.pop()!\n const focusSlot = this.selection.findSlotByPaths(focusPaths)\n if (!anchorSlot || !focusSlot) {\n return\n }\n\n const { focus, anchor } = this.nativeSelection.getPositionByRange({\n focusOffset,\n anchorOffset,\n focusSlot,\n anchorSlot\n })\n if (!focus || !anchor) {\n return\n }\n const nativeRange = document.createRange()\n try {\n nativeRange.setStart(anchor.node, anchor.offset)\n nativeRange.setEnd(focus.node, focus.offset)\n } catch (e) {\n return\n }\n if ((anchor.node !== focus.node || anchor.offset !== focus.offset) && nativeRange.collapsed) {\n nativeRange.setStart(focus.node, focus.offset)\n nativeRange.setEnd(anchor.node, anchor.offset)\n }\n\n let rects: Rect[] | DOMRectList | false = false\n if (this.awarenessDelegate) {\n rects = this.awarenessDelegate.getRects({\n focusOffset,\n anchorOffset,\n focusSlot,\n anchorSlot\n }, nativeRange, item)\n }\n if (!rects) {\n rects = nativeRange.getClientRects()\n }\n const selectionRects: SelectionRect[] = []\n for (let i = rects.length - 1; i >= 0; i--) {\n const rect = rects[i]\n selectionRects.push({\n color: item.color,\n username: item.username,\n left: rect.left - containerRect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n })\n }\n this.onRectsChange.next(selectionRects)\n\n const cursorRange = nativeRange.cloneRange()\n cursorRange.setStart(focus.node, focus.offset)\n cursorRange.collapse(true)\n\n const cursorRect = getLayoutRectByRange(cursorRange)\n\n const rect: SelectionRect = {\n username: item.username,\n color: item.color,\n left: cursorRect.left - containerRect.left,\n top: cursorRect.top - containerRect.top,\n width: 1,\n height: cursorRect.height\n }\n if (rect.left < 0 || rect.top < 0 || rect.left > containerRect.width) {\n return\n }\n users.push(rect)\n })\n this.drawUserCursor(users)\n }\n\n protected drawUserCursor(rects: SelectionRect[]) {\n for (let i = 0; i < rects.length; i++) {\n const rect = rects[i]\n const { cursor, userTip, anchor } = this.getUserCursor(i)\n Object.assign(cursor.style, {\n left: rect.left + 'px',\n top: rect.top + 'px',\n width: rect.width + 'px',\n height: rect.height + 'px',\n background: rect.color,\n display: 'block'\n })\n anchor.style.background = rect.color\n userTip.innerText = rect.username\n userTip.style.background = rect.color\n }\n\n for (let i = rects.length; i < this.tooltips.children.length; i++) {\n this.tooltips.removeChild(this.tooltips.children[i])\n }\n }\n\n private getUserCursor(index: number): RemoteSelectionCursor {\n let child: HTMLElement = this.tooltips.children[index] as HTMLElement\n if (child) {\n const anchor = child.children[0] as HTMLElement\n return {\n cursor: child,\n anchor,\n userTip: anchor.children[0] as HTMLElement\n }\n }\n const userTip = createElement('span', {\n styles: {\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '2px',\n bottom: '100%',\n whiteSpace: 'nowrap',\n color: '#fff',\n boxShadow: '0 1px 2px rgba(0,0,0,.1)',\n opacity: 0.8,\n borderRadius: '3px',\n padding: '3px 5px',\n pointerEvents: 'none',\n }\n })\n\n const anchor = createElement('span', {\n styles: {\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n width: '5px',\n height: '5px',\n borderRadius: '50%',\n pointerEvents: 'auto',\n pointer: 'cursor',\n },\n children: [userTip]\n })\n child = createElement('span', {\n styles: {\n position: 'absolute',\n },\n children: [\n anchor\n ]\n })\n this.tooltips.append(child)\n return {\n cursor: child,\n anchor,\n userTip\n }\n }\n}\n","import { Injectable } from '@viewfly/core'\nimport {\n distinctUntilChanged,\n filter,\n fromEvent,\n map,\n merge,\n Observable,\n Subject,\n Subscription,\n} from '@tanbo/stream'\nimport {\n Commander,\n CompositionStartEventData,\n CompositionUpdateEventData,\n ContentType,\n Controller,\n Event,\n invokeListener,\n Keyboard,\n Selection,\n Slot,\n Textbus\n} from '@textbus/core'\n\nimport { Caret, CaretPosition, Input } from './types'\nimport { VIEW_DOCUMENT } from './injection-tokens'\nimport { isSafari, isMac, isMobileBrowser, isFirefox } from './_utils/env'\nimport { Parser } from './parser'\nimport { getLayoutRectByRange } from './_utils/uikit'\nimport { DomAdapter } from './dom-adapter'\n\nclass NativeCaret implements Caret {\n onPositionChange: Observable<CaretPosition | null>\n\n set nativeRange(range: Range | null) {\n this._nativeRange = range\n if (range) {\n const r = range.cloneRange()\n r.collapse(true)\n const rect = getLayoutRectByRange(r)\n this.positionChangeEvent.next({\n left: rect.left,\n top: rect.top,\n height: rect.height\n })\n } else {\n this.positionChangeEvent.next(null)\n }\n }\n\n get nativeRange() {\n return this._nativeRange\n }\n\n get rect() {\n if (this.nativeRange) {\n const range = this.nativeRange.cloneRange()\n range.collapse(true)\n return getLayoutRectByRange(range)\n }\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n }\n }\n\n private _nativeRange: Range | null = null\n private subs: Subscription[] = []\n\n private positionChangeEvent = new Subject<CaretPosition | null>()\n\n constructor() {\n this.onPositionChange = this.positionChangeEvent.pipe(distinctUntilChanged())\n }\n\n refresh() {\n //\n }\n\n destroy() {\n this.subs.forEach(i => i.unsubscribe())\n this.subs = []\n }\n}\n\n@Injectable()\nexport class NativeInput extends Input {\n caret = new NativeCaret()\n\n composition = false\n // compositionState: CompositionState | null = null\n\n onReady = Promise.resolve()\n\n set disabled(b: boolean) {\n this._disabled = b\n if (this.controller.readonly) {\n this.documentView.contentEditable = 'false'\n return\n }\n this.documentView.contentEditable = b ? 'false' : 'true'\n }\n\n get disabled() {\n return this._disabled\n }\n\n private _disabled = false\n private documentView: HTMLElement\n private nativeSelection = document.getSelection()!\n\n private subscription = new Subscription()\n private nativeRange: Range | null = null\n\n private isSafari = isSafari()\n private isMac = isMac()\n private isMobileBrowser = isMobileBrowser()\n\n private ignoreComposition = false // 有 bug 版本搜狗拼音\n\n constructor(textbus: Textbus,\n private parser: Parser,\n private selection: Selection,\n private keyboard: Keyboard,\n private domAdapter: DomAdapter,\n private commander: Commander,\n private controller: Controller) {\n super()\n this.documentView = textbus.get(VIEW_DOCUMENT)\n if (!controller.readonly) {\n this.documentView.contentEditable = 'true'\n }\n this.subscription.add(\n controller.onReadonlyStateChange.subscribe(() => {\n this.documentView.contentEditable = controller.readonly ? 'false' : 'true'\n })\n )\n this.handleShortcut(this.documentView)\n this.handleInput(this.documentView)\n this.handleDefaultActions(this.documentView)\n }\n\n focus(nativeRange: Range) {\n if (this.controller.readonly) {\n return\n }\n this.caret.nativeRange = nativeRange\n this.nativeRange = nativeRange\n }\n\n blur() {\n if (this.nativeRange && this.nativeSelection.rangeCount > 0) {\n const current = this.nativeSelection.getRangeAt(0)\n if (current === this.nativeRange) {\n this.nativeSelection.removeAllRanges()\n this.nativeRange = null\n return\n }\n }\n }\n\n destroy() {\n this.caret.destroy()\n this.subscription.unsubscribe()\n }\n\n private handleDefaultActions(textarea: HTMLElement) {\n this.subscription.add(\n fromEvent<ClipboardEvent>(isFirefox() ? textarea : document, 'copy').subscribe(ev => {\n this.copyHandler(ev)\n }),\n fromEvent<ClipboardEvent>(textarea, 'paste').subscribe(ev => {\n this.pasteHandler(ev)\n })\n )\n }\n\n copyHandler(ev: ClipboardEvent) {\n const selection = this.selection\n if (!selection.isSelected) {\n return\n }\n if (selection.startSlot === selection.endSlot && selection.endOffset! - selection.startOffset! === 1) {\n const content = selection.startSlot!.getContentAtIndex(selection.startOffset!)\n if (typeof content === 'object') {\n const clipboardData = ev.clipboardData!\n const nativeSelection = document.getSelection()!\n const range = nativeSelection.getRangeAt(0)\n const div = document.createElement('div')\n const fragment = range.cloneContents()\n div.append(fragment)\n clipboardData.setData('text/html', div.innerHTML)\n clipboardData.setData('text', div.innerText)\n ev.preventDefault()\n }\n }\n }\n\n pasteHandler(ev: ClipboardEvent) {\n const text = ev.clipboardData!.getData('Text')\n\n const types = Array.from(ev.clipboardData!.types || [])\n const files = Array.from(ev.clipboardData!.files)\n if (types.every(type => type === 'Files') && files.length) {\n Promise.all(files.filter(i => {\n return /image/i.test(i.type)\n }).map(item => {\n const reader = new FileReader()\n return new Promise(resolve => {\n reader.onload = (event) => {\n resolve(event.target!.result)\n }\n reader.readAsDataURL(item)\n })\n })).then(urls => {\n const html = urls.map(i => {\n return `<img src=${i}>`\n }).join('')\n this.paste(html, text)\n })\n ev.preventDefault()\n return\n }\n\n const div = document.createElement('div')\n div.style.cssText = 'width:1px; height:10px; overflow: hidden; position: fixed; left: 50%; top: 50%; opacity:0'\n div.contentEditable = 'true'\n document.body.appendChild(div)\n div.focus()\n setTimeout(() => {\n document.body.removeChild(div)\n div.style.cssText = ''\n this.paste(div, text)\n })\n }\n\n private paste(dom: HTMLElement | string, text: string) {\n const slot = this.parser.parse(dom, new Slot([\n ContentType.BlockComponent,\n ContentType.InlineComponent,\n ContentType.Text\n ]))\n\n this.commander.paste(slot, text)\n }\n\n private handleShortcut(input: HTMLElement) {\n let isWriting = false\n let isIgnore = false\n this.subscription.add(\n fromEvent(input, 'compositionstart').subscribe(() => {\n isWriting = true\n }),\n fromEvent(input, 'compositionend').subscribe(() => {\n isWriting = false\n }),\n fromEvent<InputEvent>(input, 'beforeinput').subscribe(ev => {\n if (this.isSafari) {\n if (ev.inputType === 'insertFromComposition') {\n isIgnore = true\n }\n }\n }),\n fromEvent<KeyboardEvent>(input, 'keydown').pipe(filter(() => {\n if (this.isSafari && isIgnore) {\n isIgnore = false\n return false\n }\n return !isWriting // || !this.textarea.value\n })).subscribe(ev => {\n this.ignoreComposition = false\n let key = ev.key\n const keys = ')!@#$%^Z&*('\n const b = key === 'Process' && /Digit\\d/.test(ev.code) && ev.shiftKey\n if (b) {\n key = keys.charAt(+ev.code.substring(5))\n ev.preventDefault()\n }\n const is = this.keyboard.execShortcut({\n key: key,\n altKey: ev.altKey,\n shiftKey: ev.shiftKey,\n modKey: this.isMac ? ev.metaKey : ev.ctrlKey,\n agent: {\n key: ev.key,\n keyCode: ev.keyCode,\n code: ev.code\n }\n })\n if (is) {\n this.ignoreComposition = true\n ev.preventDefault()\n }\n })\n )\n }\n\n private handleInput(input: HTMLElement) {\n if (this.isMobileBrowser) {\n this.handleMobileInput(input)\n } else {\n this.handlePCInput(input)\n }\n }\n\n private handleMobileInput(input: HTMLElement) {\n let isCompositionStart = true\n let startIndex: number\n const compositionStart = () => {\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }\n const compositionUpdate = (data: string) => {\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionUpdateEventData>(startSlot, {\n index: startIndex,\n data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n }\n const compositionEnd = (data: string) => {\n this.composition = false\n\n if (data) {\n this.commander.write(data)\n }\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n this.subscription.add(\n fromEvent(input, 'compositionstart').subscribe(() => {\n compositionStart()\n }),\n fromEvent<CompositionEvent>(input, 'compositionupdate').subscribe(ev => {\n compositionUpdate(ev.data)\n }),\n fromEvent<CompositionEvent>(input, 'compositionend').subscribe(ev => {\n compositionEnd(ev.data)\n const startContainer = this.nativeSelection.focusNode\n if (startContainer instanceof Text && startContainer.textContent === ev.data) {\n startContainer.remove()\n }\n }),\n fromEvent<InputEvent>(input, 'beforeinput').subscribe(ev => {\n switch (ev.inputType) {\n case 'insertText':\n if (ev.data) {\n this.commander.write(ev.data)\n ev.preventDefault()\n }\n break\n case 'insertCompositionText':\n if (isCompositionStart) {\n isCompositionStart = false\n compositionStart()\n } else {\n compositionUpdate(ev.data || '')\n }\n break\n case 'deleteCompositionText':\n this.composition = false\n break\n case 'deleteContentBackward': {\n this.composition = false\n const range = ev.getTargetRanges()[0]\n if (!range) {\n break\n }\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot\n if (startSlot) {\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n }\n break\n }\n case 'insertReplacementText': {\n this.composition = false\n const range = ev.getTargetRanges()[0]\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot!\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n const text = ev.dataTransfer?.getData('text') || ev.data || null\n if (text) {\n this.commander.write(text)\n }\n break\n }\n //\n // case 'insertFromComposition': {\n // compositionEnd(ev.data || '')\n // break\n // }\n }\n })\n )\n }\n\n private handlePCInput(input: HTMLElement) {\n let startIndex = 0\n let isCompositionEnd = false\n this.subscription.add(\n fromEvent(input, 'compositionstart').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(() => {\n this.composition = true\n startIndex = this.selection.startOffset!\n const startSlot = this.selection.startSlot!\n const event = new Event<Slot, CompositionStartEventData>(startSlot, {\n index: startIndex\n })\n invokeListener(startSlot.parent!, 'onCompositionStart', event)\n }),\n fromEvent<CompositionEvent>(input, 'compositionupdate').pipe(filter(() => {\n return !this.ignoreComposition\n })).subscribe(ev => {\n const startSlot = this.selection.startSlot!\n const event = new Event(startSlot, {\n index: startIndex,\n data: ev.data\n })\n\n invokeListener(startSlot.parent!, 'onCompositionUpdate', event)\n }),\n merge(\n fromEvent<InputEvent>(input, 'beforeinput').pipe(\n map(ev => {\n ev.preventDefault()\n if (ev.inputType === 'insertCompositionText') {\n return null\n }\n if (ev.inputType === 'insertReplacementText') {\n const range = ev.getTargetRanges()[0]\n const location = this.domAdapter.getLocationByNativeNode(range.startContainer)!\n const startSlot = this.selection.startSlot!\n this.selection.setBaseAndExtent(\n startSlot,\n location.startIndex + range.startOffset,\n startSlot,\n location.startIndex + range.endOffset)\n\n this.commander.delete()\n return ev.dataTransfer?.getData('text') || ev.data || null\n }\n isCompositionEnd = ev.inputType === 'insertFromComposition'\n if (isCompositionEnd && this.composition) {\n return null\n }\n if (this.isSafari) {\n if (ev.inputType === 'insertText' || isCompositionEnd) {\n return ev.data\n }\n }\n if (!ev.isComposing && !!ev.data) {\n return ev.data\n }\n return null\n }),\n filter(text => {\n return text\n })\n ),\n this.isSafari ? new Observable<string>() :\n fromEvent<CompositionEvent>(input, 'compositionend').pipe(filter(() => {\n return !this.ignoreComposition\n })).pipe(\n filter(() => {\n return this.composition\n }),\n map(ev => {\n isCompositionEnd = true\n ev.preventDefault()\n return ev.data\n }),\n filter(() => {\n const b = this.ignoreComposition\n this.ignoreComposition = false\n return !b\n })\n )\n ).subscribe(text => {\n this.composition = false\n if (text) {\n const startContainer = this.nativeSelection.focusNode\n if (startContainer instanceof Text && startContainer.textContent === text) {\n startContainer.remove()\n }\n this.commander.write(text)\n }\n if (isCompositionEnd) {\n const startSlot = this.selection.startSlot\n if (startSlot) {\n const event = new Event<Slot>(startSlot, null)\n invokeListener(startSlot.parent!, 'onCompositionEnd', event)\n }\n }\n isCompositionEnd = false\n })\n )\n }\n}\n","import {\n ComponentConstructor,\n Component,\n ComponentLiteral,\n FocusManager,\n makeError,\n Module,\n NativeSelectionBridge,\n Registry,\n Textbus,\n Adapter,\n} from '@textbus/core'\nimport { Provider } from '@viewfly/core'\nimport { distinctUntilChanged, map, Subject } from '@tanbo/stream'\n\nimport { AttributeLoader, ComponentLoader, FormatLoader, Parser } from './parser'\nimport { EDITOR_OPTIONS, VIEW_CONTAINER, VIEW_DOCUMENT, VIEW_MASK } from './injection-tokens'\nimport { SelectionBridge } from './selection-bridge'\nimport { Input } from './types'\nimport { MagicInput } from './magic-input'\nimport { CollaborateCursor } from './collaborate-cursor'\nimport { createElement } from './_utils/uikit'\nimport { NativeInput } from './native-input'\nimport { DomAdapter } from './dom-adapter'\n\nconst browserErrorFn = makeError('BrowserModule')\n\n/**\n * Textbus PC 端配置接口\n */\nexport interface ViewOptions {\n /** 跨平台适配器 */\n adapter: DomAdapter<any, any>\n\n /** 编辑器根节点 */\n renderTo(): HTMLElement\n\n /** 自动获取焦点 */\n autoFocus?: boolean\n /** 编辑区最小高度 */\n minHeight?: string\n /** 组件加载器 */\n componentLoaders?: ComponentLoader[]\n /** 格式加载器 */\n formatLoaders?: FormatLoader<any>[]\n /** 属性加载器 */\n attributeLoaders?: AttributeLoader<any>[]\n /** 使用 contentEditable 作为编辑器控制可编辑范围 */\n useContentEditable?: boolean\n}\n\nexport class BrowserModule implements Module {\n providers: Provider[]\n\n private workbench!: HTMLElement\n\n constructor(public config: ViewOptions) {\n const { mask, wrapper } = BrowserModule.createLayout()\n wrapper.prepend(config.adapter.host)\n if (config.minHeight) {\n config.adapter.host.style.minHeight = config.minHeight\n }\n this.providers = [{\n provide: EDITOR_OPTIONS,\n useValue: config\n }, {\n provide: VIEW_CONTAINER,\n useValue: wrapper\n }, {\n provide: VIEW_DOCUMENT,\n useValue: config.adapter.host\n }, {\n provide: VIEW_MASK,\n useValue: mask\n }, {\n provide: NativeSelectionBridge,\n useExisting: SelectionBridge\n }, {\n provide: Input,\n useClass: config.useContentEditable ? NativeInput : MagicInput\n }, {\n provide: Adapter,\n useValue: config.adapter\n }, {\n provide: DomAdapter,\n useValue: config.adapter\n }, {\n provide: FocusManager,\n useFactory: (input: Input): FocusManager => {\n const focusEvent = new Subject<void>()\n const blurEvent = new Subject<void>()\n input.caret.onPositionChange.pipe(\n map(p => !!p),\n distinctUntilChanged()\n ).subscribe(b => {\n if (b) {\n focusEvent.next()\n } else {\n blurEvent.next()\n }\n })\n return {\n onFocus: focusEvent,\n onBlur: blurEvent\n }\n },\n deps: [Input]\n },\n Parser,\n SelectionBridge,\n CollaborateCursor\n ]\n\n this.workbench = wrapper\n }\n\n /**\n * 解析 HTML 并返回一个组件实例\n * @param html 要解析的 HTML\n * @param rootComponentLoader 文档根组件加载器\n * @param textbus\n */\n readDocumentByHTML(html: string, rootComponentLoader: ComponentLoader, textbus: Textbus): Component {\n const parser = textbus.get(Parser)\n const doc = parser.parseDoc(html, rootComponentLoader)\n if (doc instanceof Component) {\n return doc\n }\n throw browserErrorFn('rootComponentLoader must return a component instance.')\n }\n\n /**\n * 将组件数据解析到组件实例中\n * @param data 要解析的 JSON 数据\n * @param rootComponent 根组件\n * @param textbus\n */\n readDocumentByComponentLiteral(data: ComponentLiteral, rootComponent: ComponentConstructor, textbus: Textbus): Component {\n const registry = textbus.get(Registry)\n return registry.createComponentByFactory(data, rootComponent)\n }\n\n async setup(textbus: Textbus) {\n const host = this.config.renderTo()\n if (!(host instanceof HTMLElement)) {\n throw browserErrorFn('view container is not a HTMLElement')\n }\n\n host.append(this.workbench)\n await textbus.get(Input).onReady\n return () => {\n this.workbench.remove()\n }\n }\n\n onAfterStartup(textbus: Textbus) {\n if (this.config.autoFocus) {\n textbus.focus()\n }\n }\n\n onDestroy(textbus: Textbus) {\n textbus.get(Input).destroy()\n textbus.get(SelectionBridge).destroy()\n textbus.get(CollaborateCursor).destroy()\n }\n\n private static createLayout() {\n const mask = createElement('div', {\n attrs: {\n 'data-textbus-view': VIEW_MASK,\n },\n styles: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n pointerEvents: 'none',\n // overflow: 'hidden'\n }\n })\n const maskWrapper = createElement('div', {\n styles: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n margin: '0 -2px',\n zIndex: 1,\n pointerEvents: 'none',\n overflow: 'hidden'\n },\n children: [mask]\n })\n const wrapper = createElement('div', {\n attrs: {\n 'data-textbus-view': VIEW_CONTAINER,\n },\n styles: {\n display: 'flex',\n minHeight: '100%',\n position: 'relative',\n flexDirection: 'column'\n },\n children: [maskWrapper]\n })\n return {\n wrapper,\n mask\n }\n }\n}\n"],"names":["_array_like_to_array","createElement","tagName","options","el","document","classes","classList","add","_to_consumable_array","attrs","Object","keys","forEach","key","setAttribute","props","styles","assign","style","children","filter","i","item","appendChild","on","addEventListener","getLayoutRectByRange","range","startContainer","startOffset","nodeType","Node","TEXT_NODE","getBoundingClientRect","parentNode","Array","from","childNodes","indexOf","beforeNode","ELEMENT_NODE","nodeName","toLowerCase","rect","left","right","top","width","collapsed","height","range2","createRange","setStart","textContent","length","setEnd","offsetNode","isInsertBefore","lastChild","span","ownerDocument","innerText","display","insertBefore","removeChild","isWindows","test","navigator","userAgent","isMac","isSafari","isFirefox","isMobileBrowser","EDITOR_OPTIONS","InjectionToken","VIEW_CONTAINER","VIEW_DOCUMENT","VIEW_MASK","Parser","textbus","componentLoaders","formatLoaders","attributeLoaders","parseDoc","html","rootComponentLoader","element","parseHTML","read","childSlot","slotRootElement","slotContentHostElement","readSlot","parse","rootSlot","readFormats","readComponent","slot","insert","schema","t","match","result","_instanceof","Slot","toDelta","formats","readText","f","map","startIndex","index","startNode","firstChild","nextSibling","endIndex","applyFormats","formatter","value","retain","slotContentElement","a","r","attribute","formatItems","background","DOMParser","parseFromString","body","Input","DomAdapter","_call_super","onViewUpdated","Subject","host","cursor","wordBreak","boxSizing","flex","outline","id","Number","Math","random","substring","toString","Adapter","SelectionBridge","config","controller","onSelectionChange","nativeSelection","syncSelectionFromNativeSelectionChange","_define_property","selectionChangeEvent","subs","sub","connector","ignoreSelectionChange","changeFromUser","docContainer","cacheCaretPositionTimer","oldCaretPosition","selection","rootComponentRef","input","scheduler","domAdapter","getSelection","get","asObservable","pipe","readonly","subscribe","focus","blur","fromEvent","ev","target","type","useContentEditable","contentEditable","connect","disConnect","syncSelection","listen","unListen","getRect","location","getPositionByRange","focusOffset","offset","anchorOffset","focusSlot","anchorSlot","anchor","nativeRange","node","collapse","restore","abstractSelection","fromLocal","removeAllRanges","next","tryOffset","position","len","setBaseAndExtent","e","setTimeout","rangeCount","getRangeAt","bind","Promise","resolve","then","requestIdleCallback","destroy","unsubscribe","findSelectedNodeAndOffset","getPreviousLinePositionByCurrent","getLinePosition","getNextLinePositionByCurrent","currentPosition","toNext","clearTimeout","p","getNextLinePositionByOffset","getPreviousLinePositionByOffset","startLeft","isToPrevLine","loopCount","minLeft","minTop","oldPosition","oldLeft","getPreviousPositionByPosition","rect2","isToNextLine","maxRight","getNextPositionByPosition","push","button","shiftKey","isUpdating","onDocChange","onDocChanged","delay","composition","contains","anchorNode","component","slots","rawRange","cloneRange","isFocusEnd","focusNode","endContainer","endOffset","isFocusStart","nativeNode","getNativeNodeBySlot","at","setEndAfter","setStartBefore","startPosition","getCorrectedPosition","endPosition","includes","commonAncestorContainer","beforeChange","setSelection","start","end","isCollapsed","prev","getContentAtIndex","nodes","getNodesBySlot","getNativeNodeByComponent","Text","getLocationByNativeNode","current","Element","toAfter","excludeNodes","containerPosition","childNode","childPosition","findFocusNode","prevNode","prevPosition","nextNode","previousSibling","findFocusNodeByParent","parentPosition","iframeHTML","ExperimentalCaret","onPositionChange","onStyleChange","elementRef","changeFromSelf","getLimit","timer","caret","_display","flashing","subscription","positionChangeEvent","styleChangeEvent","oldRange","domRenderer","editorMask","bottom","documentElement","clientHeight","Subscription","distinctUntilChanged","pointerEvents","v","visibility","refresh","show","restart","lastChangesHasLocalUpdate","updateCursorPosition","toggleShowHide","hide","compositionNode","selectNodeContents","getComputedStyle","fontSize","lineHeight","color","writingMode","isNaN","parseFloat","boxHeight","max","floor","rectTop","containerRect","rotate","round","atan2","PI","hackEle","cssText","pointEle","append","p1","p2","x","y","remove","transform","backgroundColor","selfRect","scrollContainer","getScrollContainer","scrollRect","limit","min","scrollTop","container","overflow","overflowX","overflowY","MagicInput","parser","keyboard","onReady","_disabled","doc","textarea","isFocus","nativeFocus","ignoreComposition","commander","createEditableFrame","contentDocument","open","write","close","init","onReadonlyStateChange","disabled","b","reInit","contentBody","__changeMarker__","forceMarkDirtied","handleInput","handleShortcut","handleDefaultActions","copyHandler","pasteHandler","isSelected","startSlot","endSlot","content","_type_of","clipboardData","div","fragment","cloneContents","setData","innerHTML","preventDefault","text","getData","types","files","every","all","reader","FileReader","onload","event","readAsDataURL","urls","join","paste","dom","ContentType","BlockComponent","InlineComponent","isWriting","isIgnore","inputType","code","charAt","is","execShortcut","altKey","modKey","metaKey","ctrlKey","agent","keyCode","delete","Event","invokeListener","parent","data","isCompositionEnd","merge","isComposing","Observable","scrolling","border","CollaborateSelectionAwarenessDelegate","CollaborateCursor","awarenessDelegate","canvasContainer","canvas","context","tooltips","onRectsChange","selectionCursors","ratio","zIndex","opacity","getContext","window","devicePixelRatio","prepend","rects","fillStyle","beginPath","fill","closePath","draw","paths","offsetWidth","offsetHeight","scale","clearRect","users","anchorPaths","focusPaths","pop","findSlotByPaths","getRects","getClientRects","selectionRects","username","cursorRange","cursorRect","drawUserCursor","getUserCursor","userTip","child","marginBottom","whiteSpace","boxShadow","borderRadius","padding","pointer","NativeCaret","_nativeRange","NativeInput","documentView","handleMobileInput","handlePCInput","isCompositionStart","compositionStart","compositionUpdate","compositionEnd","getTargetRanges","dataTransfer","browserErrorFn","makeError","BrowserModule","providers","workbench","createLayout","mask","wrapper","adapter","minHeight","provide","useValue","NativeSelectionBridge","useExisting","useClass","FocusManager","useFactory","focusEvent","blurEvent","onFocus","onBlur","deps","readDocumentByHTML","Component","readDocumentByComponentLiteral","rootComponent","registry","Registry","createComponentByFactory","setup","renderTo","HTMLElement","onAfterStartup","autoFocus","onDestroy","maskWrapper","margin","flexDirection"],"mappings":";;;;AAAA;;AAEC,IAAA,SAAAA,sBAAA,CAAA,GAAA,EAAA,GAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAiBM,SAASC,cAAcC,OAAe,EAAA;AAAEC,IAAAA,IAAAA,OAAAA,GAAAA,iEAA2B,EAAC;IACzE,IAAMC,EAAAA,GAAKC,QAAAA,CAASJ,aAAa,CAACC,OAAAA,CAAAA;IAClC,IAAIC,OAAAA,CAAQG,OAAO,EAAE;AACnBF,QAAAA,IAAAA,aAAAA;QAAAA,CAAAA,aAAAA,GAAAA,GAAGG,SAAS,EAACC,GAAG,CAAA,KAAA,CAAhBJ,aAAAA,EAAiBK,sBAAA,CAAGN,OAAAA,CAAQG,OAAO,CAAA,CAAA;AACrC,IAAA;IACA,IAAIH,OAAAA,CAAQO,KAAK,EAAE;AACjBC,QAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAAA,CAAQO,KAAK,CAAA,CAAEG,OAAO,CAACC,SAAAA,GAAAA,EAAAA;AACjCV,YAAAA,EAAAA,CAAGW,YAAY,CAACD,GAAAA,EAAKX,QAAQO,KAAM,CAACI,GAAAA,CAAI,CAAA;AAC1C,QAAA,CAAA,CAAA;AACF,IAAA;IACA,IAAIX,OAAAA,CAAQa,KAAK,EAAE;AACjBL,QAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAAA,CAAQa,KAAK,CAAA,CAAEH,OAAO,CAACC,SAAAA,GAAAA,EAAAA;AAChCV,YAAAA,EAAU,CAACU,GAAAA,CAAI,GAAGX,QAAQa,KAAM,CAACF,GAAAA,CAAI;AACxC,QAAA,CAAA,CAAA;AACF,IAAA;IACA,IAAIX,OAAAA,CAAQc,MAAM,EAAE;AAClBN,QAAAA,MAAAA,CAAOO,MAAM,CAACd,EAAAA,CAAGe,KAAK,EAAEhB,QAAQc,MAAM,CAAA;AACxC,IAAA;IACA,IAAId,OAAAA,CAAQiB,QAAQ,EAAE;AACpBjB,QAAAA,OAAAA,CAAQiB,QAAQ,CAACC,MAAM,CAACC,SAAAA,CAAAA,EAAAA;AAAKA,YAAAA,OAAAA,CAAAA;AAAGT,QAAAA,CAAAA,CAAAA,CAAAA,OAAO,CAACU,SAAAA,IAAAA,EAAAA;AACtCnB,YAAAA,EAAAA,CAAGoB,WAAW,CAACD,IAAAA,CAAAA;AACjB,QAAA,CAAA,CAAA;AACF,IAAA;IACA,IAAIpB,OAAAA,CAAQsB,EAAE,EAAE;AACdd,QAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAAA,CAAQsB,EAAE,CAAA,CAAEZ,OAAO,CAACC,SAAAA,GAAAA,EAAAA;AAC9BV,YAAAA,EAAAA,CAAGsB,gBAAgB,CAACZ,GAAAA,EAAKX,QAAQsB,EAAG,CAACX,GAAAA,CAAI,CAAA;AAC3C,QAAA,CAAA,CAAA;AACF,IAAA;IACA,OAAOV,EAAAA;AACT;AAEO,SAASuB,qBAAqBC,KAAY,EAAA;AAC/C,IAAA,IAAMC,cAAAA,GAAgCD,KAAAA,CAAhCC,cAAAA,EAAgBC,WAAAA,GAAgBF,KAAAA,CAAhBE,WAAAA;AACtB,IAAA,IAAID,cAAAA,CAAeE,QAAQ,KAAKC,IAAAA,CAAKC,SAAS,EAAE;AAC9C,QAAA,IAAIH,cAAc,CAAA,EAAG;AACnB,YAAA,OAAOF,MAAMM,qBAAqB,EAAA;AACpC,QAAA;QACA,IAAMC,UAAAA,GAAaN,eAAeM,UAAU;AAC5CL,QAAAA,WAAAA,GAAcM,MAAMC,IAAI,CAACF,WAAWG,UAAU,CAAA,CAAEC,OAAO,CAACV,cAAAA,CAAAA;QACxDA,cAAAA,GAAiBM,UAAAA;AACnB,IAAA;AAEA,IAAA,IAAMK,UAAAA,GAAaX,cAAAA,CAAeS,UAAU,CAACR,cAAc,CAAA,CAAE;AAC7D,IAAA,IAAIU,UAAAA,EAAY;QACd,IAAIA,UAAAA,CAAWT,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,IAAID,UAAAA,CAAWE,QAAQ,CAACC,WAAW,EAAA,KAAO,IAAA,EAAM;YAC3F,IAAMC,IAAAA,GAAO,UAACJ,CAA2BN,qBAAqB,EAAA;YAC9D,OAAO;AACLW,gBAAAA,IAAAA,EAAMD,KAAKE,KAAK;AAChBC,gBAAAA,GAAAA,EAAKH,KAAKG,GAAG;AACbC,gBAAAA,KAAAA,EAAOpB,KAAAA,CAAMqB,SAAS,GAAG,CAAA,GAAIL,KAAKI,KAAK;AACvCE,gBAAAA,MAAAA,EAAQN,KAAKM;AACf,aAAA;AACF,QAAA,CAAA,MAAO,IAAIV,UAAAA,CAAWT,QAAQ,KAAKC,IAAAA,CAAKC,SAAS,EAAE;YACjD,IAAMkB,MAAAA,GAAS9C,SAAS+C,WAAW,EAAA;AACnCD,YAAAA,MAAAA,CAAOE,QAAQ,CAACb,UAAAA,EAAYA,UAAAA,CAAWc,WAAW,CAAEC,MAAM,CAAA;AAC1DJ,YAAAA,MAAAA,CAAOK,MAAM,CAAChB,UAAAA,EAAYA,UAAAA,CAAWc,WAAW,CAAEC,MAAM,CAAA;YACxD,IAAMX,KAAAA,GAAOO,OAAOjB,qBAAqB,EAAA;YACzC,OAAO;AACLW,gBAAAA,IAAAA,EAAMD,MAAKE,KAAK;AAChBC,gBAAAA,GAAAA,EAAKH,MAAKG,GAAG;AACbC,gBAAAA,KAAAA,EAAOpB,KAAAA,CAAMqB,SAAS,GAAG,CAAA,GAAIL,MAAKI,KAAK;AACvCE,gBAAAA,MAAAA,EAAQN,MAAKM;AACf,aAAA;AACF,QAAA;AACF,IAAA;AACA,IAAA,IAAMO,UAAAA,GAAa5B,cAAAA,CAAeS,UAAU,CAACR,WAAAA,CAAY;AACzD,IAAA,IAAI4B,cAAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,IAAME,SAAAA,GAAY9B,eAAe8B,SAAS;AAC1C,QAAA,IAAIA,aAAaA,SAAAA,CAAU5B,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;YACzD,IAAMG,KAAAA,GAAO,SAACe,CAA0BzB,qBAAqB,EAAA;YAC7D,OAAO;AACLW,gBAAAA,IAAAA,EAAMD,MAAKE,KAAK;AAChBC,gBAAAA,GAAAA,EAAKH,MAAKG,GAAG;AACbC,gBAAAA,KAAAA,EAAOpB,KAAAA,CAAMqB,SAAS,GAAG,CAAA,GAAIL,MAAKI,KAAK;AACvCE,gBAAAA,MAAAA,EAAQN,MAAKM;AACf,aAAA;AACF,QAAA;AACF,IAAA;AACA,IAAA,IAAIO,UAAAA,EAAY;QACd,IAAIA,UAAAA,CAAW1B,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,IAAIgB,UAAAA,CAAWf,QAAQ,CAACC,WAAW,EAAA,KAAO,IAAA,EAAM;YAC3F,IAAMC,KAAAA,GAAO,UAACa,CAA2BvB,qBAAqB,EAAA;YAC9D,OAAO;AACLW,gBAAAA,IAAAA,EAAMD,MAAKC,IAAI;AACfE,gBAAAA,GAAAA,EAAKH,MAAKG,GAAG;AACbC,gBAAAA,KAAAA,EAAOpB,KAAAA,CAAMqB,SAAS,GAAG,CAAA,GAAIL,MAAKI,KAAK;AACvCE,gBAAAA,MAAAA,EAAQN,MAAKM;AACf,aAAA;AACF,QAAA;QACAQ,cAAAA,GAAiB,IAAA;AACnB,IAAA;AACA,IAAA,IAAME,IAAAA,GAAO/B,cAAAA,CAAegC,aAAa,CAAE5D,aAAa,CAAC,MAAA,CAAA;AACzD2D,IAAAA,IAAAA,CAAKE,SAAS,GAAG,QAAA;IACjBF,IAAAA,CAAKzC,KAAK,CAAC4C,OAAO,GAAG,cAAA;AACrB,IAAA,IAAIL,cAAAA,EAAgB;QAClB7B,cAAAA,CAAemC,YAAY,CAACJ,IAAAA,EAAMH,UAAAA,CAAAA;IACpC,CAAA,MAAO;AACL5B,QAAAA,cAAAA,CAAeL,WAAW,CAACoC,IAAAA,CAAAA;AAC7B,IAAA;IACA,IAAMhB,KAAAA,GAAOgB,KAAK1B,qBAAqB,EAAA;AACvCL,IAAAA,cAAAA,CAAeoC,WAAW,CAACL,IAAAA,CAAAA;IAC3B,OAAO;AACLf,QAAAA,IAAAA,EAAMD,MAAKC,IAAI;AACfE,QAAAA,GAAAA,EAAKH,MAAKG,GAAG;AACbC,QAAAA,KAAAA,EAAOpB,KAAAA,CAAMqB,SAAS,GAAG,CAAA,GAAIL,MAAKI,KAAK;AACvCE,QAAAA,MAAAA,EAAQN,MAAKM;AACf,KAAA;AACF;;IC9HagB,SAAAA,GAAY,SAAA,SAAA,GAAA;WAAM,kBAAA,CAAmBC,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA;AAAC;IAC9DC,KAAAA,GAAQ,SAAA,KAAA,GAAA;WAAM,SAAA,CAAUH,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA;AAAC;IACjDE,QAAAA,GAAW,SAAA,QAAA,GAAA;WAAM,QAAA,CAASJ,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA,IAAK,CAAC,QAAA,CAASF,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA;AAAC;IAC1FG,SAAAA,GAAY,SAAA,SAAA,GAAA;WAAM,SAAA,CAAUL,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA;AAAC;IAErDI,eAAAA,GAAkB,SAAA,eAAA,GAAA;WAAM,qBAAA,CAAsBN,IAAI,CAACC,SAAAA,CAAUC,SAAS,CAAA;AAAC;;ACDpF;;AAEC,IACM,IAAMK,cAAAA,GAAiB,IAAIC,eAA4B,gBAAA;AAE9D;;AAEC,IACM,IAAMC,cAAAA,GAAiB,IAAID,eAA4B,gBAAA;AAE9D;;AAEC,IACM,IAAME,aAAAA,GAAgB,IAAIF,eAA4B,eAAA;AAE7D;;AAEC,IACM,IAAMG,SAAAA,GAAY,IAAIH,eAA4B,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0DlD,IAAA,MAAMI,iBAAN,WAAA;AAAMA,IAAAA,SAAAA,MAAAA,CASC,OAA4C,EACpCC,OAAgB,EAAA;AAVzBD,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,MAAAA,CAAAA;;AAKXE,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,oBAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,iBAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,oBAAAA,MAAAA,CAAAA;aAGoBH,OAAAA,GAAAA,OAAAA;AAClB,QAAA,IAAMC,gBAAAA,GACJxE,sBAAA,CAAIN,OAAAA,CAAQ8E,gBAAgB,IAAI,EAAE,CAAA;AAEpC,QAAA,IAAMC,aAAAA,GACJzE,sBAAA,CAAIN,OAAAA,CAAQ+E,aAAa,IAAI,EAAE,CAAA;AAEjC,QAAA,IAAMC,gBAAAA,GACJ1E,sBAAA,CAAIN,OAAAA,CAAQgF,gBAAgB,IAAI,EAAE,CAAA;;;;;QAMpC,IAAI,CAACF,gBAAgB,GAAGA,gBAAAA;QACxB,IAAI,CAACC,aAAa,GAAGA,aAAAA;QACrB,IAAI,CAACC,gBAAgB,GAAGA,gBAAAA;;AA1BfJ,IAAAA,eAAAA,CAAAA,MAAAA,EAAAA;;AA6BX;;;;AAIC,MACDK,GAAAA,EAAAA,UAAAA;mBAAAA,SAAAA,QAAAA,CAASC,IAA0B,EAAEC,mBAAoC,EAAA;;gBACvE,IAAMC,OAAAA,GAAU,OAAOF,IAAAA,KAAS,QAAA,GAAWN,MAnClCA,CAmCyCS,SAAS,CAACH,IAAAA,CAAAA,GAAQA,IAAAA;gBACpE,OAAOC,mBAAAA,CAAoBG,IAAI,CAC7BF,OAAAA,EACA,IAAI,CAACP,OAAO,EACZ,SAACU,SAAAA,EAAWC,eAAAA,EAAAA;wBAAiBC,sBAAAA,GAAAA,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,MAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAyBD,eAAAA;AACpD,oBAAA,OAAO,KAAA,CAAKE,QAAQ,CAACH,SAAAA,EAAWC,eAAAA,EAAiBC,sBAAAA,CAAAA;AACnD,gBAAA,CAAA,CAAA;AAEJ,YAAA;;;AAEA;;;;AAIC,MACDE,GAAAA,EAAAA,OAAAA;mBAAAA,SAAAA,KAAAA,CAAMT,IAA0B,EAAEU,QAAc,EAAA;gBAC9C,IAAMR,OAAAA,GAAU,OAAOF,IAAAA,KAAS,QAAA,GAAWN,MAnDlCA,CAmDyCS,SAAS,CAACH,IAAAA,CAAAA,GAAQA,IAAAA;AACpE,gBAAA,OAAO,IAAI,CAACW,WAAW,CAACT,OAAAA,EAASQ,QAAAA,CAAAA;AACnC,YAAA;;;YAEQE,GAAAA,EAAAA,eAAAA;mBAAR,SAAQA,aAAAA,CAAc7F,EAAQ,EAAE8F,IAAU,EAAA;AACxC,gBAAA,IAAI9F,EAAAA,CAAG2B,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;AACrC,oBAAA,IAAI,EAACrC,CAAmBF,OAAO,KAAK,IAAA,EAAM;AACxCgG,wBAAAA,IAAAA,CAAKC,MAAM,CAAC,IAAA,CAAA;AACZ,wBAAA;AACF,oBAAA;oBACA,IAAMC,MAAAA,GAAU3F,sBAAA,CAAGyF,IAAAA,CAAKE,MAAM,CAAA;AACzB,oBAAA,IAAA,yBAAA,GAAA,IAAA,EAAA,iBAAA,GAAA,KAAA,EAAA,cAAA,GAAA,SAAA;;wBAAL,IAAA,IAAK,SAAA,GAAW,IAAI,CAACnB,gBAAgB,qBAAhC,KAAA,EAAA,EAAA,yBAAA,GAAA,CAAA,KAAA,GAAA,SAAA,CAAA,IAAA,EAAA,EAAA,IAAA,CAAA,EAAA,yBAAA,GAAA,IAAA,CAAkC;AAAlC,4BAAA,IAAMoB,CAAAA,GAAN,KAAA,CAAA,KAAA;AACH,4BAAA,IAAIA,CAAAA,CAAEC,KAAK,CAAClG,EAAAA,EAAmBgG,MAAAA,CAAAA,EAAS;;gCACtC,IAAMG,MAAAA,GAASF,CAAAA,CAAEZ,IAAI,CACnBrF,EAAAA,EACA,IAAI,CAAC4E,OAAO,EACZ,SAACU,SAAAA,EAAWC,eAAAA,EAAAA;wCAAiBC,sBAAAA,GAAAA,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,KAAAA,CAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAyBD,eAAAA;AACpD,oCAAA,OAAO,KAAA,CAAKE,QAAQ,CAACH,SAAAA,EAAWC,eAAAA,EAAiBC,sBAAAA,CAAAA;AACnD,gCAAA,CAAA,CAAA;AAEF,gCAAA,IAAI,CAACW,MAAAA,EAAQ;AACX,oCAAA;AACF,gCAAA;gCACA,IAAUC,aAAA,CAAND,MAAAA,EAAkBE,IAAAA,CAAAA,EAAM;AAC1BF,oCAAAA,MAAAA,CAAOG,OAAO,EAAA,CAAG7F,OAAO,CAACS,SAAAA,CAAAA,EAAAA;AAAK4E,wCAAAA,OAAAA,IAAAA,CAAKC,MAAM,CAAC7E,CAAAA,CAAE6E,MAAM,EAAE7E,EAAEqF,OAAO,CAAA;;AAC7D,oCAAA;AACF,gCAAA;AACAT,gCAAAA,IAAAA,CAAKC,MAAM,CAACI,MAAAA,CAAAA;AACZ,gCAAA;AACF,4BAAA;AACF,wBAAA;;AAnBK,wBAAA,iBAAA,GAAA,IAAA;AAAA,wBAAA,cAAA,GAAA,GAAA;;;iCAAA,yBAAA,IAAA,SAAA,CAAA,MAAA,IAAA,IAAA,EAAA;AAAA,gCAAA,SAAA,CAAA,MAAA,EAAA;;;AAAA,4BAAA,IAAA,iBAAA,EAAA;AAAA,gCAAA,MAAA,cAAA;;;;oBAoBL,IAAI,CAACP,WAAW,CAAC5F,EAAAA,EAAmB8F,IAAAA,CAAAA;AACtC,gBAAA,CAAA,MAAO,IAAI9F,EAAAA,CAAG2B,QAAQ,KAAKC,IAAAA,CAAKC,SAAS,EAAE;oBACzC,IAAI,CAAC2E,QAAQ,CAACV,IAAAA,EAAM9F,EAAAA,CAAAA;AACtB,gBAAA;AACF,YAAA;;;YAEQwG,GAAAA,EAAAA,UAAAA;mBAAR,SAAQA,QAAAA,CAASV,IAAU,EAAE9F,EAAQ,EAAA;gBACnC,IAAMkD,WAAAA,GAAclD,GAAGkD,WAAW;gBAClC,IAAI,uBAAA,CAAwBa,IAAI,CAACb,WAAAA,CAAAA,EAAwB;AACvD,oBAAA;AACF,gBAAA;AACA4C,gBAAAA,IAAAA,CAAKC,MAAM,CAAC7C,WAAAA,CAAAA;AACd,YAAA;;;YAEQ0C,GAAAA,EAAAA,aAAAA;mBAAR,SAAQA,WAAAA,CAAY5F,EAAW,EAAE8F,IAAU,EAAA;AACzC,gBAAA,IAAMS,UAAU,IAAI,CAACzB,aAAa,CAAC7D,MAAM,CAACwF,SAAAA,CAAAA,EAAAA;oBACxC,OAAOA,CAAAA,CAAEP,KAAK,CAAClG,EAAAA,CAAAA;gBACjB,CAAA,CAAA,CAAG0G,GAAG,CAACD,SAAAA,CAAAA,EAAAA;oBACL,OAAOA,CAAAA,CAAEpB,IAAI,CAACrF,EAAAA,CAAAA;AAChB,gBAAA,CAAA,CAAA;gBACA,IAAM2G,UAAAA,GAAab,KAAKc,KAAK;gBAC7B,IAAIC,SAAAA,GAAY7G,GAAG8G,UAAU;AAC7B,gBAAA,MAAOD,SAAAA,CAAW;oBAChB,IAAI,CAAChB,aAAa,CAACgB,SAAAA,EAAWf,IAAAA,CAAAA;AAC9Be,oBAAAA,SAAAA,GAAYA,UAAUE,WAAW;AACnC,gBAAA;gBACA,IAAMC,QAAAA,GAAWlB,KAAKc,KAAK;AAC3B,gBAAA,IAAI,CAACK,YAAY,CAACnB,MAAMS,OAAAA,CAAQG,GAAG,CAAkBxF,SAAAA,CAAAA,EAAAA;oBACnD,OAAO;AACLgG,wBAAAA,SAAAA,EAAWhG,EAAEgG,SAAS;AACtBC,wBAAAA,KAAAA,EAAOjG,EAAEiG,KAAK;wBACdR,UAAAA,EAAAA,UAAAA;wBACAK,QAAAA,EAAAA;AACF,qBAAA;AACF,gBAAA,CAAA,CAAA,CAAA;AACAlB,gBAAAA,IAAAA,CAAKsB,MAAM,CAACJ,QAAAA,CAAAA;gBACZ,OAAOlB,IAAAA;AACT,YAAA;;;YAEQL,GAAAA,EAAAA,UAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,QAAAA,CAAyBH,SAAY,EAAEC,eAAwB,EAAE8B,kBAA2B,EAAA;AAClG,gBAAA,IAAI9B,eAAAA,CAAgB5D,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;AAClD,oBAAA,IAAI,CAAC0C,gBAAgB,CAAC9D,MAAM,CAACqG,SAAAA,CAAAA,EAAAA;wBAC3B,OAAOA,CAAAA,CAAEpB,KAAK,CAACX,eAAAA,CAAAA;oBACjB,CAAA,CAAA,CAAG9E,OAAO,CAAC6G,SAAAA,CAAAA,EAAAA;wBACT,IAAMC,CAAAA,GAAID,CAAAA,CAAEjC,IAAI,CAACE,eAAAA,CAAAA;AACjBD,wBAAAA,SAAAA,CAAU3E,YAAY,CAAC4G,CAAAA,CAAEC,SAAS,EAAED,EAAEJ,KAAK,CAAA;AAC7C,oBAAA,CAAA,CAAA;AACF,gBAAA;AACA,gBAAA,IAAIE,kBAAAA,CAAmB1F,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;oBACrD,IAAI,CAACuD,WAAW,CAACyB,kBAAAA,EAAoB/B,SAAAA,CAAAA;gBACvC,CAAA,MAAO;oBACL,IAAI,CAACkB,QAAQ,CAAClB,SAAAA,EAAW+B,kBAAAA,CAAAA;AAC3B,gBAAA;gBACA,OAAO/B,SAAAA;AACT,YAAA;;;YAEQ2B,GAAAA,EAAAA,cAAAA;mBAAR,SAAQA,YAAAA,CAAanB,IAAU,EAAE2B,WAA8B,EAAA;AAC7D3B,gBAAAA,IAAAA,CAAK4B,UAAU,CAAC,WAAA;oBACdD,WAAAA,CAAYhH,OAAO,CAACS,SAAAA,CAAAA,EAAAA;wBAClB4E,IAAAA,CAAKsB,MAAM,CAAClG,CAAAA,CAAEyF,UAAU,CAAA;AACxBb,wBAAAA,IAAAA,CAAKsB,MAAM,CAAClG,CAAAA,CAAE8F,QAAQ,GAAG9F,CAAAA,CAAEyF,UAAU,EAAEzF,CAAAA,CAAEgG,SAAS,EAAEhG,CAAAA,CAAEiG,KAAK,CAAA;AAC7D,oBAAA,CAAA,CAAA;AACF,gBAAA,CAAA,CAAA;AACF,YAAA;;;;YAhJO/B,GAAAA,EAAAA,WAAAA;AAAP,YAAA,KAAA,EAAA,SAAOA,UAAUH,IAAY,EAAA;AAC3B,gBAAA,OAAO,IAAI0C,SAAAA,EAAAA,CAAYC,eAAe,CAAC3C,IAAAA,EAAM,aAAa4C,IAAI;AAChE,YAAA;;;AAHWlD,IAAAA,OAAAA,MAAAA;AAkJZ,CAAA;;;;;;;;;;;;;;;;AC5MM,IAAA,KAAemD,GAAf,SAAeA,KAAAA,GAAAA;AAAAA,IAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,KAAAA,CAAAA;AAiBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCM,IAAA,UAAeC,iBAAf,SAAA,OAAA,EAAA;AAAeA,IAAAA,WAAAA,CAAAA,UAAAA,EAAAA,OAAAA,CAAAA;AAAAA,IAAAA,SAAAA,UAAAA,GAAAA;AAAAA,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,UAAAA,CAAAA;;gBAAfC,aAAA,CAAA,IAAA,EAAeD,UAAAA,EAAAA,SAAAA,CAAAA,EAGpBE,0BAAAA,eAAAA,EAAgB,IAAIC,YACpBC,kBAAAA,CAAAA,KAAAA,EAAAA,MAAAA,EAAOtI,cAAc,KAAA,EAAO;YAC1BgB,MAAAA,EAAQ;gBACNuH,MAAAA,EAAQ,MAAA;gBACRC,SAAAA,EAAW,WAAA;gBACXC,SAAAA,EAAW,YAAA;gBACXC,IAAAA,EAAM,CAAA;gBACNC,OAAAA,EAAS;AACX,aAAA;YACAlI,KAAAA,EAAO;gBACL,mBAAA,EAAqBmE;AACvB,aAAA;YACA7D,KAAAA,EAAO;AACL6H,gBAAAA,EAAAA,EAAI,UAAA,GAAaC,MAAAA,CAAO,CAACC,IAAAA,CAAKC,MAAM,EAAA,GAAK,EAAC,EAAGC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAIC,QAAQ,CAAC,EAAA;AACtE;AACF,SAAA,CAAA,CAAA;;;AAlBoBf,IAAAA,OAAAA,UAAAA;EAEyBgB,OAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiBxC,IAAA,eAAMC,iBAAN,WAAA;aAAMA,eAAAA,CAoBiCC,MAAmB,EACnDrE,OAAgB,EAChBsE,UAAsB,EACtB,SAA4B,EAC5B,gBAA0C,EAC1C,KAAoB,EACpB,SAA4B,EAC5B,UAA8B,EAAA;;AA3B/BF,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,eAAAA,CAAAA;;;;;;;AACXG,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,qBAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,mBAAAA,MAAAA,CAAAA;AAEAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,0CAAAA,MAAAA,CAAAA;AAEA,QAAAC,kBAAA,CAAA,IAAA,EAAQC,wBAAR,MAAA,CAAA;AAEA,QAAAD,kBAAA,CAAA,IAAA,EAAQE,QAAR,MAAA,CAAA;AACA,QAAAF,kBAAA,CAAA,IAAA,EAAQG,OAAR,MAAA,CAAA;AACA,QAAAH,kBAAA,CAAA,IAAA,EAAQI,aAAR,MAAA,CAAA;AAEA,QAAAJ,kBAAA,CAAA,IAAA,EAAQK,yBAAR,MAAA,CAAA;AAEA,QAAAL,kBAAA,CAAA,IAAA,EAAQM,kBAAR,MAAA,CAAA;AACA,QAAAN,kBAAA,CAAA,IAAA,EAAQO,gBAAR,MAAA,CAAA;AAEA,QAAAP,kBAAA,CAAA,IAAA,EAAQQ,2BAAR,MAAA,CAAA;AACA,QAAAR,kBAAA,CAAA,IAAA,EAAQS,oBAAR,MAAA,CAAA;aAE4Cd,MAAAA,GAAAA,MAAAA;aAGxBe,SAAAA,GAAAA,SAAAA;aACAC,gBAAAA,GAAAA,gBAAAA;aACAC,KAAAA,GAAAA,KAAAA;aACAC,SAAAA,GAAAA,SAAAA;aACAC,UAAAA,GAAAA,UAAAA;AAzBpBhB,QAAAA,IAAAA,CAAAA,eAAAA,GAAkBnJ,SAASoK,YAAY,EAAA;aAEvChB,sCAAAA,GAAyC,IAAA;AAEjCE,QAAAA,IAAAA,CAAAA,oBAAAA,GAAuB,IAAIrB,OAAAA,EAAAA;AAE3BsB,QAAAA,IAAAA,CAAAA,IAAAA,GAAuB,EAAE;aAEzBE,SAAAA,GAA6C,IAAA;aAE7CC,qBAAAA,GAAwB,KAAA;aAExBC,cAAAA,GAAiB,KAAA;AAcvB,QAAA,IAAI,CAACC,YAAY,GAAGjF,OAAAA,CAAQ0F,GAAG,CAAC7F,aAAAA,CAAAA;QAChC,IAAI,CAAC0E,iBAAiB,GAAG,IAAI,CAACI,oBAAoB,CAACgB,YAAY,EAAA,CAAGC,IAAI,CAACvJ,MAAAA,CAAO,WAAA;YAC5E,OAAO,CAACiI,WAAWuB,QAAQ;AAC7B,QAAA,CAAA,CAAA,CAAA;QACA,IAAI,CAAChB,GAAG,GAAG,IAAI,CAACN,iBAAiB,CAACuB,SAAS,CAAC,SAACnD,CAAAA,EAAAA;AAC3C,YAAA,IAAIA,CAAAA,EAAG;AACL2C,gBAAAA,KAAAA,CAAMS,KAAK,CAACpD,CAAAA,EAAG,KAAA,CAAKqC,cAAc,CAAA;YACpC,CAAA,MAAO;AACLM,gBAAAA,KAAAA,CAAMU,IAAI,EAAA;AACZ,YAAA;AACF,QAAA,CAAA,CAAA;QACA,IAAI,CAACnB,GAAG,CAACrJ,GAAG,CACVyK,UAAU5K,QAAAA,EAAU,SAAA,CAAA,CAAWyK,SAAS,CAACI,SAAAA,EAAAA,EAAAA;YACvC,IAAIC,MAAAA,GAASD,GAAGC,MAAM;AACtB,YAAA,IAAI,4BAAA,CAA6BhH,IAAI,CAACgH,MAAAA,CAAOzI,QAAQ,CAAA,EAAG;AACtD,gBAAA,IAAIyI,MAAAA,CAAOjL,OAAO,CAACyC,WAAW,EAAA,KAAO,OAAA,IAAW,gBAAA,CAAiBwB,IAAI,CAAEgH,MAAAA,CAA4BC,IAAI,CAAA,EAAG;AACxG,oBAAA;AACF,gBAAA;AACA,gBAAA,KAAA,CAAKrB,qBAAqB,GAAG,IAAA;AAC7B,gBAAA;AACF,YAAA;YACA,IAAI,CAACV,MAAAA,CAAOgC,kBAAkB,EAAE;AAC9B,gBAAA,MAAOF,MAAAA,CAAQ;oBACb,IAAIA,MAAAA,CAAOG,eAAe,KAAK,MAAA,EAAQ;AACrC,wBAAA,KAAA,CAAKvB,qBAAqB,GAAG,IAAA;AAC7B,wBAAA;AACF,oBAAA;AACAoB,oBAAAA,MAAAA,GAASA,OAAOhJ,UAAU;AAC5B,gBAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA,CAAA;QAEF,IAAI,CAAC0H,GAAG,CAACrJ,GAAG,CACVyK,SAAAA,CAAU5K,QAAAA,EAAU,UAAA,CAAA,CAAYyK,SAAS,CAAC,WAAA;AACxC,YAAA,KAAA,CAAKf,qBAAqB,GAAG,KAAA;AAC/B,QAAA,CAAA,CAAA,CAAA;;AA/DOX,IAAAA,eAAAA,CAAAA,eAAAA,EAAAA;;YAmEXmC,GAAAA,EAAAA,SAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,QAAQzB,SAAmC,EAAA;AACzC,gBAAA,IAAI,CAAC0B,UAAU,EAAA;gBACf,IAAI,CAAC1B,SAAS,GAAGA,SAAAA;gBACjB,IAAI,CAAC2B,aAAa,CAAC3B,SAAAA,CAAAA;gBACnB,IAAI,CAAC4B,MAAM,CAAC5B,SAAAA,CAAAA;AACd,YAAA;;;YAEA0B,GAAAA,EAAAA,YAAAA;mBAAAA,SAAAA,UAAAA,GAAAA;gBACE,IAAI,CAAC1B,SAAS,GAAG,IAAA;AACjB,gBAAA,IAAI,CAAC6B,QAAQ,EAAA;AACf,YAAA;;;YAEAC,GAAAA,EAAAA,SAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,QAAQC,QAA2B,EAAA;AACjC,gBAAA,IAA0B,wBAAA,GAAA,IAAI,CAACC,kBAAkB,CAAC;AAChDC,oBAAAA,WAAAA,EAAaF,SAASG,MAAM;AAC5BC,oBAAAA,YAAAA,EAAcJ,SAASG,MAAM;AAC7BE,oBAAAA,SAAAA,EAAWL,SAAS3F,IAAI;AACxBiG,oBAAAA,UAAAA,EAAYN,SAAS3F;AACvB,iBAAA,CAAA,EALQ6E,KAAAA,GAAkB,wBAAA,CAAlBA,KAAAA,EAAOqB,MAAAA,GAAW,wBAAA,CAAXA,MAAAA;gBAMf,IAAI,CAACrB,KAAAA,IAAS,CAACqB,MAAAA,EAAQ;oBACrB,OAAO,IAAA;AACT,gBAAA;gBACA,IAAMC,WAAAA,GAAchM,SAAS+C,WAAW,EAAA;AACxCiJ,gBAAAA,WAAAA,CAAYhJ,QAAQ,CAAC0H,KAAAA,CAAMuB,IAAI,EAAEvB,MAAMiB,MAAM,CAAA;AAC7CK,gBAAAA,WAAAA,CAAYE,QAAQ,EAAA;AACpB,gBAAA,OAAO5K,oBAAAA,CAAqB0K,WAAAA,CAAAA;AAC9B,YAAA;;;YAEAG,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,CAAQC,iBAA2C,EAAEC,SAAkB,EAAA;;gBACrE,IAAI,CAAC1C,cAAc,GAAG0C,SAAAA;gBACtB,IAAI,IAAI,CAAC3C,qBAAqB,IAAI,CAAC,IAAI,CAACD,SAAS,EAAE;AACjD,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI,CAAC6B,QAAQ,EAAA;AACb,gBAAA,IAAI,CAACc,iBAAAA,EAAmB;oBACtB,IAAI,CAACjD,eAAe,CAACmD,eAAe,EAAA;AACpC,oBAAA,IAAI,CAAChD,oBAAoB,CAACiD,IAAI,CAAC,IAAA,CAAA;AAC/B,oBAAA,IAAI,CAAClB,MAAM,CAAC,IAAI,CAAC5B,SAAS,CAAA;AAC1B,oBAAA;AACF,gBAAA;gBAEA,IAA0B,wBAAA,GAAA,IAAI,CAACgC,kBAAkB,CAACW,oBAA1C1B,KAAAA,GAAkB,wBAAA,CAAlBA,KAAAA,EAAOqB,MAAAA,GAAW,wBAAA,CAAXA,MAAAA;gBACf,IAAI,CAACrB,KAAAA,IAAS,CAACqB,MAAAA,EAAQ;oBACrB,IAAI,CAAC5C,eAAe,CAACmD,eAAe,EAAA;AACpC,oBAAA,IAAI,CAAChD,oBAAoB,CAACiD,IAAI,CAAC,IAAA,CAAA;AAC/B,oBAAA,IAAI,CAAClB,MAAM,CAAC,IAAI,CAAC5B,SAAS,CAAA;AAC1B,oBAAA;AACF,gBAAA;AAEA,gBAAA,SAAS+C,UAAUC,QAAsC,EAAA;oBACvD,IAAI,CAACA,QAAAA,CAASR,IAAI,EAAE;AAClB,wBAAA;AACF,oBAAA;AACA,oBAAA,IAAIQ,SAASR,IAAI,CAACvK,QAAQ,KAAKC,IAAAA,CAAKC,SAAS,EAAE;AAC7C,wBAAA,IAAM8K,MAAMD,QAAAA,CAASR,IAAI,CAAChJ,WAAW,CAAEC,MAAM;wBAC7C,IAAIuJ,QAAAA,CAASd,MAAM,GAAGe,GAAAA,EAAK;AACzBD,4BAAAA,QAAAA,CAASd,MAAM,GAAGe,GAAAA;AACpB,wBAAA;oBACF,CAAA,MAAO,IAAID,SAASR,IAAI,CAACvK,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;AACvD,wBAAA,IAAMsK,OAAMD,QAAAA,CAASR,IAAI,CAAChK,UAAU,CAACiB,MAAM;wBAC3C,IAAIuJ,QAAAA,CAASd,MAAM,GAAGe,IAAAA,EAAK;AACzBD,4BAAAA,QAAAA,CAASd,MAAM,GAAGe,IAAAA;AACpB,wBAAA;AACF,oBAAA;AACF,gBAAA;gBAEA,IAAI;oBACFF,SAAAA,CAAU9B,KAAAA,CAAAA;oBACV8B,SAAAA,CAAUT,MAAAA,CAAAA;AACV,oBAAA,IAAI,CAAC5C,eAAe,CAACwD,gBAAgB,CAACZ,MAAAA,CAAOE,IAAI,EAAEF,MAAAA,CAAOJ,MAAM,EAAEjB,KAAAA,CAAMuB,IAAI,EAAEvB,MAAMiB,MAAM,CAAA;AAC5F,gBAAA,CAAA,CAAE,OAAOiB,CAAAA,EAAG;oBACVC,UAAAA,CAAW,WAAA;wBACT,MAAMD,CAAAA;AACR,oBAAA,CAAA,CAAA;AACF,gBAAA;AACA,gBAAA,IAAI,IAAI,CAACzD,eAAe,CAAC2D,UAAU,EAAE;AACnC,oBAAA,IAAMd,cAAc,IAAI,CAAC7C,eAAe,CAAC4D,UAAU,CAAC,CAAA,CAAA;AACpD,oBAAA,IAAI,CAACzD,oBAAoB,CAACiD,IAAI,CAACP,WAAAA,CAAAA;gBACjC,CAAA,MAAO;AACL,oBAAA,IAAI,CAAC1C,oBAAoB,CAACiD,IAAI,CAAC,IAAA,CAAA;AACjC,gBAAA;;AAGA,gBAAA,IAAMS,IAAAA,GAAO,SAAA,IAAA,GAAA;oBACX,IAAI,KAAA,CAAKvD,SAAS,EAAE;wBAClB,KAAA,CAAK4B,MAAM,CAAC,KAAA,CAAK5B,SAAS,CAAA;AAC5B,oBAAA;AACF,gBAAA,CAAA;AACA,gBAAA,IAAI4C,SAAAA,EAAW;oBACbY,OAAAA,CAAQC,OAAO,EAAA,CAAGC,IAAI,CAACH,IAAAA,CAAAA;AACvB,oBAAA;AACF,gBAAA;gBACA,IAAI,OAAOI,wBAAwB,UAAA,EAAY;oBAC7CA,mBAAAA,CAAoBJ,IAAAA,CAAAA;gBACtB,CAAA,MAAO;AACLH,oBAAAA,UAAAA,CAAWG,IAAAA,EAAM,EAAA,CAAA;AACnB,gBAAA;;AAEF,YAAA;;;YAEAK,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;AACE,gBAAA,IAAI,CAAC9D,IAAI,CAAC/I,OAAO,CAACS,SAAAA,CAAAA,EAAAA;AAAKA,oBAAAA,OAAAA,CAAAA,CAAEqM,WAAW,EAAA;;gBACpC,IAAI,CAAC9D,GAAG,CAAC8D,WAAW,EAAA;AACtB,YAAA;;;YAEA7B,GAAAA,EAAAA,oBAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,mBAAmBW,iBAAoC,EAAA;gBACrD,IAAI1B,KAAAA;gBACJ,IAAIqB,MAAAA;gBACJ,IAAI;oBACFrB,KAAAA,GAAQ,IAAI,CAAC6C,yBAAyB,CAACnB,kBAAkBP,SAAS,EAAGO,kBAAkBV,WAAW,CAAA;oBAClGK,MAAAA,GAASrB,KAAAA;oBACT,IAAI0B,iBAAAA,CAAkBN,UAAU,KAAKM,iBAAAA,CAAkBP,SAAS,IAC9DO,iBAAAA,CAAkBR,YAAY,KAAKQ,iBAAAA,CAAkBV,WAAW,EAAE;wBAClEK,MAAAA,GAAS,IAAI,CAACwB,yBAAyB,CAACnB,kBAAkBN,UAAU,EAAGM,kBAAkBR,YAAY,CAAA;AACvG,oBAAA;oBACA,OAAO;wBACLlB,KAAAA,EAAAA,KAAAA;wBACAqB,MAAAA,EAAAA;AACF,qBAAA;AACF,gBAAA,CAAA,CAAE,OAAOa,CAAAA,EAAG;oBACV,OAAO;wBACLlC,KAAAA,EAAO,IAAA;wBACPqB,MAAAA,EAAQ;AACV,qBAAA;AACF,gBAAA;AACF,YAAA;;;YAEAyB,GAAAA,EAAAA,kCAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,iCAAiCf,QAA2B,EAAA;AAC1D,gBAAA,OAAO,IAAI,CAACgB,eAAe,CAAChB,QAAAA,EAAU,KAAA,CAAA;AACxC,YAAA;;;YAEAiB,GAAAA,EAAAA,8BAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,6BAA6BjB,QAA2B,EAAA;AACtD,gBAAA,OAAO,IAAI,CAACgB,eAAe,CAAChB,QAAAA,EAAU,IAAA,CAAA;AACxC,YAAA;;;YAEQgB,GAAAA,EAAAA,iBAAAA;mBAAR,SAAQA,eAAAA,CAAgBE,eAAkC,EAAEC,MAAe,EAAA;;gBACzEC,YAAAA,CAAa,IAAI,CAAChE,uBAAuB,CAAA;gBACzC,IAAIiE,CAAAA;gBACJ,IAAI,IAAI,CAAChE,gBAAgB,EAAE;oBACzBgE,CAAAA,GAAIF,MAAAA,GACF,IAAI,CAACG,2BAA2B,CAACJ,eAAAA,EAAiB,IAAI,CAAC7D,gBAAgB,CAACtH,IAAI,CAAA,GAC5E,IAAI,CAACwL,+BAA+B,CAACL,iBAAiB,IAAI,CAAC7D,gBAAgB,CAACtH,IAAI,CAAA;gBACpF,CAAA,MAAO;AACL,oBAAA,IAAI,CAACsH,gBAAgB,GAAG,IAAI,CAACyB,OAAO,CAACoC,eAAAA,CAAAA;oBACrCG,CAAAA,GAAIF,MAAAA,GACF,IAAI,CAACG,2BAA2B,CAACJ,eAAAA,EAAiB,IAAI,CAAC7D,gBAAgB,CAACtH,IAAI,CAAA,GAC5E,IAAI,CAACwL,+BAA+B,CAACL,iBAAiB,IAAI,CAAC7D,gBAAgB,CAACtH,IAAI,CAAA;AACpF,gBAAA;gBACA,IAAI,CAACqH,uBAAuB,GAAGgD,UAAAA,CAAW,WAAA;AACxC,oBAAA,KAAA,CAAK/C,gBAAgB,GAAG,IAAA;gBAC1B,CAAA,EAAG,IAAA,CAAA;gBACH,OAAOgE,CAAAA;AACT,YAAA;;;YAOQE,GAAAA,EAAAA,iCAAAA;;;;;AADP,MACD,SAAQA,+BAAAA,CAAgCL,eAAkC,EAAEM,SAAiB,EAAA;AAC3F,gBAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,gBAAA,IAAIC,SAAAA,GAAY,CAAA;AAChB,gBAAA,IAAIC,OAAAA,GAAUH,SAAAA;gBACd,IAAIpC,SAAAA,GAAY8B,gBAAgB9H,IAAI;gBACpC,IAAI6F,WAAAA,GAAciC,gBAAgBhC,MAAM;AACxC,gBAAA,IAAI0C,MAAAA,GAAS,IAAI,CAAC9C,OAAO,CAAC;oBACxB1F,IAAAA,EAAMgG,SAAAA;oBACNF,MAAAA,EAAQD;AACV,iBAAA,CAAA,CAAIhJ,GAAG;gBAEP,IAAI+J,QAAAA;gBACJ,IAAI6B,WAAAA;AACJ,gBAAA,IAAIC,OAAAA,GAAU,CAAA;AACd,gBAAA,MAAO,IAAA,CAAM;AACXJ,oBAAAA,SAAAA,EAAAA;AACA1B,oBAAAA,QAAAA,GAAW,IAAI,CAAC1C,SAAS,CAACyE,6BAA6B,CAAC3C,SAAAA,EAAWH,WAAAA,CAAAA;AACnEG,oBAAAA,SAAAA,GAAYY,SAAS5G,IAAI;AACzB6F,oBAAAA,WAAAA,GAAce,SAASd,MAAM;AAC7B,oBAAA,IAAM8C,KAAAA,GAAQ,IAAI,CAAClD,OAAO,CAACkB,QAAAA,CAAAA;AAC3B,oBAAA,IAAI,CAACyB,YAAAA,EAAc;wBACjB,IAAIO,KAAAA,CAAMjM,IAAI,GAAG4L,OAAAA,IAAWK,KAAAA,CAAM/L,GAAG,GAAG+L,KAAAA,CAAM5L,MAAM,IAAIwL,MAAAA,EAAQ;4BAC9DH,YAAAA,GAAe,IAAA;wBACjB,CAAA,MAAO,IAAIO,MAAMjM,IAAI,KAAK4L,WAAWK,KAAAA,CAAM/L,GAAG,KAAK2L,MAAAA,EAAQ;4BACzD,OAAO5B,QAAAA;AACT,wBAAA;AACA2B,wBAAAA,OAAAA,GAAUK,MAAMjM,IAAI;AACpB6L,wBAAAA,MAAAA,GAASI,MAAM/L,GAAG;;AAEpB,oBAAA;AACA,oBAAA,IAAIwL,YAAAA,EAAc;wBAChB,IAAIO,KAAAA,CAAMjM,IAAI,IAAIyL,SAAAA,EAAW;4BAC3B,OAAOxB,QAAAA;AACT,wBAAA;AACA,wBAAA,IAAI6B,WAAAA,EAAa;4BACf,IAAIG,KAAAA,CAAMjM,IAAI,IAAI+L,OAAAA,EAAS;gCACzB,OAAOD,WAAAA;AACT,4BAAA;AACF,wBAAA;AACAC,wBAAAA,OAAAA,GAAUE,MAAMjM,IAAI;wBACpB8L,WAAAA,GAAc7B,QAAAA;AAChB,oBAAA;AACA,oBAAA,IAAI0B,YAAY,KAAA,EAAO;AACrB,wBAAA;AACF,oBAAA;AACF,gBAAA;AACA,gBAAA,OAAO1B,QAAAA,IAAY;oBACjBd,MAAAA,EAAQ,CAAA;oBACR9F,IAAAA,EAAMgG;AACR,iBAAA;AACF,YAAA;;;YAOQkC,GAAAA,EAAAA,6BAAAA;;;;;AADP,MACD,SAAQA,2BAAAA,CAA4BJ,eAAkC,EAAEM,SAAiB,EAAA;AACvF,gBAAA,IAAIS,YAAAA,GAAe,KAAA;AACnB,gBAAA,IAAIP,SAAAA,GAAY,CAAA;AAChB,gBAAA,IAAIQ,QAAAA,GAAWV,SAAAA;gBACf,IAAIpC,SAAAA,GAAY8B,gBAAgB9H,IAAI;gBACpC,IAAI6F,WAAAA,GAAciC,gBAAgBhC,MAAM;AACxC,gBAAA,IAAMpJ,IAAAA,GAAO,IAAI,CAACgJ,OAAO,CAAC;oBACxB1F,IAAAA,EAAMgG,SAAAA;oBACNF,MAAAA,EAAQD;AACV,iBAAA,CAAA;gBACA,IAAI2C,MAAAA,GAAS9L,KAAKG,GAAG;gBACrB,IAAI4L,WAAAA;AACJ,gBAAA,IAAIC,OAAAA,GAAU,CAAA;AACd,gBAAA,MAAO,IAAA,CAAM;AACXJ,oBAAAA,SAAAA,EAAAA;AACA,oBAAA,IAAM1B,WAAW,IAAI,CAAC1C,SAAS,CAAC6E,yBAAyB,CAAC/C,SAAAA,EAAWH,WAAAA,CAAAA;AACrEG,oBAAAA,SAAAA,GAAYY,SAAS5G,IAAI;AACzB6F,oBAAAA,WAAAA,GAAce,SAASd,MAAM;AAC7B,oBAAA,IAAM8C,KAAAA,GAAQ,IAAI,CAAClD,OAAO,CAACkB,QAAAA,CAAAA;AAC3B,oBAAA,IAAI,CAACiC,YAAAA,EAAc;wBACjB,IAAID,KAAAA,CAAMjM,IAAI,GAAGmM,QAAAA,IAAYF,KAAAA,CAAM/L,GAAG,IAAI2L,MAAAA,GAAS9L,IAAAA,CAAKM,MAAM,EAAE;4BAC9D6L,YAAAA,GAAe,IAAA;wBACjB,CAAA,MAAO,IAAID,MAAMjM,IAAI,KAAKmM,YAAYF,KAAAA,CAAM/L,GAAG,KAAK2L,MAAAA,EAAQ;4BAC1D,OAAO5B,QAAAA;AACT,wBAAA;AACAkC,wBAAAA,QAAAA,GAAWF,MAAMjM,IAAI;AACrB6L,wBAAAA,MAAAA,GAASI,MAAM/L,GAAG;wBAClB4L,WAAAA,GAAc7B,QAAAA;AAChB,oBAAA;AACA,oBAAA,IAAIiC,YAAAA,EAAc;wBAChB,IAAID,KAAAA,CAAMjM,IAAI,GAAGyL,SAAAA,EAAW;4BAC1B,OAAOK,WAAAA;AACT,wBAAA;AACA,wBAAA,IAAIA,WAAAA,EAAa;4BACf,IAAIG,KAAAA,CAAMjM,IAAI,IAAI+L,OAAAA,EAAS;gCACzB,OAAOD,WAAAA;AACT,4BAAA;AACF,wBAAA;wBACAA,WAAAA,GAAc7B,QAAAA;AACd8B,wBAAAA,OAAAA,GAAUE,MAAMjM,IAAI;AACtB,oBAAA;AACA,oBAAA,IAAI2L,YAAY,KAAA,EAAO;AACrB,wBAAA;AACF,oBAAA;AACF,gBAAA;AACA,gBAAA,OAAOG,WAAAA,IAAe;AACpB3C,oBAAAA,MAAAA,EAAQE,UAAU3I,MAAM;oBACxB2C,IAAAA,EAAMgG;AACR,iBAAA;AACF,YAAA;;;YAEQP,GAAAA,EAAAA,UAAAA;mBAAR,SAAQA,QAAAA,GAAAA;AACN,gBAAA,IAAI,CAAC/B,IAAI,CAAC/I,OAAO,CAACS,SAAAA,CAAAA,EAAAA;AAAKA,oBAAAA,OAAAA,CAAAA,CAAEqM,WAAW,EAAA;;gBACpC,IAAI,CAAC/D,IAAI,GAAG,EAAE;AAChB,YAAA;;;YAEQ8B,GAAAA,EAAAA,QAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,OAAO5B,SAAmC,EAAA;;AAChD,gBAAA,IAAI,CAAC,IAAI,CAACT,MAAM,CAACgC,kBAAkB,EAAE;oBACnC,IAAMjB,SAAAA,GAAY,IAAI,CAACZ,eAAe;AACtC,oBAAA,IAAI,CAACI,IAAI,CAACsF,IAAI,CACZjE,SAAAA,CAAsB,IAAI,CAAChB,YAAY,EAAE,WAAA,CAAA,CAAaa,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AAC9D,wBAAA,IAAI,MAAKnB,qBAAqB,IAAImB,EAAAA,CAAGiE,MAAM,KAAK,CAAA,EAAG;AACjD,4BAAA;AACF,wBAAA;wBACA,IAAI,CAACjE,EAAAA,CAAGkE,QAAQ,EAAE;AAChBhF,4BAAAA,SAAAA,CAAUuC,eAAe,EAAA;AAC3B,wBAAA;AACF,oBAAA,CAAA,CAAA,CAAA;AAEJ,gBAAA;AACA,gBAAA,IAAI0C,UAAAA,GAAa,KAAA;AACjB,gBAAA,IAAI,CAACzF,IAAI,CAACsF,IAAI,CACZ,IAAI,CAAC3E,SAAS,CAAC+E,WAAW,CAACxE,SAAS,CAAC,WAAA;oBACnCuE,UAAAA,GAAa,IAAA;gBACf,CAAA,CAAA,EACA,IAAI,CAAC9E,SAAS,CAACgF,YAAY,CAAC3E,IAAI,CAAC4E,KAAAA,EAAAA,CAAAA,CAAS1E,SAAS,CAAC,WAAA;oBAClDuE,UAAAA,GAAa,KAAA;AACf,gBAAA,CAAA,CAAA,EACApE,SAAAA,CAAU5K,QAAAA,EAAU,iBAAA,CAAA,CAAmByK,SAAS,CAAC,WAAA;AAC/C,oBAAA,IAAIuE,UAAAA,EAAY;AACd,wBAAA;AACF,oBAAA;oBACA,IAAI,KAAA,CAAK5F,sCAAsC,EAAE;AAC/C,wBAAA,KAAA,CAAKgC,aAAa,CAAC3B,SAAAA,CAAAA;AACrB,oBAAA;AACF,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEQ2B,GAAAA,EAAAA,eAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,cAAc3B,SAAmC,EAAA;AAmCNuC,gBAAAA,IAAAA,oCAAAA;gBAlCjD,IAAMjC,SAAAA,GAAY,IAAI,CAACZ,eAAe;gBACtC,IAAI,CAACQ,cAAc,GAAG,IAAA;AACtB,gBAAA,IAAI,IAAI,CAACD,qBAAqB,IAC5B,IAAI,CAACO,KAAK,CAACmF,WAAW,IACtBrF,SAAAA,CAAU+C,UAAU,KAAK,CAAA,IACzB,CAAC,IAAI,CAAClD,YAAY,CAACyF,QAAQ,CAACtF,SAAAA,CAAUuF,UAAU,KAChD,IAAI,CAACtF,gBAAgB,CAACuF,SAAS,CAACC,KAAK,CAACtM,MAAM,KAAK,CAAA,EAAG;AACpD,oBAAA;AACF,gBAAA;gBACA,IAAMuM,QAAAA,GAAW1F,SAAAA,CAAUgD,UAAU,CAAC,CAAA,CAAA;gBACtC,IAAMf,WAAAA,GAAcyD,SAASC,UAAU,EAAA;gBACvC,IAAMC,UAAAA,GAAa5F,SAAAA,CAAU6F,SAAS,KAAK5D,WAAAA,CAAY6D,YAAY,IAAI9F,SAAAA,CAAU2B,WAAW,KAAKM,WAAAA,CAAY8D,SAAS;gBACtH,IAAMC,YAAAA,GAAehG,SAAAA,CAAU6F,SAAS,KAAK5D,WAAAA,CAAYxK,cAAc,IAAIuI,SAAAA,CAAU2B,WAAW,KAAKM,WAAAA,CAAYvK,WAAW;gBAC5H,IAAI,CAAC,IAAI,CAACmI,YAAY,CAACyF,QAAQ,CAACtF,SAAAA,CAAU6F,SAAS,CAAA,EAAG;AACpD,oBAAA,IAAID,UAAAA,EAAY;AACd,wBAAA,IAAMK,aAAa,IAAI,CAAC7F,UAAU,CAAC8F,mBAAmB,CAAC,IAAI,CAACjG,gBAAgB,CAACuF,SAAS,CAACC,KAAK,CAACU,EAAE,CAAC,CAAA,CAAA,CAAA;AAChG,wBAAA,IAAI,CAACF,UAAAA,EAAY;AACf,4BAAA;AACF,wBAAA;wBACAhE,WAAAA,CAAYmE,WAAW,CAACH,UAAAA,CAAW1M,SAAS,CAAA;oBAC9C,CAAA,MAAO;AACL,wBAAA,IAAM0M,cAAa,IAAI,CAAC7F,UAAU,CAAC8F,mBAAmB,CAAC,IAAI,CAACjG,gBAAgB,CAACuF,SAAS,CAACC,KAAK,CAACU,EAAE,CAAC,EAAC,CAAA,CAAA;AACjG,wBAAA,IAAI,CAACF,WAAAA,EAAY;AACf,4BAAA;AACF,wBAAA;wBACAhE,WAAAA,CAAYoE,cAAc,CAACJ,WAAAA,CAAWnJ,UAAU,CAAA;AAClD,oBAAA;AACF,gBAAA;gBAEA,IAAMwJ,aAAAA,GAAgB,IAAI,CAACC,oBAAoB,CAACtE,YAAYxK,cAAc,EAAEwK,WAAAA,CAAYvK,WAAW,EAAEsO,YAAAA,CAAAA;AACrG,gBAAA,IAAMQ,WAAAA,GAAcvE,WAAAA,CAAYpJ,SAAS,GACvCyN,gBACA,IAAI,CAACC,oBAAoB,CAACtE,WAAAA,CAAY6D,YAAY,EAAE7D,WAAAA,CAAY8D,SAAS,EAAEH,UAAAA,CAAAA;gBAE7E,IAAI;AAAChO,oBAAAA,IAAAA,CAAKS,YAAY;AAAET,oBAAAA,IAAAA,CAAKC;iBAAU,CAAC4O,QAAQ,CAAA,CAACxE,oCAAAA,GAAAA,WAAAA,CAAYyE,uBAAuB,MAAA,IAAA,IAAnCzE,oCAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,oCAAAA,CAAqCtK,QAAQ,CAAA,IAC5F2O,aAAAA,IAAiBE,WAAAA,EAAa;AAC9B,oBAAA,IAAMnE,iBAAAA,GAAoB3C,SAAAA,CAAUiH,YAAY,CAACf,UAAAA,GAAa;AAC5D7D,wBAAAA,UAAAA,EAAYuE,cAAcxK,IAAI;AAC9B+F,wBAAAA,YAAAA,EAAcyE,cAAc1E,MAAM;AAClCE,wBAAAA,SAAAA,EAAW0E,YAAY1K,IAAI;AAC3B6F,wBAAAA,WAAAA,EAAa6E,YAAY5E;qBAC3B,GAAI;AACFE,wBAAAA,SAAAA,EAAWwE,cAAcxK,IAAI;AAC7B6F,wBAAAA,WAAAA,EAAa2E,cAAc1E,MAAM;AACjCG,wBAAAA,UAAAA,EAAYyE,YAAY1K,IAAI;AAC5B+F,wBAAAA,YAAAA,EAAc2E,YAAY5E;AAC5B,qBAAA,CAAA;AACA,oBAAA,IAAI,CAACS,iBAAAA,EAAmB;AACtB,wBAAA,IAAI,CAAC9C,oBAAoB,CAACiD,IAAI,CAAC,IAAA,CAAA;AAC/B9C,wBAAAA,SAAAA,CAAUkH,YAAY,CAAC,IAAA,CAAA;AACvB,wBAAA;AACF,oBAAA;oBACA,IAA0B,wBAAA,GAAA,IAAI,CAAClF,kBAAkB,CAACW,oBAA1C1B,KAAAA,GAAkB,wBAAA,CAAlBA,KAAAA,EAAOqB,MAAAA,GAAW,wBAAA,CAAXA,MAAAA;AACf,oBAAA,IAAIrB,SAASqB,MAAAA,EAAQ;AACnB,wBAAA,IAAI6E,KAAAA,GAAQ7E,MAAAA;AACZ,wBAAA,IAAI8E,GAAAA,GAAMnG,KAAAA;AACV,wBAAA,IAAIqF,YAAAA,EAAc;4BAChBa,KAAAA,GAAQlG,KAAAA;4BACRmG,GAAAA,GAAM9E,MAAAA;AACR,wBAAA;wBACA,IAAIC,WAAAA,CAAYxK,cAAc,KAAKoP,KAAAA,CAAM3E,IAAI,IAAID,WAAAA,CAAYvK,WAAW,KAAKmP,KAAAA,CAAMjF,MAAM,EAAE;AACzFK,4BAAAA,WAAAA,CAAYhJ,QAAQ,CAAC4N,KAAAA,CAAM3E,IAAI,EAAE2E,MAAMjF,MAAM,CAAA;AAC/C,wBAAA;wBACA,IAAIK,WAAAA,CAAY6D,YAAY,KAAKgB,GAAAA,CAAI5E,IAAI,IAAID,WAAAA,CAAY8D,SAAS,KAAKe,GAAAA,CAAIlF,MAAM,EAAE;AACjFK,4BAAAA,WAAAA,CAAY7I,MAAM,CAAC0N,GAAAA,CAAI5E,IAAI,EAAE4E,IAAIlF,MAAM,CAAA;AACzC,wBAAA;AACAlC,wBAAAA,SAAAA,CAAUkH,YAAY,CAACvE,iBAAAA,CAAAA;AACvB,wBAAA,IAAIrC,SAAAA,CAAU+G,WAAW,KACvBrB,QAAAA,CAASjO,cAAc,KAAKoP,KAAAA,CAAM3E,IAAI,IACtCwD,QAAAA,CAAShO,WAAW,KAAKmP,KAAAA,CAAMjF,MAAM,IACrC8D,QAAAA,CAASI,YAAY,KAAKgB,GAAAA,CAAI5E,IAAI,IAClCwD,QAAAA,CAASK,SAAS,KAAKe,GAAAA,CAAIlF,MAAK,CAAA,EAC/B;AACD8D,4BAAAA,QAAAA,CAASzM,QAAQ,CAAC4N,KAAAA,CAAM3E,IAAI,EAAE2E,MAAMjF,MAAM,CAAA;AAC1C8D,4BAAAA,QAAAA,CAAStM,MAAM,CAAC0N,GAAAA,CAAI5E,IAAI,EAAE4E,IAAIlF,MAAM,CAAA;AACtC,wBAAA;AACA,wBAAA,IAAI,CAACrC,oBAAoB,CAACiD,IAAI,CAACP,WAAAA,CAAAA;oBACjC,CAAA,MAAO;AACLvC,wBAAAA,SAAAA,CAAUkH,YAAY,CAAC,IAAA,CAAA;AACzB,oBAAA;AACA,oBAAA;AACF,gBAAA;AACAlH,gBAAAA,SAAAA,CAAUkH,YAAY,CAAC,IAAA,CAAA;AACzB,YAAA;;;YAEQpD,GAAAA,EAAAA,2BAAAA;mBAAR,SAAQA,yBAAAA,CAA0B1H,IAAU,EAAE8F,MAAc,EAAA;AAC1D,gBAAA,IAAMoF,IAAAA,GAAOlL,IAAAA,CAAKmL,iBAAiB,CAACrF,MAAAA,GAAS,CAAA,CAAA;AAC7C,gBAAA,IAAMsF,QAAQ,IAAI,CAAC9G,UAAU,CAAC+G,cAAc,CAACrL,IAAAA,CAAAA;AAE7C,gBAAA,IAAIkL,IAAAA,EAAM;oBACR,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,wBAAA,IAAMf,aAAa,IAAI,CAAC7F,UAAU,CAACgH,wBAAwB,CAACJ,IAAAA,CAAAA;wBAC5D,OAAO;AACL9E,4BAAAA,IAAAA,EAAM+D,WAAWlO,UAAU;4BAC3B6J,MAAAA,EAAQ5J,KAAAA,CAAMC,IAAI,CAACgO,UAAAA,CAAWlO,UAAU,CAAEG,UAAU,CAAA,CAAEC,OAAO,CAAC8N,UAAAA,CAAAA,GAAc;AAC9E,yBAAA;oBACF,CAAA,MAAO,IAAIe,SAAS,IAAA,EAAM;AACnB,wBAAA,IAAA,yBAAA,GAAA,IAAA,EAAA,iBAAA,GAAA,KAAA,EAAA,cAAA,GAAA,SAAA;;AAAL,4BAAA,IAAA,IAAK,YAAcE,KAAAA,CAAAA,MAAAA,CAAAA,QAAAA,CAAAA,EAAAA,EAAd,KAAA,EAAA,EAAA,yBAAA,GAAA,CAAA,KAAA,GAAA,yBAAA,yBAAA,GAAA,IAAA,CAAqB;AAArB,gCAAA,IAAMhF,IAAAA,GAAN,KAAA,CAAA,KAAA;gCACH,IAAQ9F,aAAA,CAAJ8F,IAAAA,EAAgBmF,IAAAA,CAAAA,EAAM;AACxB,oCAAA;AACF,gCAAA;gCACA,IAAInF,IAAAA,CAAK5J,QAAQ,KAAK,IAAA,EAAM;AAC1B,oCAAA,IAAMoK,WAAW,IAAI,CAACtC,UAAU,CAACkH,uBAAuB,CAACpF,IAAAA,CAAAA;AACzD,oCAAA,IAAIQ,QAAAA,EAAU;wCACZ,IAAIA,QAAAA,CAAS1F,QAAQ,KAAK4E,MAAAA,EAAQ;4CAChC,IAAM7J,UAAAA,GAAamK,KAAKnK,UAAU;4CAClC,OAAO;gDACLmK,IAAAA,EAAMnK,UAAAA;gDACN6J,MAAAA,EAAQ5J,KAAAA,CAAMC,IAAI,CAACF,UAAAA,CAAWG,UAAU,CAAA,CAAEC,OAAO,CAAC+J,IAAAA,CAAAA,GAAqB;AACzE,6CAAA;AACF,wCAAA;AACF,oCAAA;AACF,gCAAA;AACF,4BAAA;;AAhBK,4BAAA,iBAAA,GAAA,IAAA;AAAA,4BAAA,cAAA,GAAA,GAAA;;;qCAAA,yBAAA,IAAA,SAAA,CAAA,MAAA,IAAA,IAAA,EAAA;AAAA,oCAAA,SAAA,CAAA,MAAA,EAAA;;;AAAA,gCAAA,IAAA,iBAAA,EAAA;AAAA,oCAAA,MAAA,cAAA;;;;AAiBP,oBAAA;AACF,gBAAA;gBACA,IAAMqF,OAAAA,GAAUzL,IAAAA,CAAKmL,iBAAiB,CAACrF,MAAAA,CAAAA;gBACvC,IAAI2F,OAAAA,IAAW,OAAOA,OAAAA,KAAY,QAAA,EAAU;AAC1C,oBAAA,IAAMtB,cAAa,IAAI,CAAC7F,UAAU,CAACgH,wBAAwB,CAACG,OAAAA,CAAAA;oBAC5D,OAAO;AACLrF,wBAAAA,IAAAA,EAAM+D,YAAWlO,UAAU;wBAC3B6J,MAAAA,EAAQ5J,KAAAA,CAAMC,IAAI,CAACgO,WAAAA,CAAWlO,UAAU,CAAEG,UAAU,CAAA,CAAEC,OAAO,CAAC8N,WAAAA;AAChE,qBAAA;AACF,gBAAA;AACK,gBAAA,IAAA,0BAAA,GAAA,IAAA,EAAA,kBAAA,GAAA,KAAA,EAAA,eAAA,GAAA,SAAA;;AAAL,oBAAA,IAAA,IAAK,aAAciB,KAAAA,CAAAA,MAAAA,CAAAA,QAAAA,CAAAA,EAAAA,EAAd,MAAA,EAAA,EAAA,0BAAA,GAAA,CAAA,MAAA,GAAA,0BAAA,0BAAA,GAAA,IAAA,CAAqB;AAArB,wBAAA,IAAMhF,KAAAA,GAAN,MAAA,CAAA,KAAA;wBACH,IAAQ9F,aAAA,CAAJ8F,KAAAA,EAAgBsF,OAAAA,CAAAA,EAAS;4BAC3B,IAAItF,KAAAA,CAAKpM,OAAO,KAAK,IAAA,EAAM;AACzB,gCAAA,IAAM4M,YAAW,IAAI,CAACtC,UAAU,CAACkH,uBAAuB,CAACpF,KAAAA,CAAAA;AACzD,gCAAA,IAAIQ,SAAAA,EAAU;oCACZ,IAAIA,SAAAA,CAAS/F,UAAU,KAAKiF,MAAAA,EAAQ;wCAClC,IAAM7J,WAAAA,GAAamK,MAAKnK,UAAU;wCAClC,OAAO;4CACLmK,IAAAA,EAAMnK,WAAAA;AACN6J,4CAAAA,MAAAA,EAAQ5J,MAAMC,IAAI,CAACF,YAAWG,UAAU,CAAA,CAAEC,OAAO,CAAC+J,KAAAA;AACpD,yCAAA;AACF,oCAAA;AACF,gCAAA;AACF,4BAAA;AACA,4BAAA;AACF,wBAAA;AACA,wBAAA,IAAMQ,YAAW,IAAI,CAACtC,UAAU,CAACkH,uBAAuB,CAACpF,KAAAA,CAAAA;AACzD,wBAAA,IAAIQ,SAAAA,EAAU;AACZ,4BAAA,IAAId,UAAUc,SAAAA,CAAS/F,UAAU,IAAIiF,MAAAA,IAAUc,SAAAA,CAAS1F,QAAQ,EAAE;gCAChE,OAAO;oCACLkF,IAAAA,EAAMA,KAAAA;oCACNN,MAAAA,EAAQA,MAAAA,GAASc,UAAS/F;AAC5B,iCAAA;AACF,4BAAA;AACF,wBAAA;AACF,oBAAA;;AAzBK,oBAAA,kBAAA,GAAA,IAAA;AAAA,oBAAA,eAAA,GAAA,GAAA;;;6BAAA,0BAAA,IAAA,UAAA,CAAA,MAAA,IAAA,IAAA,EAAA;AAAA,4BAAA,UAAA,CAAA,MAAA,EAAA;;;AAAA,wBAAA,IAAA,kBAAA,EAAA;AAAA,4BAAA,MAAA,eAAA;;;;gBA0BL,OAAO,IAAA;AACT,YAAA;;;YAEQ4J,GAAAA,EAAAA,sBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,oBAAAA,CAAqBrE,IAAU,EAAEN,MAAc,EAAE6F,OAAgB,EAAA;AAAEC,gBAAAA,IAAAA,YAAAA,GAAAA,iEAAuB,EAAE;AAClGA,gBAAAA,YAAAA,CAAa5C,IAAI,CAAC5C,IAAAA,CAAAA;AAClB,gBAAA,IAAIA,IAAAA,CAAKvK,QAAQ,KAAKC,IAAAA,CAAKS,YAAY,EAAE;AACvC,oBAAA,IAAMsP,oBAAoB,IAAI,CAACvH,UAAU,CAACkH,uBAAuB,CAACpF,IAAAA,CAAAA;AAClE,oBAAA,IAAM0F,SAAAA,GAAY1F,IAAAA,CAAKhK,UAAU,CAAC0J,MAAAA,CAAO;AACzC,oBAAA,IAAIgG,SAAAA,EAAW;AACb,wBAAA,IAAMC,gBAAgB,IAAI,CAACzH,UAAU,CAACkH,uBAAuB,CAACM,SAAAA,CAAAA;AAC9D,wBAAA,IAAIC,aAAAA,EAAe;AACjB,4BAAA,IAAIF,iBAAAA,EAAmB;gCACrB,OAAO;AACL7L,oCAAAA,IAAAA,EAAM+L,cAAc/L,IAAI;AACxB8F,oCAAAA,MAAAA,EAAQiG,cAAclL;AACxB,iCAAA;AACF,4BAAA;AACA,4BAAA,OAAO,IAAI,CAACmL,aAAa,CAACF,WAAWH,OAAAA,EAASC,YAAAA,CAAAA;AAChD,wBAAA;AACA,wBAAA,OAAO,IAAI,CAACI,aAAa,CAACF,WAAWH,OAAAA,EAASC,YAAAA,CAAAA;AAChD,oBAAA;AACA,oBAAA,IAAMK,QAAAA,GAAW7F,IAAAA,CAAKhK,UAAU,CAAC0J,SAAS,CAAA,CAAE;AAC5C,oBAAA,IAAImG,QAAAA,EAAU;AACZ,wBAAA,IAAMC,eAAe,IAAI,CAAC5H,UAAU,CAACkH,uBAAuB,CAACS,QAAAA,CAAAA;AAC7D,wBAAA,IAAIC,gBAAgBL,iBAAAA,EAAmB;4BACrC,OAAO;AACL7L,gCAAAA,IAAAA,EAAMkM,aAAalM,IAAI;AACvB8F,gCAAAA,MAAAA,EAAQoG,aAAahL;AACvB,6BAAA;AACF,wBAAA;AACF,oBAAA;AACA,oBAAA,IAAI2K,iBAAAA,EAAmB;wBACrB,OAAO;AACL7L,4BAAAA,IAAAA,EAAM6L,kBAAkB7L,IAAI;AAC5B8F,4BAAAA,MAAAA,EAAQ+F,kBAAkB3K;AAC5B,yBAAA;AACF,oBAAA;AACA,oBAAA,IAAMiL,WAAWR,OAAAA,GAAUvF,IAAAA,CAAKnF,WAAW,GAAGmF,KAAKgG,eAAe;AAClE,oBAAA,IAAID,QAAAA,EAAU;AACZ,wBAAA,OAAO,IAAI,CAACH,aAAa,CAACG,UAAUR,OAAAA,EAASC,YAAAA,CAAAA;AAC/C,oBAAA;AACA,oBAAA,OAAO,IAAI,CAACS,qBAAqB,CAACjG,MAAMuF,OAAAA,EAASC,YAAAA,CAAAA;AACnD,gBAAA,CAAA,MAAO,IAAIxF,IAAAA,CAAKvK,QAAQ,KAAKC,IAAAA,CAAKC,SAAS,EAAE;AAC3C,oBAAA,IAAM8P,qBAAoB,IAAI,CAACvH,UAAU,CAACkH,uBAAuB,CAACpF,IAAAA,CAAAA;AAClE,oBAAA,IAAIyF,kBAAAA,EAAmB;wBACrB,OAAO;AACL7L,4BAAAA,IAAAA,EAAM6L,mBAAkB7L,IAAI;4BAC5B8F,MAAAA,EAAQ+F,kBAAAA,CAAkBhL,UAAU,GAAGiF;AACzC,yBAAA;AACF,oBAAA;AACA,oBAAA,IAAMqG,YAAWR,OAAAA,GAAUvF,IAAAA,CAAKnF,WAAW,GAAGmF,KAAKgG,eAAe;AAClE,oBAAA,IAAID,SAAAA,EAAU;AACZ,wBAAA,OAAO,IAAI,CAACH,aAAa,CAACG,WAAUR,OAAAA,EAASC,YAAAA,CAAAA;AAC/C,oBAAA;AACA,oBAAA,OAAO,IAAI,CAACS,qBAAqB,CAACjG,MAAMuF,OAAAA,EAASC,YAAAA,CAAAA;AACnD,gBAAA;gBACA,OAAO,IAAA;AACT,YAAA;;;YAEQI,GAAAA,EAAAA,eAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,cAAc5F,IAAU,EAAA;AAAEuF,gBAAAA,IAAAA,OAAAA,GAAAA,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,MAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAU,KAAA,EAAOC,YAAAA,GAAAA,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,MAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAuB,EAAE;gBAC1E,IAAIA,YAAAA,CAAajB,QAAQ,CAACvE,IAAAA,CAAAA,EAAO;AAC/B,oBAAA,IAAMM,OAAOiF,OAAAA,GAAUvF,IAAAA,CAAKnF,WAAW,GAAGmF,KAAKgG,eAAe;AAC9D,oBAAA,IAAI1F,IAAAA,EAAM;AACR,wBAAA,OAAO,IAAI,CAACsF,aAAa,CAACtF,MAAMiF,OAAAA,EAASC,YAAAA,CAAAA;AAC3C,oBAAA;AACA,oBAAA,OAAO,IAAI,CAACS,qBAAqB,CAACjG,MAAMuF,OAAAA,EAASC,YAAAA,CAAAA;AACnD,gBAAA;AACAA,gBAAAA,YAAAA,CAAa5C,IAAI,CAAC5C,IAAAA,CAAAA;AAClB,gBAAA,IAAMQ,WAAW,IAAI,CAACtC,UAAU,CAACkH,uBAAuB,CAACpF,IAAAA,CAAAA;AACzD,gBAAA,IAAIQ,QAAAA,EAAU;oBACZ,OAAO;AACL5G,wBAAAA,IAAAA,EAAM4G,SAAS5G,IAAI;AACnB8F,wBAAAA,MAAAA,EAAQ6F,OAAAA,GAAU/E,QAAAA,CAAS/F,UAAU,GAAG+F,SAAS1F;AACnD,qBAAA;AACF,gBAAA;AACA,gBAAA,IAAMF,aAAa2K,OAAAA,GAAUvF,IAAAA,CAAKpF,UAAU,GAAGoF,KAAK3I,SAAS;AAC7D,gBAAA,IAAIuD,UAAAA,EAAY;AACd,oBAAA,OAAO,IAAI,CAACgL,aAAa,CAAChL,YAAY2K,OAAAA,EAASC,YAAAA,CAAAA;AACjD,gBAAA;AACA,gBAAA,IAAM3K,cAAc0K,OAAAA,GAAUvF,IAAAA,CAAKnF,WAAW,GAAGmF,KAAKgG,eAAe;AACrE,gBAAA,IAAInL,WAAAA,EAAa;AACf,oBAAA,OAAO,IAAI,CAAC+K,aAAa,CAAC/K,aAAa0K,OAAAA,EAASC,YAAAA,CAAAA;AAClD,gBAAA;AACA,gBAAA,OAAO,IAAI,CAACS,qBAAqB,CAACjG,MAAMuF,OAAAA,EAASC,YAAAA,CAAAA;AACnD,YAAA;;;YAEQS,GAAAA,EAAAA,uBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,qBAAAA,CAAsBjG,IAAU,EAAEuF,OAAgB,EAAEC,YAAoB,EAAA;gBAC9E,IAAM3P,UAAAA,GAAamK,KAAKnK,UAAU;AAClC,gBAAA,IAAIA,UAAAA,EAAY;AACd,oBAAA,IAAMqQ,iBAAiB,IAAI,CAAChI,UAAU,CAACkH,uBAAuB,CAACvP,UAAAA,CAAAA;AAC/D,oBAAA,IAAIqQ,cAAAA,EAAgB;wBAClB,OAAO;AACLtM,4BAAAA,IAAAA,EAAMsM,eAAetM,IAAI;AACzB8F,4BAAAA,MAAAA,EAAQ6F,OAAAA,GAAUW,cAAAA,CAAepL,QAAQ,GAAGoL,eAAezL;AAC7D,yBAAA;AACF,oBAAA;AACA+K,oBAAAA,YAAAA,CAAa5C,IAAI,CAAC5C,IAAAA,CAAAA;AAClB,oBAAA,OAAO,IAAI,CAAC4F,aAAa,CAAC/P,YAAY0P,OAAAA,EAASC,YAAAA,CAAAA;AACjD,gBAAA;gBACA,OAAO,IAAA;AACT,YAAA;;;AA/mBW1I,IAAAA,OAAAA,eAAAA;AAgnBZ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClnBD,IAAMqJ,UAAAA,GAAa,qlBAAA;AA0BnB,IAAA,iBAAMC,iBAAN,WAAA;AAAMA,IAAAA,SAAAA,iBAAAA,CAuCF,WAA+B,EAC/B,SAA4B,EAC5B,UAA+B,EAAA;;AAzC7BA,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,iBAAAA,CAAAA;;;;AACJC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,oBAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,iBAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,cAAAA,MAAAA,CAAAA;AACAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,kBAAAA,MAAAA,CAAAA;AAEAC,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,YAAAA,MAAAA,CAAAA;AAWA,QAAArJ,kBAAA,CAAA,IAAA,EAAQsJ,SAAR,MAAA,CAAA;AACA,QAAAtJ,kBAAA,CAAA,IAAA,EAAQuJ,SAAR,MAAA,CAAA;AAWA,QAAAvJ,kBAAA,CAAA,IAAA,EAAQwJ,YAAR,MAAA,CAAA;AACA,QAAAxJ,kBAAA,CAAA,IAAA,EAAQyJ,YAAR,MAAA,CAAA;AAEA,QAAAzJ,kBAAA,CAAA,IAAA,EAAQ0J,gBAAR,MAAA,CAAA;AAEA,QAAA1J,kBAAA,CAAA,IAAA,EAAQ2J,uBAAR,MAAA,CAAA;AACA,QAAA3J,kBAAA,CAAA,IAAA,EAAQ4J,oBAAR,MAAA,CAAA;AACA,QAAA5J,kBAAA,CAAA,IAAA,EAAQ6J,YAAR,MAAA,CAAA;aAGUC,WAAAA,GAAAA,WAAAA;aACAjJ,SAAAA,GAAAA,SAAAA;aACAkJ,UAAAA,GAAAA,UAAAA;aArCVX,cAAAA,GAAiB,KAAA;aAEjBC,QAAAA,GAAW,WAAA;YACT,OAAO;gBACLhQ,GAAAA,EAAK,CAAA;gBACL2Q,MAAAA,EAAQrT,QAAAA,CAASsT,eAAe,CAACC;AACnC,aAAA;AACF,QAAA,CAAA;aAMQZ,KAAAA,GAAa,IAAA;aAYbE,QAAAA,GAAW,IAAA;aACXC,QAAAA,GAAW,IAAA;AAEXC,QAAAA,IAAAA,CAAAA,YAAAA,GAAe,IAAIS,YAAAA,EAAAA;AAEnBR,QAAAA,IAAAA,CAAAA,mBAAAA,GAAsB,IAAI/K,OAAAA,EAAAA;AAC1BgL,QAAAA,IAAAA,CAAAA,gBAAAA,GAAmB,IAAIhL,OAAAA,EAAAA;aACvBiL,QAAAA,GAAyB,IAAA;QAM/B,IAAI,CAACZ,gBAAgB,GAAG,IAAI,CAACU,mBAAmB,CAACzI,IAAI,CAACkJ,oBAAAA,EAAAA,CAAAA;AACtD,QAAA,IAAI,CAAClB,aAAa,GAAG,IAAI,CAACU,gBAAgB,CAAC3I,YAAY,EAAA;AACvD,QAAA,IAAI,CAACkI,UAAU,GAAG5S,aAAAA,CAAc,KAAA,EAAO;YACrCgB,MAAAA,EAAQ;gBACN6L,QAAAA,EAAU,UAAA;gBACV9J,KAAAA,EAAO,KAAA;gBACP+Q,aAAAA,EAAe;AACjB,aAAA;YACA3S,QAAAA,EAAU;AACR,gBAAA,IAAI,CAAC6R,KAAK,GAAGhT,aAAAA,CAAc,MAAA,EAAQ;oBACjCgB,MAAAA,EAAQ;wBACN+B,KAAAA,EAAO,MAAA;wBACPE,MAAAA,EAAQ,MAAA;wBACR4J,QAAAA,EAAU,UAAA;wBACVjK,IAAAA,EAAM,CAAA;wBACNE,GAAAA,EAAK;AACP;AACF,iBAAA;AACD;AACH,SAAA,CAAA;QAEA,IAAI,CAACqQ,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAU5K,QAAAA,EAAU,WAAA,CAAA,CAAayK,SAAS,CAAC,WAAA;AACzC,YAAA,KAAA,CAAKqI,QAAQ,GAAG,KAAA;AAClB,QAAA,CAAA,CAAA,EACAlI,SAAAA,CAAU5K,QAAAA,EAAU,SAAA,CAAA,CAAWyK,SAAS,CAAC,WAAA;AACvC,YAAA,KAAA,CAAKqI,QAAQ,GAAG,IAAA;AAClB,QAAA,CAAA,CAAA,CAAA;AAEF,QAAA,IAAI,CAACM,UAAU,CAACjS,WAAW,CAAC,IAAI,CAACqR,UAAU,CAAA;;AAvEzCH,IAAAA,eAAAA,CAAAA,iBAAAA,EAAAA;;YAaA9P,GAAAA,EAAAA,MAAAA;AAAJ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;AACE,gBAAA,OAAO,IAAI,CAACqQ,KAAK,CAAC/Q,qBAAqB,EAAA;AACzC,YAAA;;;YAKY6B,GAAAA,EAAAA,SAAAA;AAKZ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;gBACE,OAAO,IAAI,CAACmP,QAAQ;AACtB,YAAA,CAAA;AAPA,YAAA,GAAA,EAAA,SAAA,GAAA,CAAoBc,CAAU,EAAA;gBAC5B,IAAI,CAACd,QAAQ,GAAGc,CAAAA;gBAChB,IAAI,CAACf,KAAK,CAAC9R,KAAK,CAAC8S,UAAU,GAAGD,IAAI,SAAA,GAAY,QAAA;AAChD,YAAA;;;YAmDAE,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;gBACE,IAAI,IAAI,CAACX,QAAQ,EAAE;AACjB,oBAAA,IAAI,CAACY,IAAI,CAAC,IAAI,CAACZ,QAAQ,EAAE,KAAA,CAAA;AAC3B,gBAAA;AACF,YAAA;;;YAEAY,GAAAA,EAAAA,MAAAA;mBAAAA,SAAAA,IAAAA,CAAKvS,KAAY,EAAEwS,OAAgB,EAAA;;gBACjC,IAAI,CAACb,QAAQ,GAAG3R,KAAAA;AAChB,gBAAA,IAAIwS,WAAW,IAAI,CAAC7J,SAAS,CAAC8J,yBAAyB,EAAE;oBACvDnG,YAAAA,CAAa,IAAI,CAAC8E,KAAK,CAAA;AACzB,gBAAA;gBACA,IAAI,CAACsB,oBAAoB,CAAC1S,KAAAA,CAAAA;gBAC1B,IAAIA,KAAAA,CAAMqB,SAAS,EAAE;AACnB,oBAAA,IAAImR,WAAW,IAAI,CAAC7J,SAAS,CAAC8J,yBAAyB,EAAE;wBACvD,IAAI,CAACtQ,OAAO,GAAG,IAAA;AACf,wBAAA,IAAMwQ,cAAAA,GAAiB,SAAA,eAAA,GAAA;4BACrB,KAAA,CAAKxQ,OAAO,GAAG,CAAC,KAAA,CAAKA,OAAO,IAAI,CAAC,MAAKoP,QAAQ;4BAC9C,KAAA,CAAKH,KAAK,GAAG9F,UAAAA,CAAWqH,cAAAA,EAAgB,GAAA,CAAA;AAC1C,wBAAA,CAAA;wBACArG,YAAAA,CAAa,IAAI,CAAC8E,KAAK,CAAA;AACvB,wBAAA,IAAI,CAACA,KAAK,GAAG9F,UAAAA,CAAWqH,cAAAA,EAAgB,GAAA,CAAA;AAC1C,oBAAA;gBACF,CAAA,MAAO;oBACL,IAAI,CAACxQ,OAAO,GAAG,KAAA;oBACfmK,YAAAA,CAAa,IAAI,CAAC8E,KAAK,CAAA;AACzB,gBAAA;AACF,YAAA;;;YAEAwB,GAAAA,EAAAA,MAAAA;mBAAAA,SAAAA,IAAAA,GAAAA;gBACE,IAAI,CAACzQ,OAAO,GAAG,KAAA;gBACfmK,YAAAA,CAAa,IAAI,CAAC8E,KAAK,CAAA;AACvB,gBAAA,IAAI,CAACK,mBAAmB,CAACzG,IAAI,CAAC,IAAA,CAAA;AAChC,YAAA;;;YAEAc,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;gBACEQ,YAAAA,CAAa,IAAI,CAAC8E,KAAK,CAAA;;gBAEvB,IAAI,CAACI,YAAY,CAACzF,WAAW,EAAA;AAC/B,YAAA;;;YAEQ2G,GAAAA,EAAAA,sBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,qBAAqBjI,WAAkB,EAAA;gBAC7C,IAAMxK,cAAAA,GAAiBwK,YAAYxK,cAAc;gBAEjD,IAAMyK,IAAAA,GAAQzK,eAAeE,QAAQ,KAAKC,KAAKS,YAAY,GAAGZ,cAAAA,GAAiBA,cAAAA,CAAeM,UAAU;gBACxG,IAAImK,CAAAA,iBAAAA,IAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,IAAAA,CAAMvK,QAAQ,MAAKC,IAAAA,CAAKS,YAAY,EAAE;AACxC,oBAAA,IAAI,CAAC4Q,mBAAmB,CAACzG,IAAI,CAAC,IAAA,CAAA;AAC9B,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAM6H,eAAAA,GAAkB,IAAI,CAACjB,WAAW,CAACiB,eAAe;AACxD,gBAAA,IAAIA,eAAAA,EAAiB;AACnBpI,oBAAAA,WAAAA,GAAcA,YAAY0D,UAAU,EAAA;AACpC1D,oBAAAA,WAAAA,CAAYqI,kBAAkB,CAACD,eAAAA,CAAAA;AAC/BpI,oBAAAA,WAAAA,CAAYE,QAAQ,EAAA;AACtB,gBAAA;AACA,gBAAA,IAAM3J,OAAOjB,oBAAAA,CAAqB0K,WAAAA,CAAAA;AAClC,gBAAA,IAAqDsI,iBAAAA,GAAAA,gBAAAA,CAAiBrI,IAAAA,CAAAA,EAA9DsI,QAAAA,GAA6CD,iBAAAA,CAA7CC,QAAAA,EAAUC,UAAAA,GAAmCF,iBAAAA,CAAnCE,UAAAA,EAAYC,KAAAA,GAAuBH,iBAAAA,CAAvBG,KAAAA,EAAOC,cAAgBJ,iBAAAA,CAAhBI,WAAAA;gBAErC,IAAI7R,MAAAA;gBACJ,IAAI8R,KAAAA,CAAM,CAACH,UAAAA,CAAAA,EAAa;AACtB,oBAAA,IAAMhO,IAAIoO,UAAAA,CAAWJ,UAAAA,CAAAA;AACrB,oBAAA,IAAIG,MAAMnO,CAAAA,CAAAA,EAAI;AACZ3D,wBAAAA,MAAAA,GAAS+R,UAAAA,CAAWL,QAAAA,CAAAA;oBACtB,CAAA,MAAO;wBACL1R,MAAAA,GAAS2D,CAAAA;AACX,oBAAA;gBACF,CAAA,MAAO;oBACL3D,MAAAA,GAAS+R,UAAAA,CAAWL,YAAYK,UAAAA,CAAWJ,UAAAA,CAAAA;AAC7C,gBAAA;AAEA,gBAAA,IAAMK,SAAAA,GAAYnM,IAAAA,CAAKoM,GAAG,CAACpM,IAAAA,CAAKqM,KAAK,CAACrM,IAAAA,CAAKoM,GAAG,CAACjS,MAAAA,EAAQN,IAAAA,CAAKM,MAAM,CAAA,CAAA,EAAI,EAAA,CAAA;;gBAGtE,IAAImS,OAAAA,GAAUzS,KAAKG,GAAG;gBACtB,IAAIH,IAAAA,CAAKM,MAAM,GAAGA,MAAAA,EAAQ;AACxBmS,oBAAAA,OAAAA,IAAW,CAACnS,MAAAA,GAASN,IAAAA,CAAKM,MAAM,IAAI,CAAA;AACtC,gBAAA;gBAEAmS,OAAAA,GAAUtM,IAAAA,CAAKqM,KAAK,CAACC,OAAAA,CAAAA;AAErB,gBAAA,IAAMC,aAAAA,GAAgB,IAAI,CAAC7B,UAAU,CAACvR,qBAAqB,EAAA;AAE3D,gBAAA,IAAMa,MAAMgG,IAAAA,CAAKqM,KAAK,CAACC,OAAAA,GAAUC,cAAcvS,GAAG,CAAA;AAClD,gBAAA,IAAMF,IAAAA,GAAOkG,IAAAA,CAAKqM,KAAK,CAACxS,IAAAA,CAAKC,IAAI,GAAGD,IAAAA,CAAKI,KAAK,GAAG,CAAA,GAAIsS,aAAAA,CAAczS,IAAI,CAAA;AACvE,gBAAA,IAAI0S,MAAAA,GAAS,CAAA;gBACb,IAAIlJ,WAAAA,CAAYpJ,SAAS,EAAE;AACzBsS,oBAAAA,MAAAA,GAASxM,IAAAA,CAAKyM,KAAK,CAACzM,IAAAA,CAAK0M,KAAK,CAAC7S,IAAAA,CAAKI,KAAK,EAAEJ,IAAAA,CAAKM,MAAM,CAAA,GAAI,GAAA,GAAM6F,KAAK2M,EAAE,CAAA;AAEvE,oBAAA,IAAIH,WAAW,CAAA,EAAG;wBAChB,IAAMI,OAAAA,GAAUtV,QAAAA,CAASJ,aAAa,CAAC,MAAA,CAAA;;wBAEvC0V,OAAAA,CAAQxU,KAAK,CAACyU,OAAO,GAAG,yHAAA;wBACxB,IAAMC,QAAAA,GAAWxV,QAAAA,CAASJ,aAAa,CAAC,MAAA,CAAA;wBACxC4V,QAAAA,CAAS1U,KAAK,CAACyU,OAAO,GAAG,uDAAA;AACzBD,wBAAAA,OAAAA,CAAQG,MAAM,CAACD,QAAAA,CAAAA;AACfvJ,wBAAAA,IAAAA,CAAKwJ,MAAM,CAACH,OAAAA,CAAAA;wBAEZ,IAAMI,EAAAA,GAAKF,SAAS3T,qBAAqB,EAAA;wBACzC2T,QAAAA,CAAS1U,KAAK,CAAC2B,KAAK,GAAG,GAAA;wBACvB+S,QAAAA,CAAS1U,KAAK,CAAC0B,IAAI,GAAG,EAAA;wBACtB,IAAMmT,EAAAA,GAAKH,SAAS3T,qBAAqB,EAAA;AAEzC,wBAAA,IAAM+T,CAAAA,GAAIF,EAAAA,CAAGE,CAAC,GAAGD,GAAGC,CAAC;AACrB,wBAAA,IAAMC,CAAAA,GAAIH,EAAAA,CAAGG,CAAC,GAAGF,GAAGE,CAAC;AAErBX,wBAAAA,MAAAA,GAASxM,KAAK0M,KAAK,CAACS,GAAGD,CAAAA,CAAAA,GAAK,GAAA,GAAMlN,KAAK2M,EAAE;AACzCC,wBAAAA,OAAAA,CAAQQ,MAAM,EAAA;AAChB,oBAAA;AACF,gBAAA;gBACA,IAAIpB,WAAAA,KAAgB,aAAA,IAAiBA,WAAAA,KAAgB,aAAA,EAAe;oBAClEQ,MAAAA,IAAU,EAAA;AACZ,gBAAA;AACA5U,gBAAAA,MAAAA,CAAOO,MAAM,CAAC,IAAI,CAAC2R,UAAU,CAAC1R,KAAK,EAAE;AACnC0B,oBAAAA,IAAAA,EAAMA,IAAAA,GAAO,IAAA;AACbE,oBAAAA,GAAAA,EAAKA,GAAAA,GAAM,IAAA;AACXG,oBAAAA,MAAAA,EAAQgS,SAAAA,GAAY,IAAA;AACpBL,oBAAAA,UAAAA,EAAYK,SAAAA,GAAY,IAAA;oBACxBN,QAAAA,EAAAA,QAAAA;oBACAwB,SAAAA,EAAY,SAAA,CAAgB,MAAA,CAAPb,MAAAA,EAAO,MAAA;AAC9B,iBAAA,CAAA;gBAEA,IAAI,CAACtC,KAAK,CAAC9R,KAAK,CAACkV,eAAe,GAAGvB,KAAAA,KAAU,kBAAA,GAAqB,MAAA,GAASA,KAAAA;AAC3E,gBAAA,IAAI,CAACxB,gBAAgB,CAAC1G,IAAI,CAAC;AACzB1J,oBAAAA,MAAAA,EAAQgS,SAAAA,GAAY,IAAA;AACpBL,oBAAAA,UAAAA,EAAYK,SAAAA,GAAY,IAAA;oBACxBN,QAAAA,EAAAA;AACF,iBAAA,CAAA;AACA,gBAAA,IAAI,CAACvB,mBAAmB,CAACzG,IAAI,CAAC;oBAC5B/J,IAAAA,EAAAA,IAAAA;oBACAE,GAAAA,EAAKsS,OAAAA;oBACLnS,MAAAA,EAAQgS;AACV,iBAAA,CAAA;gBAEA,IAAI,IAAI,CAACpC,cAAc,EAAE;oBACvB,IAAI,CAACA,cAAc,GAAG,KAAA;AACtB,oBAAA,IAAMwD,QAAAA,GAAW,IAAI,CAACzD,UAAU,CAAC3Q,qBAAqB,EAAA;AACtD,oBAAA,IAAMqU,eAAAA,GAAkB,IAAI,CAACC,kBAAkB,CAAC3U,cAAAA,CAAAA;AAChD,oBAAA,IAAM4U,UAAAA,GAAaF,eAAAA,KAAoBlW,QAAAA,CAASsT,eAAe,GAC7D;wBAAE5Q,GAAAA,EAAK,CAAA;wBAAG2Q,MAAAA,EAAQrT,QAAAA,CAASsT,eAAe,CAACC;AAAa,qBAAA,GACxD2C,gBAAgBrU,qBAAqB,EAAA;oBACvC,IAAMwU,KAAAA,GAAQ,IAAI,CAAC3D,QAAQ,EAAA;oBAE3B,IAAMhQ,IAAAA,GAAMgG,KAAKoM,GAAG,CAACuB,MAAM3T,GAAG,EAAE0T,WAAW1T,GAAG,CAAA;oBAC9C,IAAM2Q,MAAAA,GAAS3K,KAAK4N,GAAG,CAACD,MAAMhD,MAAM,EAAE+C,WAAW/C,MAAM,CAAA;oBAEvD,IAAI4C,QAAAA,CAASvT,GAAG,GAAGA,IAAAA,EAAK;AACtBwT,wBAAAA,eAAAA,CAAgBK,SAAS,IAAI7T,IAAAA,GAAMuT,QAAAA,CAASvT,GAAG;AACjD,oBAAA,CAAA,MAAO,IAAIuT,QAAAA,CAAS5C,MAAM,GAAGA,MAAAA,EAAQ;AACnC6C,wBAAAA,eAAAA,CAAgBK,SAAS,IAAIN,QAAAA,CAAS5C,MAAM,GAAGA,MAAAA;AACjD,oBAAA;AACF,gBAAA;AACF,YAAA;;;YAEQ8C,GAAAA,EAAAA,oBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,mBAAmBK,SAAe,EAAA;AACxC,gBAAA,MAAOA,SAAAA,CAAW;oBAChB,IAAarQ,aAAA,CAATqQ,SAAAA,EAAqBjF,OAAAA,CAAAA,EAAS;AAChC,wBAAA,IAAM3Q,SAAS0T,gBAAAA,CAAiBkC,SAAAA,CAAAA;wBAChC,IAAI5V,MAAAA,CAAO6V,QAAQ,KAAK,SAAA,IAAa7V,MAAAA,CAAO8V,SAAS,KAAK,SAAA,IAAa9V,MAAAA,CAAO+V,SAAS,KAAK,SAAA,EAAW;4BACrG,OAAOH,SAAAA;AACT,wBAAA;AACF,oBAAA;AACAA,oBAAAA,SAAAA,GAAYA,UAAU1U,UAAU;AAClC,gBAAA;AACA,gBAAA,OAAO9B,SAASsT,eAAe;AACjC,YAAA;;;AA7OIjB,IAAAA,OAAAA,iBAAAA;;AAqPC,IAAA,UAAMuE,iBAAN,SAAA,KAAA,EAAA;AAAMA,IAAAA,WAAAA,CAAAA,UAAAA,EAAAA,KAAAA,CAAAA;aAAAA,UAAAA,CAiCSzM,UAAsB,EACtB0M,MAAc,EACdC,QAAkB,EAC1B,SAA4B,EAC5B,SAA4B,EAC5B,UAA8B,EAC9B,SAA4B,EACpBnS,OAAgB,EAAA;AAxCzBiS,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,UAAAA,CAAAA;;AAyCT,QAAA,KAAA,GAAA7O,aAAA,CAAA,IAAA,EAzCS6O,UAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,YAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,QAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,UAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,YAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,SAAAA,EAAAA,MAAAA,CAAAA,EACXxH,kBAAAA,CAAAA,KAAAA,EAAAA,aAAAA,EAAAA,MAAAA,CAAAA,EACA2H,kBAAAA,CAAAA,KAAAA,EAAAA,SAAAA,EAAAA,MAAAA,CAAAA,EACAnE,kBAAAA,CAAAA,KAAAA,EAAAA,OAAAA,EAAAA,MAAAA,CAAAA,EAaAvJ,kBAAA,CAAA,KAAA,EAAQnF,UAAAA,EAAR,MAAA,CAAA,EACAmF,kBAAA,CAAA,KAAA,EAAQlF,WAAAA,EAAR,MAAA,CAAA,EACAkF,kBAAA,CAAA,KAAA,EAAQpF,OAAAA,EAAR,MAAA,CAAA,EACAoF,kBAAA,CAAA,KAAA,EAAQxF,WAAAA,EAAR,MAAA,CAAA,EACAwF,kBAAA,CAAA,KAAA,EAAQ2N,WAAAA,EAAR,MAAA,CAAA,EACA3N,kBAAA,CAAA,KAAA,EAAQmN,WAAAA,EAAR,MAAA,CAAA,EAEAnN,kBAAA,CAAA,KAAA,EAAQ0J,cAAAA,EAAR,MAAA,CAAA,EACA1J,kBAAA,CAAA,KAAA,EAAQ4N,KAAAA,EAAR,MAAA,CAAA,EAEA5N,kBAAA,CAAA,KAAA,EAAQ6N,UAAAA,EAAR,MAAA,CAAA,EAEA7N,kBAAA,CAAA,KAAA,EAAQ8N,SAAAA,EAAR,MAAA,CAAA,EACA9N,kBAAA,CAAA,KAAA,EAAQ+N,aAAAA,EAAR,MAAA,CAAA,EAEA/N,kBAAA,CAAA,KAAA,EAAQgO,mBAAAA,EAAR;AAEoBlN,SAAAA,EAAAA,KAAAA,CAAAA,UAAAA,GAAAA,kBACA0M,MAAAA,GAAAA,MAAAA,EAAAA,KAAAA,CACAC,WAAAA,QAAAA,EAAAA,KAAAA,CACAQ,SAAAA,GAAAA,iBACAvN,SAAAA,GAAAA,SAAAA,EAAAA,KAAAA,CACAd,UAAAA,GAAAA,UAAAA,EAAAA,KAAAA,CACAiB,YAAAA,SAAAA,EAAAA,KAAAA,CACAvF,OAAAA,GAAAA,eAvCpByK,WAAAA,GAAc,KAAA,EAAA,KAAA,CAeNlL,WAAWA,QAAAA,EAAAA,EAAAA,KAAAA,CACXC,SAAAA,GAAYA,SAAAA,EAAAA,EAAAA,KAAAA,CACZF,KAAAA,GAAQA,eACRJ,SAAAA,GAAYA,SAAAA,EAAAA,EAAAA,KAAAA,CACZmT,YAAY,KAAA,EAAA,KAAA,CACZR,SAAAA,GAAY,MAAKe,mBAAmB,EAAA,EAAA,KAAA,CAEpCxE,YAAAA,GAAe,IAAIS,sBAGnB0D,QAAAA,GAAuC,IAAA,EAAA,KAAA,CAEvCC,UAAU,KAAA,EAAA,KAAA,CACVC,WAAAA,GAAc,aAEdC,iBAAAA,GAAoB,KAAA;AAW1B,QAAA,KAAA,CAAKzE,KAAK,GAAG,IAAIP,iBAAAA,CAAkB,MAAKlI,UAAU,EAAE,KAAA,CAAKD,SAAS,EAAE,KAAA,CAAKvF,OAAO,CAAC0F,GAAG,CAAC5F,SAAAA,CAAAA,CAAAA;AACrF,QAAA,KAAA,CAAKsS,OAAO,GAAG,IAAI9J,OAAAA,CAAcC,SAAAA,OAAAA,EAAAA;YAC/B,KAAA,CAAK6F,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAU,MAAK4L,SAAS,EAAE,MAAA,CAAA,CAAQ/L,SAAS,CAAC,WAAA;AAC1C,gBAAA,IAAMwM,GAAAA,GAAM,KAAA,CAAKT,SAAS,CAACgB,eAAe;AAC1CP,gBAAAA,GAAAA,CAAIQ,IAAI,EAAA;AACRR,gBAAAA,GAAAA,CAAIS,KAAK,CAACtF,UAAAA,CAAAA;AACV6E,gBAAAA,GAAAA,CAAIU,KAAK,EAAA;AACT,gBAAA,KAAA,CAAKV,GAAG,GAAGA,GAAAA;AACX,gBAAA,KAAA,CAAKW,IAAI,EAAA;AACT1K,gBAAAA,OAAAA,EAAAA;AACF,YAAA,CAAA,CAAA,EACAjE,UAAAA,CAAW4O,qBAAqB,CAACpN,SAAS,CAAC,WAAA;gBACzC,IAAIxB,UAAAA,CAAWuB,QAAQ,EAAE;AACvB,oBAAA,KAAA,CAAKG,IAAI,EAAA;AACX,gBAAA;AACF,YAAA,CAAA,CAAA,CAAA;AAEJ,QAAA,CAAA,CAAA;AAEA,QAAA,KAAA,CAAKiI,KAAK,CAACJ,UAAU,CAACiD,MAAM,CAAC,MAAKe,SAAS,CAAA;;;AA9DlCI,IAAAA,eAAAA,CAAAA,UAAAA,EAAAA;;YAKPkB,GAAAA,EAAAA,UAAAA;AAOJ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;gBACE,OAAO,IAAI,CAACd,SAAS;AACvB,YAAA,CAAA;AATA,YAAA,GAAA,EAAA,SAAA,GAAA,CAAae,CAAU,EAAA;gBACrB,IAAI,CAACf,SAAS,GAAGe,CAAAA;AACjB,gBAAA,IAAIA,CAAAA,IAAK,IAAI,CAACb,QAAQ,EAAE;AACtB,oBAAA,IAAI,CAACA,QAAQ,CAACY,QAAQ,GAAGC,CAAAA;AAC3B,gBAAA;AACF,YAAA;;;YAuDArN,GAAAA,EAAAA,OAAAA;mBAAAA,SAAAA,KAAAA,CAAMnJ,KAAY,EAAEwS,OAAgB,EAAA;;AAClC,gBAAA,IAAI,CAAC,IAAI,CAAC+D,QAAQ,EAAE;AAClB,oBAAA,IAAI,CAAClF,KAAK,CAACkB,IAAI,CAACvS,KAAAA,EAAOwS,OAAAA,CAAAA;AACzB,gBAAA;AACA,gBAAA,IAAI,IAAI,CAAC9K,UAAU,CAACuB,QAAQ,EAAE;AAC5B,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI,CAAC,IAAI,CAAC2M,OAAO,EAAE;AACjB,oBAAA,IAAA,cAAA;AAAA,oBAAA,CAAA,cAAA,GAAA,IAAI,CAACD,QAAQ,MAAA,IAAA,IAAb,cAAA,KAAA,MAAA,GAAA,MAAA,GAAA,eAAexM,KAAK,EAAA;oBACpBmC,UAAAA,CAAW,WAAA;AACT,wBAAA,IAAI,CAAC,KAAA,CAAKuK,WAAW,IAAI,KAAA,CAAKD,OAAO,EAAE;AACrC,4BAAA,KAAA,CAAKa,MAAM,EAAA;AACb,wBAAA;AACF,oBAAA,CAAA,CAAA;AACF,gBAAA;gBACA,IAAI,CAACb,OAAO,GAAG,IAAA;AACjB,YAAA;;;YAEAxM,GAAAA,EAAAA,MAAAA;mBAAAA,SAAAA,IAAAA,GAAAA;AAEE,gBAAA,IAAA,cAAA;gBADA,IAAI,CAACiI,KAAK,CAACuB,IAAI,EAAA;AACf,gBAAA,CAAA,cAAA,GAAA,IAAI,CAAC+C,QAAQ,MAAA,IAAA,IAAb,cAAA,KAAA,MAAA,GAAA,MAAA,GAAA,eAAevM,IAAI,EAAA;gBACnB,IAAI,CAACwM,OAAO,GAAG,KAAA;AACjB,YAAA;;;YAEA9J,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;gBACE,IAAI,CAACuF,KAAK,CAACvF,OAAO,EAAA;gBAClB,IAAI,CAAC0F,YAAY,CAACzF,WAAW,EAAA;AAC/B,YAAA;;;YAEQ0K,GAAAA,EAAAA,QAAAA;mBAAR,SAAQA,MAAAA,GAAAA;;AAAO7I,gBAAAA,IAAAA,KAAAA,GAAAA,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,MAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAQ,KAAA;oBAErB,yBAAA,EAAA,cAAA;gBADA,IAAI,CAAC4D,YAAY,CAACzF,WAAW,EAAA;AAC7B,gBAAA,CAAA,cAAA,GAAA,IAAI,CAAC4J,QAAQ,MAAA,IAAA,IAAb,sCAAA,yBAAA,GAAA,cAAA,CAAepV,UAAU,MAAA,IAAA,IAAzB,gDAAA,yBAAA,CAA2B8B,WAAW,CAAC,IAAI,CAACsT,QAAQ,CAAA;gBACpD,IAAI,CAACnE,YAAY,GAAG,IAAIS,YAAAA,EAAAA;AACxB,gBAAA,IAAI,CAACoE,IAAI,EAAA;AACT,gBAAA,IAAIzI,KAAAA,EAAO;oBACTtC,UAAAA,CAAW,WAAA;AACT,wBAAA,IAAA,cAAA;AAAA,wBAAA,CAAA,cAAA,GAAA,KAAA,CAAKqK,QAAQ,MAAA,IAAA,IAAb,cAAA,KAAA,MAAA,GAAA,MAAA,GAAA,eAAexM,KAAK,EAAA;AACtB,oBAAA,CAAA,CAAA;gBACF,CAAA,MAAO;AACL,oBAAA,IAAA,eAAA;AAAA,oBAAA,CAAA,eAAA,GAAA,IAAI,CAACwM,QAAQ,MAAA,IAAA,IAAb,eAAA,KAAA,MAAA,GAAA,MAAA,GAAA,gBAAexM,KAAK,EAAA;AACtB,gBAAA;AACF,YAAA;;;YAEQkN,GAAAA,EAAAA,MAAAA;mBAAR,SAAQA,IAAAA,GAAAA;;gBACN,IAAMX,GAAAA,GAAM,IAAI,CAACA,GAAG;gBACpB,IAAMgB,WAAAA,GAAchB,IAAIrP,IAAI;gBAC5B,IAAMsP,QAAAA,GAAWD,GAAAA,CAAIrX,aAAa,CAAC,UAAA,CAAA;AACnCsX,gBAAAA,QAAAA,CAASY,QAAQ,GAAG,IAAI,CAACA,QAAQ;AACjCG,gBAAAA,WAAAA,CAAY9W,WAAW,CAAC+V,QAAAA,CAAAA;gBACxB,IAAI,CAACA,QAAQ,GAAGA,QAAAA;gBAChB,IAAI,CAACnE,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAUsM,QAAAA,EAAU,MAAA,CAAA,CAAQzM,SAAS,CAAC,WAAA;;;;;AAKpC,oBAAA,KAAA,CAAK0M,OAAO,GAAG,KAAA;AACf,oBAAA,KAAA,CAAKC,WAAW,GAAG,KAAA;oBACnB,KAAA,CAAKxE,KAAK,CAACuB,IAAI,EAAA;AACf,oBAAA,IAAI,KAAA,CAAKhK,UAAU,CAACiF,WAAW,EAAE;AAC/B,wBAAA,IAAMvJ,OAAO,KAAA,CAAKsE,UAAU,CAACiF,WAAW,CAACvJ,IAAI;wBAC7C,KAAA,CAAKsE,UAAU,CAACiF,WAAW,GAAG,IAAA;wBAC9B,KAAA,CAAKjF,UAAU,CAACiK,eAAe,GAAG,IAAA;wBAClCvO,IAAAA,CAAKqS,gBAAgB,CAACC,gBAAgB,EAAA;AACxC,oBAAA;AACF,gBAAA,CAAA,CAAA,EACAvN,SAAAA,CAAUsM,QAAAA,EAAU,OAAA,CAAA,CAASzM,SAAS,CAAC,WAAA;AACrC,oBAAA,KAAA,CAAK2M,WAAW,GAAG,IAAA;gBACrB,CAAA,CAAA,EACA,IAAI,CAACxE,KAAK,CAACL,aAAa,CAAC9H,SAAS,CAAC3J,SAAAA,KAAAA,EAAAA;AACjCR,oBAAAA,MAAAA,CAAOO,MAAM,CAACqW,QAAAA,CAASpW,KAAK,EAAEA,KAAAA,CAAAA;AAChC,gBAAA,CAAA,CAAA,CAAA;gBAEF,IAAI,CAACsX,WAAW,CAAClB,QAAAA,CAAAA;gBACjB,IAAI,CAACmB,cAAc,CAACnB,QAAAA,CAAAA;gBACpB,IAAI,CAACoB,oBAAoB,CAACpB,QAAAA,CAAAA;AAC5B,YAAA;;;YAEQoB,GAAAA,EAAAA,sBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,qBAAqBpB,QAA6B,EAAA;;AACxD,gBAAA,IAAI,CAACnE,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAA0BzG,SAAAA,EAAAA,GAAc+S,QAAAA,GAAWlX,QAAAA,EAAU,MAAA,CAAA,CAAQyK,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AAC7E,oBAAA,KAAA,CAAK0N,WAAW,CAAC1N,EAAAA,CAAAA;AACnB,gBAAA,CAAA,CAAA,EACAD,SAAAA,CAA0BsM,QAAAA,EAAU,OAAA,CAAA,CAASzM,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACrD,oBAAA,KAAA,CAAK2N,YAAY,CAAC3N,EAAAA,CAAAA;AACpB,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEA0N,GAAAA,EAAAA,aAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,YAAY1N,EAAkB,EAAA;gBAC5B,IAAMd,SAAAA,GAAY,IAAI,CAACA,SAAS;gBAChC,IAAI,CAACA,SAAAA,CAAU0O,UAAU,EAAE;AACzB,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI1O,SAAAA,CAAU2O,SAAS,KAAK3O,SAAAA,CAAU4O,OAAO,IAAI5O,SAAAA,CAAU+F,SAAS,GAAI/F,SAAAA,CAAUtI,WAAW,KAAM,CAAA,EAAG;AACpG,oBAAA,IAAMmX,UAAU7O,SAAAA,CAAU2O,SAAS,CAAE1H,iBAAiB,CAACjH,UAAUtI,WAAW,CAAA;AAC5E,oBAAA,IAAI,CAAA,OAAOmX,OAAAA,KAAAA,WAAAA,GAAAA,WAAAA,GAAPC,UAAA,CAAOD,OAAAA,CAAM,MAAM,QAAA,EAAU;wBAC/B,IAAME,aAAAA,GAAgBjO,GAAGiO,aAAa;wBACtC,IAAM3P,eAAAA,GAAkBnJ,SAASoK,YAAY,EAAA;wBAC7C,IAAM7I,KAAAA,GAAQ4H,eAAAA,CAAgB4D,UAAU,CAAC,CAAA,CAAA;wBACzC,IAAMgM,GAAAA,GAAM/Y,QAAAA,CAASJ,aAAa,CAAC,KAAA,CAAA;wBACnC,IAAMoZ,QAAAA,GAAWzX,MAAM0X,aAAa,EAAA;AACpCF,wBAAAA,GAAAA,CAAItD,MAAM,CAACuD,QAAAA,CAAAA;AACXF,wBAAAA,aAAAA,CAAcI,OAAO,CAAC,WAAA,EAAaH,GAAAA,CAAII,SAAS,CAAA;AAChDL,wBAAAA,aAAAA,CAAcI,OAAO,CAAC,MAAA,EAAQH,GAAAA,CAAItV,SAAS,CAAA;AAC3CoH,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,oBAAA;AACF,gBAAA;AACF,YAAA;;;YAEAZ,GAAAA,EAAAA,cAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,aAAa3N,EAAkB,EAAA;;AAC7B,gBAAA,IAAMwO,IAAAA,GAAOxO,EAAAA,CAAGiO,aAAa,CAAEQ,OAAO,CAAC,MAAA,CAAA;gBAEvC,IAAMC,KAAAA,GAAQxX,MAAMC,IAAI,CAAC6I,GAAGiO,aAAa,CAAES,KAAK,IAAI,EAAE,CAAA;AACtD,gBAAA,IAAMC,QAAQzX,KAAAA,CAAMC,IAAI,CAAC6I,EAAAA,CAAGiO,aAAa,CAAEU,KAAK,CAAA;gBAChD,IAAID,KAAAA,CAAME,KAAK,CAAC1O,SAAAA,IAAAA,EAAAA;2BAAQA,IAAAA,KAAS,OAAA;AAAYyO,gBAAAA,CAAAA,CAAAA,IAAAA,KAAAA,CAAMtW,MAAM,EAAE;AACzD+J,oBAAAA,OAAAA,CAAQyM,GAAG,CAACF,KAAAA,CAAMxY,MAAM,CAACC,SAAAA,CAAAA,EAAAA;AACvB,wBAAA,OAAO,QAAA,CAAS6C,IAAI,CAAC7C,CAAAA,CAAE8J,IAAI,CAAA;oBAC7B,CAAA,CAAA,CAAGtE,GAAG,CAACvF,SAAAA,IAAAA,EAAAA;AACL,wBAAA,IAAMyY,SAAS,IAAIC,UAAAA,EAAAA;wBACnB,OAAO,IAAI3M,QAAQC,SAAAA,OAAAA,EAAAA;4BACjByM,MAAAA,CAAOE,MAAM,GAAG,SAACC,KAAAA,EAAAA;gCACf5M,OAAAA,CAAQ4M,KAAAA,CAAMhP,MAAM,CAAE5E,MAAM,CAAA;AAC9B,4BAAA,CAAA;AACAyT,4BAAAA,MAAAA,CAAOI,aAAa,CAAC7Y,IAAAA,CAAAA;AACvB,wBAAA,CAAA,CAAA;oBACF,CAAA,CAAA,CAAA,CAAIiM,IAAI,CAAC6M,SAAAA,IAAAA,EAAAA;AACP,wBAAA,IAAMhV,IAAAA,GAAOgV,IAAAA,CAAKvT,GAAG,CAACxF,SAAAA,CAAAA,EAAAA;4BACpB,OAAQ,WAAA,CAAa,MAAA,CAAFA,CAAAA,EAAE,GAAA,CAAA;AACvB,wBAAA,CAAA,CAAA,CAAGgZ,IAAI,CAAC,EAAA,CAAA;wBACR,KAAA,CAAKC,KAAK,CAAClV,IAAAA,EAAMqU,IAAAA,CAAAA;AACnB,oBAAA,CAAA,CAAA;AACAxO,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACjB,oBAAA;AACF,gBAAA;AAEA,gBAAA,IAAML,MAAM,IAAI,CAAC9B,GAAG,CAACrX,aAAa,CAAC,KAAA,CAAA;gBACnCmZ,GAAAA,CAAIjY,KAAK,CAACyU,OAAO,GAAG,2FAAA;AACpBwD,gBAAAA,GAAAA,CAAI9N,eAAe,GAAG,MAAA;AACtB,gBAAA,IAAI,CAACgM,GAAG,CAACrP,IAAI,CAACzG,WAAW,CAAC4X,GAAAA,CAAAA;AAC1BA,gBAAAA,GAAAA,CAAIrO,KAAK,EAAA;gBACTmC,UAAAA,CAAW,WAAA;AACT,oBAAA,KAAA,CAAKoK,GAAG,CAACrP,IAAI,CAAChE,WAAW,CAACmV,GAAAA,CAAAA;oBAC1BA,GAAAA,CAAIjY,KAAK,CAACyU,OAAO,GAAG,EAAA;oBACpB,KAAA,CAAK2E,KAAK,CAACnB,GAAAA,EAAKM,IAAAA,CAAAA;AAClB,gBAAA,CAAA,CAAA;AACF,YAAA;;;YAEQa,GAAAA,EAAAA,OAAAA;mBAAR,SAAQA,KAAAA,CAAMC,GAAyB,EAAEd,IAAY,EAAA;gBACnD,IAAMxT,IAAAA,GAAO,IAAI,CAACgR,MAAM,CAACpR,KAAK,CAAC0U,GAAAA,EAAK,IAAI/T,IAAAA,CAAK;AAC3CgU,oBAAAA,WAAAA,CAAYC,cAAc;AAC1BD,oBAAAA,WAAAA,CAAYE,eAAe;AAC3BF,oBAAAA,WAAAA,CAAYhJ;AACb,iBAAA,CAAA,CAAA;AAED,gBAAA,IAAI,CAACkG,SAAS,CAAC4C,KAAK,CAACrU,IAAAA,EAAMwT,IAAAA,CAAAA;AAC7B,YAAA;;;YAEQhB,GAAAA,EAAAA,gBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,eAAenB,QAA6B,EAAA;;AAClD,gBAAA,IAAIqD,SAAAA,GAAY,KAAA;AAChB,gBAAA,IAAIC,QAAAA,GAAW,KAAA;gBACf,IAAI,CAACzH,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAUsM,QAAAA,EAAU,kBAAA,CAAA,CAAoBzM,SAAS,CAAC,WAAA;oBAChD8P,SAAAA,GAAY,IAAA;AACd,gBAAA,CAAA,CAAA,EACA3P,SAAAA,CAAUsM,QAAAA,EAAU,gBAAA,CAAA,CAAkBzM,SAAS,CAAC,WAAA;oBAC9C8P,SAAAA,GAAY,KAAA;AACd,gBAAA,CAAA,CAAA,EACA3P,SAAAA,CAAsBsM,QAAAA,EAAU,aAAA,CAAA,CAAezM,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACvD,oBAAA,KAAA,CAAKwM,iBAAiB,GAAG,KAAA;oBACzB,IAAI,KAAA,CAAKnT,QAAQ,EAAE;wBACjB,IAAI2G,EAAAA,CAAG4P,SAAS,KAAK,uBAAA,EAAyB;4BAC5CD,QAAAA,GAAW,IAAA;AACb,wBAAA;AACF,oBAAA;AACF,gBAAA,CAAA,CAAA,EACA5P,SAAAA,CAAyBsM,QAAAA,EAAU,SAAA,CAAA,CAAW3M,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBACxD,IAAI,KAAA,CAAKkD,QAAQ,IAAIsW,QAAAA,EAAU;wBAC7BA,QAAAA,GAAW,KAAA;wBACX,OAAO,KAAA;AACT,oBAAA;oBACA,OAAO,CAACD;;gBACV,CAAA,CAAA,CAAA,CAAI9P,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACZ,oBAAA,KAAA,CAAKwM,iBAAiB,GAAG,KAAA;oBACzB,IAAI5W,GAAAA,GAAMoK,GAAGpK,GAAG;AAChB,oBAAA,IAAMF,IAAAA,GAAO,aAAA;oBACb,IAAMwX,CAAAA,GAAItX,GAAAA,KAAQ,SAAA,IAAa,SAAA,CAAUqD,IAAI,CAAC+G,EAAAA,CAAG6P,IAAI,CAAA,IAAK7P,EAAAA,CAAGkE,QAAQ;AACrE,oBAAA,IAAIgJ,CAAAA,EAAG;;wBAELtX,GAAAA,GAAMF,IAAAA,CAAKoa,MAAM,CAAC,CAAC9P,GAAG6P,IAAI,CAAC9R,SAAS,CAAC,CAAA,CAAA,CAAA;AACrCiC,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,oBAAA;oBACA,KAAA,CAAKxG,KAAK,CAACH,cAAc,GAAG,IAAA;AAC5B,oBAAA,IAAMmI,EAAAA,GAAK,KAAA,CAAK9D,QAAQ,CAAC+D,YAAY,CAAC;wBACpCpa,GAAAA,EAAKA,GAAAA;AACLqa,wBAAAA,MAAAA,EAAQjQ,GAAGiQ,MAAM;AACjB/L,wBAAAA,QAAAA,EAAUlE,GAAGkE,QAAQ;AACrBgM,wBAAAA,MAAAA,EAAQ,MAAK9W,KAAK,GAAG4G,GAAGmQ,OAAO,GAAGnQ,GAAGoQ,OAAO;wBAC5CC,KAAAA,EAAO;AACLza,4BAAAA,GAAAA,EAAKoK,GAAGpK,GAAG;AACXia,4BAAAA,IAAAA,EAAM7P,GAAG6P,IAAI;AACbS,4BAAAA,OAAAA,EAAStQ,GAAGsQ;AACd;AACF,qBAAA,CAAA;AACA,oBAAA,IAAIP,EAAAA,EAAI;AACN,wBAAA,KAAA,CAAKvD,iBAAiB,GAAG,IAAA;AACzBxM,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;oBACnB,CAAA,MAAO;wBACL,KAAA,CAAKxG,KAAK,CAACH,cAAc,GAAG,KAAA;AAC9B,oBAAA;AACF,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEQ2F,GAAAA,EAAAA,aAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,YAAYlB,QAA6B,EAAA;;AAC/C,gBAAA,IAAIxQ,UAAAA,GAAa,CAAA;gBACjB,IAAI,CAACqM,YAAY,CAAC5S,GAAG,CACnByK,UAA4BsM,QAAAA,EAAU,kBAAA,CAAA,CAAoB3M,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBACpE,OAAO,CAAC,MAAKqW,iBAAiB;AAChC,gBAAA,CAAA,CAAA,CAAA,CAAI5M,SAAS,CAAC,WAAA;AACZ,oBAAA,IAAI,CAAC,KAAA,CAAKV,SAAS,CAAC+G,WAAW,EAAE;wBAC/B,KAAA,CAAK8B,KAAK,CAACH,cAAc,GAAG,IAAA;wBAC5B,KAAA,CAAK6E,SAAS,CAAC8D,MAAM,EAAA;AACvB,oBAAA;AACA,oBAAA,KAAA,CAAKhM,WAAW,GAAG,IAAA;oBACnB1I,UAAAA,GAAa,KAAA,CAAKqD,SAAS,CAACtI,WAAW;AACvC,oBAAA,IAAMiX,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAuC3C,SAAAA,EAAW;wBAClE/R,KAAAA,EAAOD;AACT,qBAAA,CAAA;oBACA4U,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,oBAAA,EAAsBzB,KAAAA,CAAAA;AAC1D,gBAAA,CAAA,CAAA,EACAlP,SAAAA,CAA4BsM,QAAAA,EAAU,mBAAA,CAAA,CAAqB3M,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBACrE,OAAO,CAAC,MAAKqW,iBAAiB;AAChC,gBAAA,CAAA,CAAA,CAAA,CAAI9M,IAAI,CAACkJ,oBAAAA,CAAqB,SAAC1C,IAAAA,EAAMxE,IAAAA,EAAAA;AACnC,oBAAA,OAAOwE,IAAAA,CAAKyK,IAAI,KAAKjP,IAAAA,CAAKiP,IAAI;gBAChC,CAAA,CAAA,CAAA,CAAI/Q,SAAS,CAACI,SAAAA,EAAAA,EAAAA;oBACZ,IAAIA,EAAAA,CAAG2Q,IAAI,KAAK,GAAA,EAAK;;AAEnB,wBAAA;AACF,oBAAA;AACA,oBAAA,IAAM9C,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,KAAA,CAAKvO,UAAU,CAACiF,WAAW,GAAG;wBAC5BvJ,IAAAA,EAAM6S,SAAAA;AACNW,wBAAAA,IAAAA,EAAMxO,GAAG2Q,IAAI;wBACb7P,MAAAA,EAAQd,EAAAA,CAAG2Q,IAAI,CAACtY,MAAM;wBACtByD,KAAAA,EAAOD;AACT,qBAAA;oBAEA,KAAA,CAAKkM,KAAK,CAACH,cAAc,GAAG,IAAA;oBAC5B,KAAA,CAAKG,KAAK,CAACiB,OAAO,EAAA;oBAClB,IAAMiG,KAAAA,GAAQ,IAAIuB,KAAAA,CAAM3C,SAAAA,EAAW;wBACjC/R,KAAAA,EAAOD,UAAAA;AACP8U,wBAAAA,IAAAA,EAAM3Q,GAAG2Q;AACX,qBAAA,CAAA;oBAEAF,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,qBAAA,EAAuBzB,KAAAA,CAAAA;oBACzDpB,SAAAA,CAAUR,gBAAgB,CAACC,gBAAgB,EAAA;AAC7C,gBAAA,CAAA,CAAA,CAAA;AAEF,gBAAA,IAAIsD,gBAAAA,GAAmB,KAAA;AACvB,gBAAA,IAAI,CAAC1I,YAAY,CAAC5S,GAAG,CACnBub,KAAAA,CACE9Q,SAAAA,CAAsBsM,QAAAA,EAAU,aAAA,CAAA,CAAe3M,IAAI,CACjDvJ,MAAAA,CAAO6J,SAAAA,EAAAA,EAAAA;AACLA,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACjB,oBAAA,IAAI,MAAKjV,SAAS,IAAI0G,EAAAA,CAAG4P,SAAS,KAAK,iBAAA,EAAmB;wBACxD,OAAO,KAAA;AACT,oBAAA;oBACA,IAAI,KAAA,CAAKvW,QAAQ,EAAE;wBACjBuX,gBAAAA,GAAmB5Q,EAAAA,CAAG4P,SAAS,KAAK,uBAAA;AACpC,wBAAA,OAAO5P,GAAG4P,SAAS,KAAK,YAAA,IAAgB5P,EAAAA,CAAG4P,SAAS,KAAK,uBAAA;AAC3D,oBAAA;AACA,oBAAA,OAAO,CAAC5P,EAAAA,CAAG8Q,WAAW,IAAI,CAAC,CAAC9Q,GAAG2Q,IAAI;AACrC,gBAAA,CAAA,CAAA,EACA/U,IAAIoE,SAAAA,EAAAA,EAAAA;AACF,oBAAA,OAAOA,GAAG2Q,IAAI;gBAChB,CAAA,CAAA,CAAA,EAEF,IAAI,CAACtX,QAAQ,GAAG,IAAI0X,UAAAA,EAAAA,GAAuBhR,SAAAA,CAA4BsM,QAAAA,EAAU,gBAAA,CAAA,CAC9E3M,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBACX,OAAO,CAAC,MAAKqW,iBAAiB;gBAChC,CAAA,CAAA,CAAA,CAAI9M,IAAI,CACN9D,GAAAA,CAAIoE,SAAAA,EAAAA,EAAAA;oBACF4Q,gBAAAA,GAAmB,IAAA;AACnB5Q,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACjBlC,oBAAAA,QAAAA,CAAShQ,KAAK,GAAG,EAAA;AACjB,oBAAA,OAAO2D,GAAG2Q,IAAI;gBAChB,CAAA,CAAA,CAAA,CAAA,CAEJ/Q,SAAS,CAAC4O,SAAAA,IAAAA,EAAAA;AACV,oBAAA,KAAA,CAAKjK,WAAW,GAAG,KAAA;oBACnB,KAAA,CAAKjF,UAAU,CAACiF,WAAW,GAAG,IAAA;AAC9B,oBAAA,IAAIiK,IAAAA,EAAM;wBACR,KAAA,CAAKzG,KAAK,CAACH,cAAc,GAAG,IAAA;wBAC5B,KAAA,CAAK6E,SAAS,CAACI,KAAK,CAAC2B,IAAAA,CAAAA;oBACvB,CAAA,MAAO;AACL,wBAAA,IAAA,yBAAA;yBAAA,yBAAA,GAAA,KAAA,CAAKtP,SAAS,CAAC2O,SAAS,cAAxB,yBAAA,KAAA,MAAA,GAAA,MAAA,GAAA,yBAAA,CAA0BR,gBAAgB,CAACC,gBAAgB,EAAA;AAC7D,oBAAA;AACA,oBAAA,IAAIsD,gBAAAA,EAAkB;AACpB,wBAAA,IAAM/C,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,wBAAA,IAAIA,SAAAA,EAAW;4BACb,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAY3C,SAAAA,EAAW,IAAA,CAAA;4BACzC4C,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,kBAAA,EAAoBzB,KAAAA,CAAAA;AACxD,wBAAA;AACF,oBAAA;oBACA2B,gBAAAA,GAAmB,KAAA;AACrB,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEQlE,GAAAA,EAAAA,qBAAAA;mBAAR,SAAQA,mBAAAA,GAAAA;AACN,gBAAA,OAAO3X,cAAc,QAAA,EAAU;oBAC7BS,KAAAA,EAAO;wBACLwb,SAAAA,EAAW;AACb,qBAAA;oBACAjb,MAAAA,EAAQ;wBACNkb,MAAAA,EAAQ,MAAA;wBACRnZ,KAAAA,EAAO,MAAA;wBACPe,OAAAA,EAAS,OAAA;wBACTb,MAAAA,EAAQ,MAAA;wBACR4J,QAAAA,EAAU,UAAA;AACV/J,wBAAAA,GAAAA,EAAK,IAAI,CAACmB,SAAS,GAAG,KAAA,GAAQ;AAChC;AACF,iBAAA,CAAA;AACF,YAAA;;;AAtYW+S,IAAAA,OAAAA,UAAAA;EAAmB/O,KAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnRhC;;AAEC,IACM,IAAA,qCAAekU,GAAf,SAAeA,qCAAAA,GAAAA;AAAAA,IAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,qCAAAA,CAAAA;AAIrB;AAgBM,IAAA,iBAAMC,iBAAN,WAAA;AAAMA,IAAAA,SAAAA,iBAAAA,CAsDCrX,OAAgB,EAChB,eAAwC,EAChCuF,SAAoB,EAC5B,SAA4B,EACR+R,iBAAyD,EAAA;;AA1D9ED,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,iBAAAA,CAAAA;;;;;AACX,QAAA3S,kBAAA,CAAA,IAAA,EAAQnB,QAAR,MAAA,CAAA;AAWA,QAAAmB,kBAAA,CAAA,IAAA,EAAQ6S,mBAAR,MAAA,CAAA;AAUA,QAAA7S,kBAAA,CAAA,IAAA,EAAQ8S,UAAR,MAAA,CAAA;AAWA,QAAA9S,kBAAA,CAAA,IAAA,EAAQ+S,WAAR,MAAA,CAAA;AACA,QAAA/S,kBAAA,CAAA,IAAA,EAAQgT,YAAR,MAAA,CAAA;AAaA,QAAAhT,kBAAA,CAAA,IAAA,EAAQiT,iBAAR,MAAA,CAAA;AAEA,QAAAjT,kBAAA,CAAA,IAAA,EAAQ0J,gBAAR,MAAA,CAAA;AACA,QAAA1J,kBAAA,CAAA,IAAA,EAAQkT,oBAAR,MAAA,CAAA;AACA,QAAAlT,kBAAA,CAAA,IAAA,EAAQmN,aAAR,MAAA,CAAA;AACA,QAAAnN,kBAAA,CAAA,IAAA,EAAQmT,SAAR,MAAA,CAAA;aAGoBrT,eAAAA,GAAAA,eAAAA;aACAe,SAAAA,GAAAA,SAAAA;aACAH,SAAAA,GAAAA,SAAAA;aACYkS,iBAAAA,GAAAA,iBAAAA;AAzDxB/T,QAAAA,IAAAA,CAAAA,IAAAA,GAAOtI,cAAc,KAAA,EAAO;YAClCgB,MAAAA,EAAQ;gBACN6L,QAAAA,EAAU,UAAA;gBACVjK,IAAAA,EAAM,CAAA;gBACNE,GAAAA,EAAK,CAAA;gBACLC,KAAAA,EAAO,MAAA;gBACPE,MAAAA,EAAQ,MAAA;gBACR6Q,aAAAA,EAAe,MAAA;gBACf+I,MAAAA,EAAQ;AACV;AACF,SAAA,CAAA;AACQP,QAAAA,IAAAA,CAAAA,eAAAA,GAAkBtc,cAAc,KAAA,EAAO;YAC7CgB,MAAAA,EAAQ;gBACN6L,QAAAA,EAAU,UAAA;gBACVjK,IAAAA,EAAM,CAAA;gBACNE,GAAAA,EAAK,CAAA;gBACLC,KAAAA,EAAO,MAAA;gBACPE,MAAAA,EAAQ,MAAA;gBACR4T,QAAAA,EAAU;AACZ;AACF,SAAA,CAAA;AACQ0F,QAAAA,IAAAA,CAAAA,MAAAA,GAASvc,cAAc,QAAA,EAAU;YACvCgB,MAAAA,EAAQ;gBACN6L,QAAAA,EAAU,UAAA;gBACViQ,OAAAA,EAAS,GAAA;gBACTla,IAAAA,EAAM,CAAA;gBACNE,GAAAA,EAAK,CAAA;gBACLC,KAAAA,EAAO,MAAA;AACPE,gBAAAA,MAAAA,EAAQ7C,QAAAA,CAASsT,eAAe,CAACC,YAAY,GAAG,IAAA;gBAChDG,aAAAA,EAAe;AACjB;AACF,SAAA,CAAA;AACQ0I,QAAAA,IAAAA,CAAAA,OAAAA,GAAU,IAAI,CAACD,MAAM,CAACQ,UAAU,CAAC,IAAA,CAAA;AACjCN,QAAAA,IAAAA,CAAAA,QAAAA,GAAWzc,cAAc,KAAA,EAAO;YACtCgB,MAAAA,EAAQ;gBACN6L,QAAAA,EAAU,UAAA;gBACVjK,IAAAA,EAAM,CAAA;gBACNE,GAAAA,EAAK,CAAA;gBACLC,KAAAA,EAAO,MAAA;gBACPE,MAAAA,EAAQ,MAAA;gBACR6Q,aAAAA,EAAe,MAAA;gBACfa,QAAAA,EAAU,MAAA;gBACVkI,MAAAA,EAAQ;AACV;AACF,SAAA,CAAA;AAEQH,QAAAA,IAAAA,CAAAA,aAAAA,GAAgB,IAAIrU,OAAAA,EAAAA;AAEpB8K,QAAAA,IAAAA,CAAAA,YAAAA,GAAe,IAAIS,YAAAA,EAAAA;AACnB+I,QAAAA,IAAAA,CAAAA,gBAAAA,GAA0C,EAAE;aAE5CC,KAAAA,GAAQI,MAAAA,CAAOC,gBAAgB,IAAI,CAAA;AAOzC,QAAA,IAAI,CAACrG,SAAS,GAAG7R,OAAAA,CAAQ0F,GAAG,CAAC9F,cAAAA,CAAAA;AAC7B,QAAA,IAAI,CAAC2X,eAAe,CAACzG,MAAM,CAAC,IAAI,CAAC0G,MAAM,CAAA;QACvC,IAAI,CAACjU,IAAI,CAACuN,MAAM,CAAC,IAAI,CAACyG,eAAe,EAAE,IAAI,CAACG,QAAQ,CAAA;AACpD,QAAA,IAAI,CAAC7F,SAAS,CAACsG,OAAO,CAAC,IAAI,CAAC5U,IAAI,CAAA;QAChC,IAAI,CAAC6K,YAAY,CAAC5S,GAAG,CAAC,IAAI,CAACmc,aAAa,CAAC7R,SAAS,CAACsS,SAAAA,KAAAA,EAAAA;AAC5C,YAAA,IAAA,yBAAA,GAAA,IAAA,EAAA,iBAAA,GAAA,KAAA,EAAA,cAAA,GAAA,SAAA;;AAAL,gBAAA,IAAA,IAAK,YAAcA,KAAAA,CAAAA,MAAAA,CAAAA,QAAAA,CAAAA,EAAAA,EAAd,KAAA,EAAA,EAAA,yBAAA,GAAA,CAAA,KAAA,GAAA,yBAAA,yBAAA,GAAA,IAAA,CAAqB;AAArB,oBAAA,IAAMxa,IAAAA,GAAN,KAAA,CAAA,KAAA;AACH,oBAAA,KAAA,CAAK6Z,OAAO,CAACY,SAAS,GAAGza,KAAKkS,KAAK;oBACnC,KAAA,CAAK2H,OAAO,CAACa,SAAS,EAAA;AACtB,oBAAA,KAAA,CAAKb,OAAO,CAAC7Z,IAAI,CAACA,KAAKC,IAAI,EAAED,IAAAA,CAAKG,GAAG,EAAEH,IAAAA,CAAKI,KAAK,EAAEJ,KAAKM,MAAM,CAAA;oBAC9D,KAAA,CAAKuZ,OAAO,CAACc,IAAI,EAAA;oBACjB,KAAA,CAAKd,OAAO,CAACe,SAAS,EAAA;AACxB,gBAAA;;AANK,gBAAA,iBAAA,GAAA,IAAA;AAAA,gBAAA,cAAA,GAAA,GAAA;;;yBAAA,yBAAA,IAAA,SAAA,CAAA,MAAA,IAAA,IAAA,EAAA;AAAA,wBAAA,SAAA,CAAA,MAAA,EAAA;;;AAAA,oBAAA,IAAA,iBAAA,EAAA;AAAA,wBAAA,MAAA,cAAA;;;;AAOP,QAAA,CAAA,CAAA,EAAIvS,SAAAA,CAAUgS,MAAAA,EAAQ,QAAA,CAAA,CAAUnS,SAAS,CAAC,WAAA;YACxC,KAAA,CAAK0R,MAAM,CAACrb,KAAK,CAAC+B,MAAM,GAAG7C,QAAAA,CAASsT,eAAe,CAACC,YAAY,GAAG,IAAA;AACnE,YAAA,KAAA,CAAKM,OAAO,EAAA;AACd,QAAA,CAAA,CAAA,EAAI,IAAI,CAAC3J,SAAS,CAACgF,YAAY,CAACzE,SAAS,CAAC,WAAA;AACxC,YAAA,KAAA,CAAKoJ,OAAO,EAAA;AACd,QAAA,CAAA,CAAA,CAAA;;AA5ESmI,IAAAA,eAAAA,CAAAA,iBAAAA,EAAAA;;AA+EX;;AAEC,MACDnI,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;AACE,gBAAA,IAAI,CAACuJ,IAAI,CAAC,IAAI,CAACb,gBAAgB,CAAA;AACjC,YAAA;;;YAEAlP,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;gBACE,IAAI,CAAC0F,YAAY,CAACzF,WAAW,EAAA;AAC/B,YAAA;;;AAEA;;;AAGC,MACD8P,GAAAA,EAAAA,MAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,KAAKC,KAA4B,EAAA;;gBAC/B,IAAI,CAACd,gBAAgB,GAAGc,KAAAA;AACxB,gBAAA,IAAMpI,aAAAA,GAAgB,IAAI,CAACuB,SAAS,CAAC3U,qBAAqB,EAAA;gBAC1D,IAAI,CAACsa,MAAM,CAACrb,KAAK,CAAC4B,GAAG,GAAGuS,aAAAA,CAAcvS,GAAG,GAAG,EAAC,GAAI,IAAA;AACjD,gBAAA,IAAI,CAACyZ,MAAM,CAACxZ,KAAK,GAAG,IAAI,CAACwZ,MAAM,CAACmB,WAAW,GAAG,IAAI,CAACd,KAAK;AACxD,gBAAA,IAAI,CAACL,MAAM,CAACtZ,MAAM,GAAG,IAAI,CAACsZ,MAAM,CAACoB,YAAY,GAAG,IAAI,CAACf,KAAK;gBAC1D,IAAI,CAACJ,OAAO,CAACoB,KAAK,CAAC,IAAI,CAAChB,KAAK,EAAE,IAAI,CAACA,KAAK,CAAA;AACzC,gBAAA,IAAI,CAACJ,OAAO,CAACqB,SAAS,CAAC,GAAG,CAAA,EAAG,IAAI,CAACtB,MAAM,CAACxZ,KAAK,EAAE,IAAI,CAACwZ,MAAM,CAACtZ,MAAM,CAAA;AAElE,gBAAA,IAAM6a,QAAyB,EAAE;gBAEjCL,KAAAA,CAAMrc,MAAM,CAACC,SAAAA,CAAAA,EAAAA;AACX,oBAAA,OAAOA,CAAAA,CAAE8I,SAAS,CAACgC,MAAM,CAAC7I,MAAM,IAAIjC,CAAAA,CAAE8I,SAAS,CAACW,KAAK,CAACxH,MAAM;gBAC9D,CAAA,CAAA,CAAG1C,OAAO,CAACU,SAAAA,IAAAA,EAAAA;AACT,oBAAA,IAAMyc,WAAAA,GAAe,oBAAA,CAAGzc,IAAAA,CAAK6I,SAAS,CAACgC,MAAM,CAAA;AAC7C,oBAAA,IAAM6R,UAAAA,GAAc,oBAAA,CAAG1c,IAAAA,CAAK6I,SAAS,CAACW,KAAK,CAAA;oBAC3C,IAAMkB,YAAAA,GAAe+R,YAAYE,GAAG,EAAA;AACpC,oBAAA,IAAM/R,UAAAA,GAAa,KAAA,CAAK/B,SAAS,CAAC+T,eAAe,CAACH,WAAAA,CAAAA;oBAClD,IAAMjS,WAAAA,GAAckS,WAAWC,GAAG,EAAA;AAClC,oBAAA,IAAMhS,SAAAA,GAAY,KAAA,CAAK9B,SAAS,CAAC+T,eAAe,CAACF,UAAAA,CAAAA;oBACjD,IAAI,CAAC9R,UAAAA,IAAc,CAACD,SAAAA,EAAW;AAC7B,wBAAA;AACF,oBAAA;AAEA,oBAAA,IAA0B,wCAAA,GAAA,KAAA,CAAK1C,eAAe,CAACsC,kBAAkB,CAAC;wBAChEC,WAAAA,EAAAA,WAAAA;wBACAE,YAAAA,EAAAA,YAAAA;wBACAC,SAAAA,EAAAA,SAAAA;wBACAC,UAAAA,EAAAA;AACF,qBAAA,CAAA,EALQpB,KAAAA,GAAkB,wCAAA,CAAlBA,KAAAA,EAAOqB,MAAAA,GAAW,wCAAA,CAAXA,MAAAA;oBAMf,IAAI,CAACrB,KAAAA,IAAS,CAACqB,MAAAA,EAAQ;AACrB,wBAAA;AACF,oBAAA;oBACA,IAAMC,WAAAA,GAAchM,SAAS+C,WAAW,EAAA;oBACxC,IAAI;AACFiJ,wBAAAA,WAAAA,CAAYhJ,QAAQ,CAAC+I,MAAAA,CAAOE,IAAI,EAAEF,OAAOJ,MAAM,CAAA;AAC/CK,wBAAAA,WAAAA,CAAY7I,MAAM,CAACuH,KAAAA,CAAMuB,IAAI,EAAEvB,MAAMiB,MAAM,CAAA;AAC7C,oBAAA,CAAA,CAAE,OAAOiB,CAAAA,EAAG;AACV,wBAAA;AACF,oBAAA;AACA,oBAAA,IAAI,CAACb,MAAAA,CAAOE,IAAI,KAAKvB,MAAMuB,IAAI,IAAIF,MAAAA,CAAOJ,MAAM,KAAKjB,KAAAA,CAAMiB,MAAM,KAAKK,WAAAA,CAAYpJ,SAAS,EAAE;AAC3FoJ,wBAAAA,WAAAA,CAAYhJ,QAAQ,CAAC0H,KAAAA,CAAMuB,IAAI,EAAEvB,MAAMiB,MAAM,CAAA;AAC7CK,wBAAAA,WAAAA,CAAY7I,MAAM,CAAC4I,MAAAA,CAAOE,IAAI,EAAEF,OAAOJ,MAAM,CAAA;AAC/C,oBAAA;AAEA,oBAAA,IAAIoR,KAAAA,GAAsC,KAAA;oBAC1C,IAAI,KAAA,CAAKd,iBAAiB,EAAE;AAC1Bc,wBAAAA,KAAAA,GAAQ,KAAA,CAAKd,iBAAiB,CAAC8B,QAAQ,CAAC;4BACtCrS,WAAAA,EAAAA,WAAAA;4BACAE,YAAAA,EAAAA,YAAAA;4BACAC,SAAAA,EAAAA,SAAAA;4BACAC,UAAAA,EAAAA;AACF,yBAAA,EAAGE,WAAAA,EAAa9K,IAAAA,CAAAA;AAClB,oBAAA;AACA,oBAAA,IAAI,CAAC6b,KAAAA,EAAO;AACVA,wBAAAA,KAAAA,GAAQ/Q,YAAYgS,cAAc,EAAA;AACpC,oBAAA;AACA,oBAAA,IAAMC,iBAAkC,EAAE;oBAC1C,IAAK,IAAIhd,IAAI8b,KAAAA,CAAM7Z,MAAM,GAAG,CAAA,EAAGjC,CAAAA,IAAK,GAAGA,CAAAA,EAAAA,CAAK;wBAC1C,IAAMsB,IAAAA,GAAOwa,KAAK,CAAC9b,CAAAA,CAAE;AACrBgd,wBAAAA,cAAAA,CAAepP,IAAI,CAAC;AAClB4F,4BAAAA,KAAAA,EAAOvT,KAAKuT,KAAK;AACjByJ,4BAAAA,QAAAA,EAAUhd,KAAKgd,QAAQ;AACvB1b,4BAAAA,IAAAA,EAAMD,IAAAA,CAAKC,IAAI,GAAGyS,aAAAA,CAAczS,IAAI;AACpCE,4BAAAA,GAAAA,EAAKH,KAAKG,GAAG;AACbC,4BAAAA,KAAAA,EAAOJ,KAAKI,KAAK;AACjBE,4BAAAA,MAAAA,EAAQN,KAAKM;AACf,yBAAA,CAAA;AACF,oBAAA;oBACA,KAAA,CAAKyZ,aAAa,CAAC/P,IAAI,CAAC0R,cAAAA,CAAAA;oBAExB,IAAME,WAAAA,GAAcnS,YAAY0D,UAAU,EAAA;AAC1CyO,oBAAAA,WAAAA,CAAYnb,QAAQ,CAAC0H,KAAAA,CAAMuB,IAAI,EAAEvB,MAAMiB,MAAM,CAAA;AAC7CwS,oBAAAA,WAAAA,CAAYjS,QAAQ,CAAC,IAAA,CAAA;AAErB,oBAAA,IAAMkS,aAAa9c,oBAAAA,CAAqB6c,WAAAA,CAAAA;AAExC,oBAAA,IAAM5b,KAAAA,GAAsB;AAC1B2b,wBAAAA,QAAAA,EAAUhd,KAAKgd,QAAQ;AACvBzJ,wBAAAA,KAAAA,EAAOvT,KAAKuT,KAAK;AACjBjS,wBAAAA,IAAAA,EAAM4b,UAAAA,CAAW5b,IAAI,GAAGyS,aAAAA,CAAczS,IAAI;AAC1CE,wBAAAA,GAAAA,EAAK0b,UAAAA,CAAW1b,GAAG,GAAGuS,aAAAA,CAAcvS,GAAG;wBACvCC,KAAAA,EAAO,CAAA;AACPE,wBAAAA,MAAAA,EAAQub,WAAWvb;AACrB,qBAAA;AACA,oBAAA,IAAIN,KAAAA,CAAKC,IAAI,GAAG,CAAA,IAAKD,KAAAA,CAAKG,GAAG,GAAG,CAAA,IAAKH,KAAAA,CAAKC,IAAI,GAAGyS,aAAAA,CAActS,KAAK,EAAE;AACpE,wBAAA;AACF,oBAAA;AACA+a,oBAAAA,KAAAA,CAAM7O,IAAI,CAACtM,KAAAA,CAAAA;AACb,gBAAA,CAAA,CAAA;gBACA,IAAI,CAAC8b,cAAc,CAACX,KAAAA,CAAAA;AACtB,YAAA;;;YAEUW,GAAAA,EAAAA,gBAAAA;AAAV,YAAA,KAAA,EAAA,SAAUA,eAAetB,KAAsB,EAAA;AAC7C,gBAAA,IAAK,IAAI9b,CAAAA,GAAI,CAAA,EAAGA,IAAI8b,KAAAA,CAAM7Z,MAAM,EAAEjC,CAAAA,EAAAA,CAAK;oBACrC,IAAMsB,IAAAA,GAAOwa,KAAK,CAAC9b,CAAAA,CAAE;AACrB,oBAAA,IAAoC,mBAAA,GAAA,IAAI,CAACqd,aAAa,CAACrd,CAAAA,CAAAA,EAA/CkH,MAAAA,GAA4B,mBAAA,CAA5BA,MAAAA,EAAQoW,OAAAA,GAAoB,mBAAA,CAApBA,OAAAA,EAASxS,SAAW,mBAAA,CAAXA,MAAAA;AACzBzL,oBAAAA,MAAAA,CAAOO,MAAM,CAACsH,MAAAA,CAAOrH,KAAK,EAAE;wBAC1B0B,IAAAA,EAAMD,IAAAA,CAAKC,IAAI,GAAG,IAAA;wBAClBE,GAAAA,EAAKH,IAAAA,CAAKG,GAAG,GAAG,IAAA;wBAChBC,KAAAA,EAAOJ,IAAAA,CAAKI,KAAK,GAAG,IAAA;wBACpBE,MAAAA,EAAQN,IAAAA,CAAKM,MAAM,GAAG,IAAA;AACtB4E,wBAAAA,UAAAA,EAAYlF,KAAKkS,KAAK;wBACtB/Q,OAAAA,EAAS;AACX,qBAAA,CAAA;AACAqI,oBAAAA,MAAAA,CAAOjL,KAAK,CAAC2G,UAAU,GAAGlF,KAAKkS,KAAK;oBACpC8J,OAAAA,CAAQ9a,SAAS,GAAGlB,IAAAA,CAAK2b,QAAQ;AACjCK,oBAAAA,OAAAA,CAAQzd,KAAK,CAAC2G,UAAU,GAAGlF,KAAKkS,KAAK;AACvC,gBAAA;AAEA,gBAAA,IAAK,IAAIxT,EAAAA,GAAI8b,KAAAA,CAAM7Z,MAAM,EAAEjC,EAAAA,GAAI,IAAI,CAACob,QAAQ,CAACtb,QAAQ,CAACmC,MAAM,EAAEjC,EAAAA,EAAAA,CAAK;oBACjE,IAAI,CAACob,QAAQ,CAACzY,WAAW,CAAC,IAAI,CAACyY,QAAQ,CAACtb,QAAQ,CAACE,EAAAA,CAAE,CAAA;AACrD,gBAAA;AACF,YAAA;;;YAEQqd,GAAAA,EAAAA,eAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,cAAc3X,KAAa,EAAA;AACjC,gBAAA,IAAI6X,QAAqB,IAAI,CAACnC,QAAQ,CAACtb,QAAQ,CAAC4F,KAAAA,CAAM;AACtD,gBAAA,IAAI6X,KAAAA,EAAO;AACT,oBAAA,IAAMzS,MAAAA,GAASyS,KAAAA,CAAMzd,QAAQ,CAAC,CAAA,CAAE;oBAChC,OAAO;wBACLoH,MAAAA,EAAQqW,KAAAA;wBACRzS,MAAAA,EAAAA,MAAAA;wBACAwS,OAAAA,EAASxS,MAAAA,CAAOhL,QAAQ,CAAC,CAAA;AAC3B,qBAAA;AACF,gBAAA;gBACA,IAAMwd,OAAAA,GAAU3e,cAAc,MAAA,EAAQ;oBACpCgB,MAAAA,EAAQ;wBACN6L,QAAAA,EAAU,UAAA;wBACVjK,IAAAA,EAAM,KAAA;wBACNuT,SAAAA,EAAW,kBAAA;wBACX0I,YAAAA,EAAc,KAAA;wBACdpL,MAAAA,EAAQ,MAAA;wBACRqL,UAAAA,EAAY,QAAA;wBACZjK,KAAAA,EAAO,MAAA;wBACPkK,SAAAA,EAAW,0BAAA;wBACXjC,OAAAA,EAAS,GAAA;wBACTkC,YAAAA,EAAc,KAAA;wBACdC,OAAAA,EAAS,SAAA;wBACTnL,aAAAA,EAAe;AACjB;AACF,iBAAA,CAAA;gBAEA,IAAM3H,OAAAA,GAASnM,cAAc,MAAA,EAAQ;oBACnCgB,MAAAA,EAAQ;wBACN6L,QAAAA,EAAU,UAAA;wBACV/J,GAAAA,EAAK,MAAA;wBACLF,IAAAA,EAAM,MAAA;wBACNG,KAAAA,EAAO,KAAA;wBACPE,MAAAA,EAAQ,KAAA;wBACR+b,YAAAA,EAAc,KAAA;wBACdlL,aAAAA,EAAe,MAAA;wBACfoL,OAAAA,EAAS;AACX,qBAAA;oBACA/d,QAAAA,EAAU;AAACwd,wBAAAA;AAAQ;AACrB,iBAAA,CAAA;AACAC,gBAAAA,KAAAA,GAAQ5e,cAAc,MAAA,EAAQ;oBAC5BgB,MAAAA,EAAQ;wBACN6L,QAAAA,EAAU;AACZ,qBAAA;oBACA1L,QAAAA,EAAU;AACRgL,wBAAAA;AACD;AACH,iBAAA,CAAA;AACA,gBAAA,IAAI,CAACsQ,QAAQ,CAAC5G,MAAM,CAAC+I,KAAAA,CAAAA;gBACrB,OAAO;oBACLrW,MAAAA,EAAQqW,KAAAA;oBACRzS,MAAAA,EAAAA,OAAAA;oBACAwS,OAAAA,EAAAA;AACF,iBAAA;AACF,YAAA;;;AAvQWvC,IAAAA,OAAAA,iBAAAA;AAwQZ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClRD,IAAA,WAAM+C,iBAAN,WAAA;AAAMA,IAAAA,SAAAA,WAAAA,GAAAA;AAAAA,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,WAAAA,CAAAA;AACJzM,QAAAA,kBAAAA,CAAAA,IAAAA,EAAAA,oBAAAA,MAAAA,CAAAA;AAoCA,QAAAjJ,kBAAA,CAAA,IAAA,EAAQ2V,cAAAA,EAA6B,IAAA,CAAA;AACrC,QAAA3V,kBAAA,CAAA,IAAA,EAAQE,QAAuB,EAAE,CAAA;AAEjC,QAAAF,kBAAA,CAAA,IAAA,EAAQ2J,uBAAsB,IAAI/K,OAAAA,EAAAA,CAAAA;QAGhC,IAAI,CAACqK,gBAAgB,GAAG,IAAI,CAACU,mBAAmB,CAACzI,IAAI,CAACkJ,oBAAAA,EAAAA,CAAAA;;AA3CpDsL,IAAAA,eAAAA,CAAAA,WAAAA,EAAAA;;YAGA/S,GAAAA,EAAAA,aAAAA;AAgBJ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;gBACE,OAAO,IAAI,CAACgT,YAAY;AAC1B,YAAA,CAAA;AAlBA,YAAA,GAAA,EAAA,SAAA,GAAA,CAAgBzd,KAAmB,EAAA;gBACjC,IAAI,CAACyd,YAAY,GAAGzd,KAAAA;AACpB,gBAAA,IAAIA,KAAAA,EAAO;oBACT,IAAM+F,CAAAA,GAAI/F,MAAMmO,UAAU,EAAA;AAC1BpI,oBAAAA,CAAAA,CAAE4E,QAAQ,CAAC,IAAA,CAAA;AACX,oBAAA,IAAM3J,OAAOjB,oBAAAA,CAAqBgG,CAAAA,CAAAA;AAClC,oBAAA,IAAI,CAAC0L,mBAAmB,CAACzG,IAAI,CAAC;AAC5B/J,wBAAAA,IAAAA,EAAMD,KAAKC,IAAI;AACfE,wBAAAA,GAAAA,EAAKH,KAAKG,GAAG;AACbG,wBAAAA,MAAAA,EAAQN,KAAKM;AACf,qBAAA,CAAA;gBACF,CAAA,MAAO;AACL,oBAAA,IAAI,CAACmQ,mBAAmB,CAACzG,IAAI,CAAC,IAAA,CAAA;AAChC,gBAAA;AACF,YAAA;;;YAMIhK,GAAAA,EAAAA,MAAAA;AAAJ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;gBACE,IAAI,IAAI,CAACyJ,WAAW,EAAE;AACpB,oBAAA,IAAMzK,KAAAA,GAAQ,IAAI,CAACyK,WAAW,CAAC0D,UAAU,EAAA;AACzCnO,oBAAAA,KAAAA,CAAM2K,QAAQ,CAAC,IAAA,CAAA;AACf,oBAAA,OAAO5K,oBAAAA,CAAqBC,KAAAA,CAAAA;AAC9B,gBAAA;gBACA,OAAO;oBACLiB,IAAAA,EAAM,CAAA;oBACNE,GAAAA,EAAK,CAAA;oBACLC,KAAAA,EAAO,CAAA;oBACPE,MAAAA,EAAQ;AACV,iBAAA;AACF,YAAA;;;YAWAgR,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;;AAEA,YAAA;;;YAEAxG,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;AACE,gBAAA,IAAI,CAAC9D,IAAI,CAAC/I,OAAO,CAACS,SAAAA,CAAAA,EAAAA;AAAKA,oBAAAA,OAAAA,CAAAA,CAAEqM,WAAW,EAAA;;gBACpC,IAAI,CAAC/D,IAAI,GAAG,EAAE;AAChB,YAAA;;;AArDIwV,IAAAA,OAAAA,WAAAA;;AAyDC,IAAA,WAAME,iBAAN,SAAA,KAAA,EAAA;AAAMA,IAAAA,SAAAA,CAAAA,WAAAA,EAAAA,KAAAA,CAAAA;AAAAA,IAAAA,SAAAA,WAAAA,CAkCCta,OAAgB,EACRkS,MAAc,EACd9M,SAAoB,EACpB+M,QAAkB,EAC1B,UAA8B,EAC9B,SAA4B,EAC5B,UAA8B,EAAA;AAxC/BmI,QAAAA,mBAAAA,CAAAA,IAAAA,EAAAA,WAAAA,CAAAA;;gBAyCT,WAAA,CAAA,IAAA,EAzCSA,WAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,QAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,UAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,YAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,EAAAA,MAAAA,CAAAA,EAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,YAAAA,EAAAA,MAAAA,CAAAA,EACXrM,0BAAAA,OAAAA,EAAAA,SAEAxD,kBAAAA,CAAAA,KAAAA,EAAAA,aAAAA,EAAAA,MAAAA,CAAAA;AAGA2H,QAAAA,kBAAAA,CAAAA,KAAAA,EAAAA,WAAAA,MAAAA,CAAAA,EAeA1N,kBAAA,CAAA,KAAA,EAAQ2N,WAAAA,EAAR,MAAA,CAAA,EACA3N,kBAAA,CAAA,KAAA,EAAQ6V,cAAAA,EAAR,SACA7V,kBAAA,CAAA,KAAA,EAAQF,iBAAAA,EAAR,MAAA,CAAA,EAEAE,kBAAA,CAAA,KAAA,EAAQ0J,gBAAR,MAAA,CAAA,EACA1J,kBAAA,CAAA,KAAA,EAAQ2C,aAAAA,EAAR,MAAA,CAAA,EAEA3C,kBAAA,CAAA,KAAA,EAAQnF,YAAR,MAAA,CAAA,EACAmF,0BAAQpF,OAAAA,EAAR,MAAA,CAAA,EACAoF,kBAAA,CAAA,KAAA,EAAQjF,mBAAR,MAAA,CAAA,EAEAiF,0BAAQgO,mBAAAA,EAAR;AAGoBR,SAAAA,EAAAA,KAAAA,CAAAA,MAAAA,GAAAA,cACA9M,SAAAA,GAAAA,SAAAA,EAAAA,KAAAA,CACA+M,QAAAA,GAAAA,QAAAA,EAAAA,KAAAA,CACA3M,aAAAA,UAAAA,EAAAA,KAAAA,CACAmN,SAAAA,GAAAA,SAAAA,EAAAA,KAAAA,CACArO,UAAAA,GAAAA,kBAvCpB2J,KAAAA,GAAQ,IAAImM,WAAAA,EAAAA,EAAAA,KAAAA,CAEZ3P,WAAAA,GAAc,aAGd2H,OAAAA,GAAU9J,OAAAA,CAAQC,OAAO,EAAA,EAAA,KAAA,CAejB8J,YAAY,KAAA,EAAA,KAAA,CAEZ7N,eAAAA,GAAkBnJ,QAAAA,CAASoK,YAAY,UAEvC2I,YAAAA,GAAe,IAAIS,YAAAA,EAAAA,EAAAA,KAAAA,CACnBxH,WAAAA,GAA4B,YAE5B9H,QAAAA,GAAWA,QAAAA,EAAAA,EAAAA,KAAAA,CACXD,QAAQA,KAAAA,EAAAA,EAAAA,KAAAA,CACRG,eAAAA,GAAkBA,yBAElBiT,iBAAAA,GAAoB,KAAA;AAU1B,QAAA,KAAA,CAAK6H,YAAY,GAAGva,OAAAA,CAAQ0F,GAAG,CAAC7F,aAAAA,CAAAA;QAChC,IAAI,CAACyE,UAAAA,CAAWuB,QAAQ,EAAE;YACxB,KAAA,CAAK0U,YAAY,CAACjU,eAAe,GAAG,MAAA;AACtC,QAAA;QACA,KAAA,CAAK8H,YAAY,CAAC5S,GAAG,CACnB8I,WAAW4O,qBAAqB,CAACpN,SAAS,CAAC,WAAA;AACzC,YAAA,KAAA,CAAKyU,YAAY,CAACjU,eAAe,GAAGhC,UAAAA,CAAWuB,QAAQ,GAAG,OAAA,GAAU,MAAA;AACtE,QAAA,CAAA,CAAA,CAAA;QAEF,KAAA,CAAK6N,cAAc,CAAC,KAAA,CAAK6G,YAAY,CAAA;QACrC,KAAA,CAAK9G,WAAW,CAAC,KAAA,CAAK8G,YAAY,CAAA;QAClC,KAAA,CAAK5G,oBAAoB,CAAC,KAAA,CAAK4G,YAAY,CAAA;;;AArDlCD,IAAAA,eAAAA,CAAAA,WAAAA,EAAAA;;YAQPnH,GAAAA,EAAAA,UAAAA;AASJ,YAAA,GAAA,EAAA,SAAA,GAAA,GAAA;gBACE,OAAO,IAAI,CAACd,SAAS;AACvB,YAAA,CAAA;AAXA,YAAA,GAAA,EAAA,SAAA,GAAA,CAAae,CAAU,EAAA;gBACrB,IAAI,CAACf,SAAS,GAAGe,CAAAA;AACjB,gBAAA,IAAI,IAAI,CAAC9O,UAAU,CAACuB,QAAQ,EAAE;AAC5B,oBAAA,IAAI,CAAC0U,YAAY,CAACjU,eAAe,GAAG,OAAA;AACpC,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI,CAACiU,YAAY,CAACjU,eAAe,GAAG8M,IAAI,OAAA,GAAU,MAAA;AACpD,YAAA;;;YAyCArN,GAAAA,EAAAA,OAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,MAAMsB,WAAkB,EAAA;AACtB,gBAAA,IAAI,IAAI,CAAC/C,UAAU,CAACuB,QAAQ,EAAE;AAC5B,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI,CAACoI,KAAK,CAAC5G,WAAW,GAAGA,WAAAA;gBACzB,IAAI,CAACA,WAAW,GAAGA,WAAAA;AACrB,YAAA;;;YAEArB,GAAAA,EAAAA,MAAAA;mBAAAA,SAAAA,IAAAA,GAAAA;gBACE,IAAI,IAAI,CAACqB,WAAW,IAAI,IAAI,CAAC7C,eAAe,CAAC2D,UAAU,GAAG,CAAA,EAAG;AAC3D,oBAAA,IAAMwE,UAAU,IAAI,CAACnI,eAAe,CAAC4D,UAAU,CAAC,CAAA,CAAA;AAChD,oBAAA,IAAIuE,OAAAA,KAAY,IAAI,CAACtF,WAAW,EAAE;wBAChC,IAAI,CAAC7C,eAAe,CAACmD,eAAe,EAAA;wBACpC,IAAI,CAACN,WAAW,GAAG,IAAA;AACnB,wBAAA;AACF,oBAAA;AACF,gBAAA;AACF,YAAA;;;YAEAqB,GAAAA,EAAAA,SAAAA;mBAAAA,SAAAA,OAAAA,GAAAA;gBACE,IAAI,CAACuF,KAAK,CAACvF,OAAO,EAAA;gBAClB,IAAI,CAAC0F,YAAY,CAACzF,WAAW,EAAA;AAC/B,YAAA;;;YAEQgL,GAAAA,EAAAA,sBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,qBAAqBpB,QAAqB,EAAA;;AAChD,gBAAA,IAAI,CAACnE,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAA0BzG,SAAAA,EAAAA,GAAc+S,QAAAA,GAAWlX,QAAAA,EAAU,MAAA,CAAA,CAAQyK,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AAC7E,oBAAA,KAAA,CAAK0N,WAAW,CAAC1N,EAAAA,CAAAA;AACnB,gBAAA,CAAA,CAAA,EACAD,SAAAA,CAA0BsM,QAAAA,EAAU,OAAA,CAAA,CAASzM,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACrD,oBAAA,KAAA,CAAK2N,YAAY,CAAC3N,EAAAA,CAAAA;AACpB,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEA0N,GAAAA,EAAAA,aAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,YAAY1N,EAAkB,EAAA;gBAC5B,IAAMd,SAAAA,GAAY,IAAI,CAACA,SAAS;gBAChC,IAAI,CAACA,SAAAA,CAAU0O,UAAU,EAAE;AACzB,oBAAA;AACF,gBAAA;AACA,gBAAA,IAAI1O,SAAAA,CAAU2O,SAAS,KAAK3O,SAAAA,CAAU4O,OAAO,IAAI5O,SAAAA,CAAU+F,SAAS,GAAI/F,SAAAA,CAAUtI,WAAW,KAAM,CAAA,EAAG;AACpG,oBAAA,IAAMmX,UAAU7O,SAAAA,CAAU2O,SAAS,CAAE1H,iBAAiB,CAACjH,UAAUtI,WAAW,CAAA;AAC5E,oBAAA,IAAI,CAAA,OAAOmX,OAAAA,KAAAA,WAAAA,GAAAA,WAAAA,GAAP,QAAA,CAAOA,OAAAA,CAAM,MAAM,QAAA,EAAU;wBAC/B,IAAME,aAAAA,GAAgBjO,GAAGiO,aAAa;wBACtC,IAAM3P,eAAAA,GAAkBnJ,SAASoK,YAAY,EAAA;wBAC7C,IAAM7I,KAAAA,GAAQ4H,eAAAA,CAAgB4D,UAAU,CAAC,CAAA,CAAA;wBACzC,IAAMgM,GAAAA,GAAM/Y,QAAAA,CAASJ,aAAa,CAAC,KAAA,CAAA;wBACnC,IAAMoZ,QAAAA,GAAWzX,MAAM0X,aAAa,EAAA;AACpCF,wBAAAA,GAAAA,CAAItD,MAAM,CAACuD,QAAAA,CAAAA;AACXF,wBAAAA,aAAAA,CAAcI,OAAO,CAAC,WAAA,EAAaH,GAAAA,CAAII,SAAS,CAAA;AAChDL,wBAAAA,aAAAA,CAAcI,OAAO,CAAC,MAAA,EAAQH,GAAAA,CAAItV,SAAS,CAAA;AAC3CoH,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,oBAAA;AACF,gBAAA;AACF,YAAA;;;YAEAZ,GAAAA,EAAAA,cAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,aAAa3N,EAAkB,EAAA;;AAC7B,gBAAA,IAAMwO,IAAAA,GAAOxO,EAAAA,CAAGiO,aAAa,CAAEQ,OAAO,CAAC,MAAA,CAAA;gBAEvC,IAAMC,KAAAA,GAAQxX,MAAMC,IAAI,CAAC6I,GAAGiO,aAAa,CAAES,KAAK,IAAI,EAAE,CAAA;AACtD,gBAAA,IAAMC,QAAQzX,KAAAA,CAAMC,IAAI,CAAC6I,EAAAA,CAAGiO,aAAa,CAAEU,KAAK,CAAA;gBAChD,IAAID,KAAAA,CAAME,KAAK,CAAC1O,SAAAA,IAAAA,EAAAA;2BAAQA,IAAAA,KAAS,OAAA;AAAYyO,gBAAAA,CAAAA,CAAAA,IAAAA,KAAAA,CAAMtW,MAAM,EAAE;AACzD+J,oBAAAA,OAAAA,CAAQyM,GAAG,CAACF,KAAAA,CAAMxY,MAAM,CAACC,SAAAA,CAAAA,EAAAA;AACvB,wBAAA,OAAO,QAAA,CAAS6C,IAAI,CAAC7C,CAAAA,CAAE8J,IAAI,CAAA;oBAC7B,CAAA,CAAA,CAAGtE,GAAG,CAACvF,SAAAA,IAAAA,EAAAA;AACL,wBAAA,IAAMyY,SAAS,IAAIC,UAAAA,EAAAA;wBACnB,OAAO,IAAI3M,QAAQC,SAAAA,OAAAA,EAAAA;4BACjByM,MAAAA,CAAOE,MAAM,GAAG,SAACC,KAAAA,EAAAA;gCACf5M,OAAAA,CAAQ4M,KAAAA,CAAMhP,MAAM,CAAE5E,MAAM,CAAA;AAC9B,4BAAA,CAAA;AACAyT,4BAAAA,MAAAA,CAAOI,aAAa,CAAC7Y,IAAAA,CAAAA;AACvB,wBAAA,CAAA,CAAA;oBACF,CAAA,CAAA,CAAA,CAAIiM,IAAI,CAAC6M,SAAAA,IAAAA,EAAAA;AACP,wBAAA,IAAMhV,IAAAA,GAAOgV,IAAAA,CAAKvT,GAAG,CAACxF,SAAAA,CAAAA,EAAAA;4BACpB,OAAQ,WAAA,CAAa,MAAA,CAAFA,CAAAA,EAAE,GAAA,CAAA;AACvB,wBAAA,CAAA,CAAA,CAAGgZ,IAAI,CAAC,EAAA,CAAA;wBACR,KAAA,CAAKC,KAAK,CAAClV,IAAAA,EAAMqU,IAAAA,CAAAA;AACnB,oBAAA,CAAA,CAAA;AACAxO,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACjB,oBAAA;AACF,gBAAA;gBAEA,IAAML,GAAAA,GAAM/Y,QAAAA,CAASJ,aAAa,CAAC,KAAA,CAAA;gBACnCmZ,GAAAA,CAAIjY,KAAK,CAACyU,OAAO,GAAG,2FAAA;AACpBwD,gBAAAA,GAAAA,CAAI9N,eAAe,GAAG,MAAA;gBACtBjL,QAAAA,CAAS4H,IAAI,CAACzG,WAAW,CAAC4X,GAAAA,CAAAA;AAC1BA,gBAAAA,GAAAA,CAAIrO,KAAK,EAAA;gBACTmC,UAAAA,CAAW,WAAA;oBACT7M,QAAAA,CAAS4H,IAAI,CAAChE,WAAW,CAACmV,GAAAA,CAAAA;oBAC1BA,GAAAA,CAAIjY,KAAK,CAACyU,OAAO,GAAG,EAAA;oBACpB,KAAA,CAAK2E,KAAK,CAACnB,GAAAA,EAAKM,IAAAA,CAAAA;AAClB,gBAAA,CAAA,CAAA;AACF,YAAA;;;YAEQa,GAAAA,EAAAA,OAAAA;mBAAR,SAAQA,KAAAA,CAAMC,GAAyB,EAAEd,IAAY,EAAA;gBACnD,IAAMxT,IAAAA,GAAO,IAAI,CAACgR,MAAM,CAACpR,KAAK,CAAC0U,GAAAA,EAAK,IAAI/T,IAAAA,CAAK;AAC3CgU,oBAAAA,WAAAA,CAAYC,cAAc;AAC1BD,oBAAAA,WAAAA,CAAYE,eAAe;AAC3BF,oBAAAA,WAAAA,CAAYhJ;AACb,iBAAA,CAAA,CAAA;AAED,gBAAA,IAAI,CAACkG,SAAS,CAAC4C,KAAK,CAACrU,IAAAA,EAAMwT,IAAAA,CAAAA;AAC7B,YAAA;;;YAEQhB,GAAAA,EAAAA,gBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,eAAepO,KAAkB,EAAA;;AACvC,gBAAA,IAAIsQ,SAAAA,GAAY,KAAA;AAChB,gBAAA,IAAIC,QAAAA,GAAW,KAAA;gBACf,IAAI,CAACzH,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAUX,KAAAA,EAAO,kBAAA,CAAA,CAAoBQ,SAAS,CAAC,WAAA;oBAC7C8P,SAAAA,GAAY,IAAA;AACd,gBAAA,CAAA,CAAA,EACA3P,SAAAA,CAAUX,KAAAA,EAAO,gBAAA,CAAA,CAAkBQ,SAAS,CAAC,WAAA;oBAC3C8P,SAAAA,GAAY,KAAA;AACd,gBAAA,CAAA,CAAA,EACA3P,SAAAA,CAAsBX,KAAAA,EAAO,aAAA,CAAA,CAAeQ,SAAS,CAACI,SAAAA,EAAAA,EAAAA;oBACpD,IAAI,KAAA,CAAK3G,QAAQ,EAAE;wBACjB,IAAI2G,EAAAA,CAAG4P,SAAS,KAAK,uBAAA,EAAyB;4BAC5CD,QAAAA,GAAW,IAAA;AACb,wBAAA;AACF,oBAAA;AACF,gBAAA,CAAA,CAAA,EACA5P,SAAAA,CAAyBX,KAAAA,EAAO,SAAA,CAAA,CAAWM,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBACrD,IAAI,KAAA,CAAKkD,QAAQ,IAAIsW,QAAAA,EAAU;wBAC7BA,QAAAA,GAAW,KAAA;wBACX,OAAO,KAAA;AACT,oBAAA;oBACA,OAAO,CAACD;;gBACV,CAAA,CAAA,CAAA,CAAI9P,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACZ,oBAAA,KAAA,CAAKwM,iBAAiB,GAAG,KAAA;oBACzB,IAAI5W,GAAAA,GAAMoK,GAAGpK,GAAG;AAChB,oBAAA,IAAMF,IAAAA,GAAO,aAAA;oBACb,IAAMwX,CAAAA,GAAItX,GAAAA,KAAQ,SAAA,IAAa,SAAA,CAAUqD,IAAI,CAAC+G,EAAAA,CAAG6P,IAAI,CAAA,IAAK7P,EAAAA,CAAGkE,QAAQ;AACrE,oBAAA,IAAIgJ,CAAAA,EAAG;wBACLtX,GAAAA,GAAMF,IAAAA,CAAKoa,MAAM,CAAC,CAAC9P,GAAG6P,IAAI,CAAC9R,SAAS,CAAC,CAAA,CAAA,CAAA;AACrCiC,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,oBAAA;AACA,oBAAA,IAAMwB,EAAAA,GAAK,KAAA,CAAK9D,QAAQ,CAAC+D,YAAY,CAAC;wBACpCpa,GAAAA,EAAKA,GAAAA;AACLqa,wBAAAA,MAAAA,EAAQjQ,GAAGiQ,MAAM;AACjB/L,wBAAAA,QAAAA,EAAUlE,GAAGkE,QAAQ;AACrBgM,wBAAAA,MAAAA,EAAQ,MAAK9W,KAAK,GAAG4G,GAAGmQ,OAAO,GAAGnQ,GAAGoQ,OAAO;wBAC5CC,KAAAA,EAAO;AACLza,4BAAAA,GAAAA,EAAKoK,GAAGpK,GAAG;AACX0a,4BAAAA,OAAAA,EAAStQ,GAAGsQ,OAAO;AACnBT,4BAAAA,IAAAA,EAAM7P,GAAG6P;AACX;AACF,qBAAA,CAAA;AACA,oBAAA,IAAIE,EAAAA,EAAI;AACN,wBAAA,KAAA,CAAKvD,iBAAiB,GAAG,IAAA;AACzBxM,wBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,oBAAA;AACF,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEQhB,GAAAA,EAAAA,aAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,YAAYnO,KAAkB,EAAA;gBACpC,IAAI,IAAI,CAAC7F,eAAe,EAAE;oBACxB,IAAI,CAAC+a,iBAAiB,CAAClV,KAAAA,CAAAA;gBACzB,CAAA,MAAO;oBACL,IAAI,CAACmV,aAAa,CAACnV,KAAAA,CAAAA;AACrB,gBAAA;AACF,YAAA;;;YAEQkV,GAAAA,EAAAA,mBAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,kBAAkBlV,KAAkB,EAAA;;AAC1C,gBAAA,IAAIoV,kBAAAA,GAAqB,IAAA;gBACzB,IAAI3Y,UAAAA;AACJ,gBAAA,IAAM4Y,gBAAAA,GAAmB,SAAA,gBAAA,GAAA;AACvB,oBAAA,KAAA,CAAKlQ,WAAW,GAAG,IAAA;oBACnB1I,UAAAA,GAAa,KAAA,CAAKqD,SAAS,CAACtI,WAAW;AACvC,oBAAA,IAAMiX,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAuC3C,SAAAA,EAAW;wBAClE/R,KAAAA,EAAOD;AACT,qBAAA,CAAA;oBACA4U,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,oBAAA,EAAsBzB,KAAAA,CAAAA;AAC1D,gBAAA,CAAA;AACA,gBAAA,IAAMyF,oBAAoB,SAAA,iBAAA,CAAC/D,IAAAA,EAAAA;AACzB,oBAAA,IAAM9C,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAwC3C,SAAAA,EAAW;wBACnE/R,KAAAA,EAAOD,UAAAA;wBACP8U,IAAAA,EAAAA;AACF,qBAAA,CAAA;oBAEAF,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,qBAAA,EAAuBzB,KAAAA,CAAAA;AAC3D,gBAAA,CAAA;AACA,gBAAA,IAAM0F,iBAAiB,SAAA,cAAA,CAAChE,IAAAA,EAAAA;AACtB,oBAAA,KAAA,CAAKpM,WAAW,GAAG,KAAA;AAEnB,oBAAA,IAAIoM,IAAAA,EAAM;wBACR,KAAA,CAAKlE,SAAS,CAACI,KAAK,CAAC8D,IAAAA,CAAAA;AACvB,oBAAA;AACA,oBAAA,IAAM9C,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,oBAAA,IAAIA,SAAAA,EAAW;wBACb,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAY3C,SAAAA,EAAW,IAAA,CAAA;wBACzC4C,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,kBAAA,EAAoBzB,KAAAA,CAAAA;AACxD,oBAAA;AACF,gBAAA,CAAA;gBACA,IAAI,CAAC/G,YAAY,CAAC5S,GAAG,CACnByK,SAAAA,CAAUX,KAAAA,EAAO,kBAAA,CAAA,CAAoBQ,SAAS,CAAC,WAAA;AAC7C6U,oBAAAA,gBAAAA,EAAAA;AACF,gBAAA,CAAA,CAAA,EACA1U,SAAAA,CAA4BX,KAAAA,EAAO,mBAAA,CAAA,CAAqBQ,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AAChE0U,oBAAAA,iBAAAA,CAAkB1U,GAAG2Q,IAAI,CAAA;AAC3B,gBAAA,CAAA,CAAA,EACA5Q,SAAAA,CAA4BX,KAAAA,EAAO,gBAAA,CAAA,CAAkBQ,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AAC7D2U,oBAAAA,cAAAA,CAAe3U,GAAG2Q,IAAI,CAAA;AACtB,oBAAA,IAAMha,cAAAA,GAAiB,KAAA,CAAK2H,eAAe,CAACyG,SAAS;oBACrD,IAAkBzJ,cAAd3E,cAAAA,EAA0B4P,IAAAA,CAAAA,IAAQ5P,eAAeyB,WAAW,KAAK4H,EAAAA,CAAG2Q,IAAI,EAAE;AAC5Eha,wBAAAA,cAAAA,CAAesU,MAAM,EAAA;AACvB,oBAAA;AACF,gBAAA,CAAA,CAAA,EACAlL,SAAAA,CAAsBX,KAAAA,EAAO,aAAA,CAAA,CAAeQ,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACpD,oBAAA,OAAQA,GAAG4P,SAAS;wBAClB,KAAK,YAAA;4BACH,IAAI5P,EAAAA,CAAG2Q,IAAI,EAAE;AACX,gCAAA,KAAA,CAAKlE,SAAS,CAACI,KAAK,CAAC7M,GAAG2Q,IAAI,CAAA;AAC5B3Q,gCAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACnB,4BAAA;AACA,4BAAA;wBACF,KAAK,uBAAA;AACH,4BAAA,IAAIiG,kBAAAA,EAAoB;gCACtBA,kBAAAA,GAAqB,KAAA;AACrBC,gCAAAA,gBAAAA,EAAAA;4BACF,CAAA,MAAO;gCACLC,iBAAAA,CAAkB1U,EAAAA,CAAG2Q,IAAI,IAAI,EAAA,CAAA;AAC/B,4BAAA;AACA,4BAAA;wBACF,KAAK,uBAAA;AACH,4BAAA,KAAA,CAAKpM,WAAW,GAAG,KAAA;AACnB,4BAAA;wBACF,KAAK,uBAAA;AAAyB,4BAAA;AAC5B,gCAAA,KAAA,CAAKA,WAAW,GAAG,KAAA;AACnB,gCAAA,IAAM7N,KAAAA,GAAQsJ,EAAAA,CAAG4U,eAAe,EAAE,CAAC,CAAA,CAAE;AACrC,gCAAA,IAAI,CAACle,KAAAA,EAAO;AACV,oCAAA;AACF,gCAAA;AACA,gCAAA,IAAMiK,WAAW,KAAA,CAAKrB,UAAU,CAACkH,uBAAuB,CAAC9P,MAAMC,cAAc,CAAA;AAC7E,gCAAA,IAAMkX,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,gCAAA,IAAIA,SAAAA,EAAW;AACb,oCAAA,KAAA,CAAK3O,SAAS,CAAC4C,gBAAgB,CAC7B+L,SAAAA,EACAlN,SAAS9E,UAAU,GAAGnF,KAAAA,CAAME,WAAW,EACvCiX,SAAAA,EACAlN,QAAAA,CAAS9E,UAAU,GAAGnF,MAAMuO,SAAS,CAAA;oCAEvC,KAAA,CAAKwH,SAAS,CAAC8D,MAAM,EAAA;AACvB,gCAAA;AACA,gCAAA;AACF,4BAAA;wBACA,KAAK,uBAAA;AAAyB,4BAAA;AAYfvQ,gCAAAA,IAAAA,gBAAAA;AAXb,gCAAA,KAAA,CAAKuE,WAAW,GAAG,KAAA;AACnB,gCAAA,IAAM7N,MAAAA,GAAQsJ,EAAAA,CAAG4U,eAAe,EAAE,CAAC,CAAA,CAAE;AACrC,gCAAA,IAAMjU,YAAW,KAAA,CAAKrB,UAAU,CAACkH,uBAAuB,CAAC9P,OAAMC,cAAc,CAAA;AAC7E,gCAAA,IAAMkX,UAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,gCAAA,KAAA,CAAK3O,SAAS,CAAC4C,gBAAgB,CAC7B+L,UAAAA,EACAlN,UAAS9E,UAAU,GAAGnF,MAAAA,CAAME,WAAW,EACvCiX,UAAAA,EACAlN,SAAAA,CAAS9E,UAAU,GAAGnF,OAAMuO,SAAS,CAAA;gCAEvC,KAAA,CAAKwH,SAAS,CAAC8D,MAAM,EAAA;AACrB,gCAAA,IAAM/B,IAAAA,GAAOxO,CAAAA,CAAAA,gBAAAA,GAAAA,EAAAA,CAAG6U,YAAY,MAAA,IAAA,IAAf7U,gBAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,gBAAAA,CAAiByO,OAAO,CAAC,MAAA,CAAA,KAAWzO,EAAAA,CAAG2Q,IAAI,IAAI,IAAA;AAC5D,gCAAA,IAAInC,IAAAA,EAAM;oCACR,KAAA,CAAK/B,SAAS,CAACI,KAAK,CAAC2B,IAAAA,CAAAA;AACvB,gCAAA;AACA,gCAAA;AACF,4BAAA;AAMF;AACF,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;YAEQ+F,GAAAA,EAAAA,eAAAA;AAAR,YAAA,KAAA,EAAA,SAAQA,cAAcnV,KAAkB,EAAA;;AACtC,gBAAA,IAAIvD,UAAAA,GAAa,CAAA;AACjB,gBAAA,IAAI+U,gBAAAA,GAAmB,KAAA;gBACvB,IAAI,CAAC1I,YAAY,CAAC5S,GAAG,CACnByK,UAAUX,KAAAA,EAAO,kBAAA,CAAA,CAAoBM,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBAC/C,OAAO,CAAC,MAAKqW,iBAAiB;AAChC,gBAAA,CAAA,CAAA,CAAA,CAAI5M,SAAS,CAAC,WAAA;AACZ,oBAAA,KAAA,CAAK2E,WAAW,GAAG,IAAA;oBACnB1I,UAAAA,GAAa,KAAA,CAAKqD,SAAS,CAACtI,WAAW;AACvC,oBAAA,IAAMiX,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAuC3C,SAAAA,EAAW;wBAClE/R,KAAAA,EAAOD;AACT,qBAAA,CAAA;oBACA4U,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,oBAAA,EAAsBzB,KAAAA,CAAAA;AAC1D,gBAAA,CAAA,CAAA,EACAlP,SAAAA,CAA4BX,KAAAA,EAAO,mBAAA,CAAA,CAAqBM,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBAClE,OAAO,CAAC,MAAKqW,iBAAiB;gBAChC,CAAA,CAAA,CAAA,CAAI5M,SAAS,CAACI,SAAAA,EAAAA,EAAAA;AACZ,oBAAA,IAAM6N,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;oBAC1C,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAM3C,SAAAA,EAAW;wBACjC/R,KAAAA,EAAOD,UAAAA;AACP8U,wBAAAA,IAAAA,EAAM3Q,GAAG2Q;AACX,qBAAA,CAAA;oBAEAF,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,qBAAA,EAAuBzB,KAAAA,CAAAA;AAC3D,gBAAA,CAAA,CAAA,EACA4B,MACE9Q,SAAAA,CAAsBX,KAAAA,EAAO,eAAeM,IAAI,CAC9C9D,IAAIoE,SAAAA,EAAAA,EAAAA;AACFA,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;oBACjB,IAAIvO,EAAAA,CAAG4P,SAAS,KAAK,uBAAA,EAAyB;wBAC5C,OAAO,IAAA;AACT,oBAAA;oBACA,IAAI5P,EAAAA,CAAG4P,SAAS,KAAK,uBAAA,EAAyB;AAWrC5P,wBAAAA,IAAAA,gBAAAA;AAVP,wBAAA,IAAMtJ,KAAAA,GAAQsJ,EAAAA,CAAG4U,eAAe,EAAE,CAAC,CAAA,CAAE;AACrC,wBAAA,IAAMjU,WAAW,KAAA,CAAKrB,UAAU,CAACkH,uBAAuB,CAAC9P,MAAMC,cAAc,CAAA;AAC7E,wBAAA,IAAMkX,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,wBAAA,KAAA,CAAK3O,SAAS,CAAC4C,gBAAgB,CAC7B+L,SAAAA,EACAlN,SAAS9E,UAAU,GAAGnF,KAAAA,CAAME,WAAW,EACvCiX,SAAAA,EACAlN,QAAAA,CAAS9E,UAAU,GAAGnF,MAAMuO,SAAS,CAAA;wBAEvC,KAAA,CAAKwH,SAAS,CAAC8D,MAAM,EAAA;AACrB,wBAAA,OAAOvQ,CAAAA,CAAAA,gBAAAA,GAAAA,EAAAA,CAAG6U,YAAY,MAAA,IAAA,IAAf7U,gBAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,gBAAAA,CAAiByO,OAAO,CAAC,MAAA,CAAA,KAAWzO,EAAAA,CAAG2Q,IAAI,IAAI,IAAA;AACxD,oBAAA;oBACAC,gBAAAA,GAAmB5Q,EAAAA,CAAG4P,SAAS,KAAK,uBAAA;oBACpC,IAAIgB,gBAAAA,IAAoB,KAAA,CAAKrM,WAAW,EAAE;wBACxC,OAAO,IAAA;AACT,oBAAA;oBACA,IAAI,KAAA,CAAKlL,QAAQ,EAAE;AACjB,wBAAA,IAAI2G,EAAAA,CAAG4P,SAAS,KAAK,YAAA,IAAgBgB,gBAAAA,EAAkB;AACrD,4BAAA,OAAO5Q,GAAG2Q,IAAI;AAChB,wBAAA;AACF,oBAAA;oBACA,IAAI,CAAC3Q,GAAG8Q,WAAW,IAAI,CAAC,CAAC9Q,EAAAA,CAAG2Q,IAAI,EAAE;AAChC,wBAAA,OAAO3Q,GAAG2Q,IAAI;AAChB,oBAAA;oBACA,OAAO,IAAA;AACT,gBAAA,CAAA,CAAA,EACAxa,OAAOqY,SAAAA,IAAAA,EAAAA;oBACL,OAAOA,IAAAA;gBACT,CAAA,CAAA,CAAA,EAEF,IAAI,CAACnV,QAAQ,GAAG,IAAI0X,UAAAA,EAAAA,GAClBhR,SAAAA,CAA4BX,KAAAA,EAAO,gBAAA,CAAA,CAAkBM,IAAI,CAACvJ,MAAAA,CAAO,WAAA;oBAC/D,OAAO,CAAC,MAAKqW,iBAAiB;gBAChC,CAAA,CAAA,CAAA,CAAI9M,IAAI,CACNvJ,MAAAA,CAAO,WAAA;AACL,oBAAA,OAAO,MAAKoO,WAAW;AACzB,gBAAA,CAAA,CAAA,EACA3I,IAAIoE,SAAAA,EAAAA,EAAAA;oBACF4Q,gBAAAA,GAAmB,IAAA;AACnB5Q,oBAAAA,EAAAA,CAAGuO,cAAc,EAAA;AACjB,oBAAA,OAAOvO,GAAG2Q,IAAI;AAChB,gBAAA,CAAA,CAAA,EACAxa,MAAAA,CAAO,WAAA;oBACL,IAAM+W,CAAAA,GAAI,MAAKV,iBAAiB;AAChC,oBAAA,KAAA,CAAKA,iBAAiB,GAAG,KAAA;AACzB,oBAAA,OAAO,CAACU,CAAAA;gBACV,CAAA,CAAA,CAAA,CAAA,CAEJtN,SAAS,CAAC4O,SAAAA,IAAAA,EAAAA;AACV,oBAAA,KAAA,CAAKjK,WAAW,GAAG,KAAA;AACnB,oBAAA,IAAIiK,IAAAA,EAAM;AACR,wBAAA,IAAM7X,cAAAA,GAAiB,KAAA,CAAK2H,eAAe,CAACyG,SAAS;AACrD,wBAAA,IAAIpO,aAAc,CAAdA,cAAAA,EAA0B4P,SAAQ5P,cAAAA,CAAeyB,WAAW,KAAKoW,IAAAA,EAAM;AACzE7X,4BAAAA,cAAAA,CAAesU,MAAM,EAAA;AACvB,wBAAA;wBACA,KAAA,CAAKwB,SAAS,CAACI,KAAK,CAAC2B,IAAAA,CAAAA;AACvB,oBAAA;AACA,oBAAA,IAAIoC,gBAAAA,EAAkB;AACpB,wBAAA,IAAM/C,SAAAA,GAAY,KAAA,CAAK3O,SAAS,CAAC2O,SAAS;AAC1C,wBAAA,IAAIA,SAAAA,EAAW;4BACb,IAAMoB,KAAAA,GAAQ,IAAIuB,KAAAA,CAAY3C,SAAAA,EAAW,IAAA,CAAA;4BACzC4C,cAAAA,CAAe5C,SAAAA,CAAU6C,MAAM,EAAG,kBAAA,EAAoBzB,KAAAA,CAAAA;AACxD,wBAAA;AACF,oBAAA;oBACA2B,gBAAAA,GAAmB,KAAA;AACrB,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA;;;AAjbWwD,IAAAA,OAAAA,WAAAA;EAAoBpX,KAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChEjC,IAAM8X,iBAAiBC,SAAAA,CAAU,eAAA,CAAA;AA0B1B,IAAA,aAAMC,iBAAN,WAAA;AAAMA,IAAAA,SAAAA,aAAAA,CAKC,MAA0B,EAAA;AAL3BA,QAAAA,iBAAAA,CAAAA,IAAAA,EAAAA,aAAAA,CAAAA;;AACXC,QAAAA,gBAAAA,CAAAA,IAAAA,EAAAA,aAAAA,MAAAA,CAAAA;AAEA,QAAA,gBAAA,CAAA,IAAA,EAAQC,aAAR,MAAA,CAAA;aAEmB/W,MAAAA,GAAAA,MAAAA;QACjB,IAA0B6W,2BAAAA,GAAAA,aANjBA,CAM+BG,YAAY,IAA5CC,IAAAA,GAAkBJ,2BAAAA,CAAlBI,IAAAA,EAAMC,OAAAA,GAAYL,2BAAAA,CAAZK,OAAAA;AACdA,QAAAA,OAAAA,CAAQpD,OAAO,CAAC9T,MAAAA,CAAOmX,OAAO,CAACjY,IAAI,CAAA;QACnC,IAAIc,MAAAA,CAAOoX,SAAS,EAAE;YACpBpX,MAAAA,CAAOmX,OAAO,CAACjY,IAAI,CAACpH,KAAK,CAACsf,SAAS,GAAGpX,MAAAA,CAAOoX,SAAS;AACxD,QAAA;QACA,IAAI,CAACN,SAAS,GAAG;AAAC,YAAA;gBAChBO,OAAAA,EAAShc,cAAAA;gBACTic,QAAAA,EAAUtX;AACZ,aAAA;AAAG,YAAA;gBACDqX,OAAAA,EAAS9b,cAAAA;gBACT+b,QAAAA,EAAUJ;AACZ,aAAA;AAAG,YAAA;gBACDG,OAAAA,EAAS7b,aAAAA;gBACT8b,QAAAA,EAAUtX,MAAAA,CAAOmX,OAAO,CAACjY;AAC3B,aAAA;AAAG,YAAA;gBACDmY,OAAAA,EAAS5b,SAAAA;gBACT6b,QAAAA,EAAUL;AACZ,aAAA;AAAG,YAAA;gBACDI,OAAAA,EAASE,qBAAAA;gBACTC,WAAAA,EAAazX;AACf,aAAA;AAAG,YAAA;gBACDsX,OAAAA,EAASxY,KAAAA;gBACT4Y,QAAAA,EAAUzX,MAAAA,CAAOgC,kBAAkB,GAAGiU,WAAAA,GAAcrI;AACtD,aAAA;AAAG,YAAA;gBACDyJ,OAAAA,EAASvX,OAAAA;AACTwX,gBAAAA,QAAAA,EAAUtX,OAAOmX;AACnB,aAAA;AAAG,YAAA;gBACDE,OAAAA,EAASvY,UAAAA;AACTwY,gBAAAA,QAAAA,EAAUtX,OAAOmX;AACnB,aAAA;AAAG,YAAA;gBACDE,OAAAA,EAASK,YAAAA;AACTC,gBAAAA,UAAAA,EAAY,SAAZA,UAAAA,CAAa1W,KAAAA,EAAAA;AACX,oBAAA,IAAM2W,aAAa,IAAI3Y,OAAAA,EAAAA;AACvB,oBAAA,IAAM4Y,YAAY,IAAI5Y,OAAAA,EAAAA;AACtBgC,oBAAAA,KAAAA,CAAM2I,KAAK,CAACN,gBAAgB,CAAC/H,IAAI,CAC/B9D,IAAIqH,SAAAA,CAAAA,EAAAA;AAAK,wBAAA,OAAA,CAAC,CAACA,CAAAA;wBACX2F,oBAAAA,EAAAA,CAAAA,CACAhJ,SAAS,CAACsN,SAAAA,CAAAA,EAAAA;AACV,wBAAA,IAAIA,CAAAA,EAAG;AACL6I,4BAAAA,UAAAA,CAAWrU,IAAI,EAAA;wBACjB,CAAA,MAAO;AACLsU,4BAAAA,SAAAA,CAAUtU,IAAI,EAAA;AAChB,wBAAA;AACF,oBAAA,CAAA,CAAA;oBACA,OAAO;wBACLuU,OAAAA,EAASF,UAAAA;wBACTG,MAAAA,EAAQF;AACV,qBAAA;AACF,gBAAA,CAAA;gBACAG,IAAAA,EAAM;AAACnZ,oBAAAA;AAAM;AACf,aAAA;AACEnD,YAAAA,MAAAA;AACAqE,YAAAA,eAAAA;AACAiT,YAAAA;AACD,SAAA;QAED,IAAI,CAAC+D,SAAS,GAAGG,OAAAA;;AA9DRL,IAAAA,aAAAA,CAAAA,aAAAA,EAAAA;;AAiEX;;;;;AAKC,MACDoB,GAAAA,EAAAA,oBAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,kBAAAA,CAAmBjc,IAAY,EAAEC,mBAAoC,EAAEN,OAAgB,EAAA;gBACrF,IAAMkS,MAAAA,GAASlS,OAAAA,CAAQ0F,GAAG,CAAC3F,MAAAA,CAAAA;AAC3B,gBAAA,IAAMuS,GAAAA,GAAMJ,MAAAA,CAAO9R,QAAQ,CAACC,IAAAA,EAAMC,mBAAAA,CAAAA;gBAClC,IAAO,WAAA,CAAHgS,GAAAA,EAAeiK,SAAAA,CAAAA,EAAW;oBAC5B,OAAOjK,GAAAA;AACT,gBAAA;AACA,gBAAA,MAAM0I,cAAAA,CAAe,uDAAA,CAAA;AACvB,YAAA;;;AAEA;;;;;AAKC,MACDwB,GAAAA,EAAAA,gCAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,8BAAAA,CAA+B3F,IAAsB,EAAE4F,aAAmC,EAAEzc,OAAgB,EAAA;gBAC1G,IAAM0c,QAAAA,GAAW1c,OAAAA,CAAQ0F,GAAG,CAACiX,QAAAA,CAAAA;gBAC7B,OAAOD,QAAAA,CAASE,wBAAwB,CAAC/F,IAAAA,EAAM4F,aAAAA,CAAAA;AACjD,YAAA;;;YAEMI,GAAAA,EAAAA,OAAAA;AAAN,YAAA,KAAA,EAAA,SAAMA,MAAM7c,OAAgB,EAAA;;AACpBuD,oBAAAA,IAAAA,KAAAA,EAAAA,IAAAA;;;;;AAAAA,gCAAAA,IAAAA,GAAO,IAAI,CAACc,MAAM,CAACyY,QAAQ,EAAA;AACjC,gCAAA,IAAI,CAAM,WAAA,CAAJvZ,IAAAA,EAAgBwZ,WAAAA,CAAAA,EAAc;AAClC,oCAAA,MAAM/B,cAAAA,CAAe,qCAAA,CAAA;AACvB,gCAAA;AAEAzX,gCAAAA,IAAAA,CAAKuN,MAAM,CAAC,IAAI,CAACsK,SAAS,CAAA;AAC1B,gCAAA,OAAA;;oCAAMpb,OAAAA,CAAQ0F,GAAG,CAACxC,KAAAA,CAAAA,CAAOkP;;;AAAzB,gCAAA,MAAA,CAAA,IAAA,EAAA;AACA,gCAAA,OAAA;;AAAO,oCAAA,WAAA;wCACL,KAAA,CAAKgJ,SAAS,CAACjK,MAAM,EAAA;AACvB,oCAAA;;;;AACF,gBAAA,CAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA;;;;YAEA6L,GAAAA,EAAAA,gBAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,eAAehd,OAAgB,EAAA;AAC7B,gBAAA,IAAI,IAAI,CAACqE,MAAM,CAAC4Y,SAAS,EAAE;AACzBjd,oBAAAA,OAAAA,CAAQ+F,KAAK,EAAA;AACf,gBAAA;AACF,YAAA;;;YAEAmX,GAAAA,EAAAA,WAAAA;AAAAA,YAAAA,KAAAA,EAAAA,SAAAA,UAAUld,OAAgB,EAAA;gBACxBA,OAAAA,CAAQ0F,GAAG,CAACxC,KAAAA,CAAAA,CAAOwF,OAAO,EAAA;gBAC1B1I,OAAAA,CAAQ0F,GAAG,CAACtB,eAAAA,CAAAA,CAAiBsE,OAAO,EAAA;gBACpC1I,OAAAA,CAAQ0F,GAAG,CAAC2R,iBAAAA,CAAAA,CAAmB3O,OAAO,EAAA;AACxC,YAAA;;;;YAEe2S,GAAAA,EAAAA,cAAAA;mBAAf,SAAeA,YAAAA,GAAAA;gBACb,IAAMC,IAAAA,GAAOrgB,cAAc,KAAA,EAAO;oBAChCS,KAAAA,EAAO;wBACL,mBAAA,EAAqBoE;AACvB,qBAAA;oBACA7D,MAAAA,EAAQ;wBACN6L,QAAAA,EAAU,UAAA;wBACVjK,IAAAA,EAAM,CAAA;wBACNC,KAAAA,EAAO,CAAA;wBACPC,GAAAA,EAAK,CAAA;wBACL2Q,MAAAA,EAAQ,CAAA;wBACRK,aAAAA,EAAe;AAEjB;AACF,iBAAA,CAAA;gBACA,IAAMoO,WAAAA,GAAcliB,cAAc,KAAA,EAAO;oBACvCgB,MAAAA,EAAQ;wBACN6L,QAAAA,EAAU,UAAA;wBACVjK,IAAAA,EAAM,CAAA;wBACNC,KAAAA,EAAO,CAAA;wBACPC,GAAAA,EAAK,CAAA;wBACL2Q,MAAAA,EAAQ,CAAA;wBACR0O,MAAAA,EAAQ,QAAA;wBACRtF,MAAAA,EAAQ,CAAA;wBACR/I,aAAAA,EAAe,MAAA;wBACf+C,QAAAA,EAAU;AACZ,qBAAA;oBACA1V,QAAAA,EAAU;AAACkf,wBAAAA;AAAK;AAClB,iBAAA,CAAA;gBACA,IAAMC,OAAAA,GAAUtgB,cAAc,KAAA,EAAO;oBACnCS,KAAAA,EAAO;wBACL,mBAAA,EAAqBkE;AACvB,qBAAA;oBACA3D,MAAAA,EAAQ;wBACN8C,OAAAA,EAAS,MAAA;wBACT0c,SAAAA,EAAW,MAAA;wBACX3T,QAAAA,EAAU,UAAA;wBACVuV,aAAAA,EAAe;AACjB,qBAAA;oBACAjhB,QAAAA,EAAU;AAAC+gB,wBAAAA;AAAY;AACzB,iBAAA,CAAA;gBACA,OAAO;oBACL5B,OAAAA,EAAAA,OAAAA;oBACAD,IAAAA,EAAAA;AACF,iBAAA;AACF,YAAA;;;AAjKWJ,IAAAA,OAAAA,aAAAA;AAkKZ,CAAA;;;;"}