@acorex/components 21.0.0-next.56 → 21.0.0-next.57
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":"acorex-components-tree-view.mjs","sources":["../../../../packages/components/tree-view/src/lib/tree-view.service.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.html","../../../../packages/components/tree-view/src/lib/tree-view.module.ts","../../../../packages/components/tree-view/src/acorex-components-tree-view.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { AXTreeViewChildrenSelectionState, AXTreeViewFlatNode, AXTreeViewNode } from './tree-view.types';\n\n/**\n * Service for tree node operations\n * Handles all business logic for tree node manipulation\n */\n@Injectable()\nexport class AXTreeViewService {\n // ==================== Constants ====================\n private static readonly ROOT_LIST_ID = 'ax-tree-view-root-list';\n private static readonly NODE_DROP_PREFIX = 'ax-tree-view-node-drop-';\n private static readonly LIST_PREFIX = 'ax-tree-view-list-';\n\n // ==================== Node Finding & Traversal ====================\n /**\n * Find a node by ID in the tree\n */\n findNodeById(nodes: AXTreeViewNode[], id: string, idField = 'id', childrenField = 'children'): AXTreeViewNode | null {\n for (const node of nodes) {\n if ((node[idField] as string) === id) return node;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n const found = this.findNodeById(children, id, idField, childrenField);\n if (found) return found;\n }\n }\n return null;\n }\n\n /**\n * Find parent node of a given node\n */\n findParentNode(\n nodes: AXTreeViewNode[],\n targetNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode | undefined {\n const targetId = targetNode[idField] as string;\n for (const node of nodes) {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children?.some((child) => (child[idField] as string) === targetId)) {\n return node;\n }\n if (children) {\n const found = this.findParentNode(children, targetNode, idField, childrenField);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n /**\n * Check if targetNode is a descendant of ancestorNode (or the same node)\n * Prevents circular references by checking if target exists in ancestor's children tree\n */\n isValidDropTarget(\n movedNode: AXTreeViewNode,\n targetNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): boolean {\n const movedId = movedNode[idField] as string;\n const targetId = targetNode[idField] as string;\n if (movedId === targetId || this.isNodeDescendantOf(targetNode, movedNode, idField, childrenField)) {\n return false;\n }\n return true;\n }\n\n /**\n * Check if targetNode is a descendant of ancestorNode\n */\n private isNodeDescendantOf(\n targetNode: AXTreeViewNode,\n ancestorNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): boolean {\n const targetId = targetNode[idField] as string;\n const ancestorId = ancestorNode[idField] as string;\n if (targetId === ancestorId) {\n return true;\n }\n\n const children = ancestorNode[childrenField] as AXTreeViewNode[] | undefined;\n if (!children || children.length === 0) {\n return false;\n }\n\n for (const child of children) {\n const childId = child[idField] as string;\n if (childId === targetId) {\n return true;\n }\n if (this.isNodeDescendantOf(targetNode, child, idField, childrenField)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Build a flat list of all visible focusable nodes\n */\n buildFlatNodeList(\n nodes: AXTreeViewNode[],\n hiddenField = 'hidden',\n disabledField = 'disabled',\n expandedField = 'expanded',\n childrenField = 'children',\n ): AXTreeViewFlatNode[] {\n const flatList: AXTreeViewFlatNode[] = [];\n const traverse = (nodeList: AXTreeViewNode[], level: number, parent?: AXTreeViewNode): void => {\n for (const node of nodeList) {\n const hidden = node[hiddenField] as boolean | undefined;\n const disabled = node[disabledField] as boolean | undefined;\n if (hidden !== true && !disabled) {\n flatList.push({ node, level, parent });\n const expanded = node[expandedField] as boolean | undefined;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (expanded && children) {\n traverse(children, level + 1, node);\n }\n }\n }\n };\n traverse(nodes, 0);\n return flatList;\n }\n\n // ==================== Node State Checks ====================\n /**\n * Check if node has children\n */\n hasChildren(node: AXTreeViewNode, childrenField = 'children'): boolean {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n return Boolean(children?.length);\n }\n\n /**\n * Check if node can be lazy loaded\n */\n canLazyLoad(\n node: AXTreeViewNode,\n isLazyDataSource: boolean,\n childrenCountField = 'childrenCount',\n childrenField = 'children',\n ): boolean {\n const childrenCount = node[childrenCountField] as number | undefined;\n return isLazyDataSource && Boolean(childrenCount && childrenCount > 0 && !this.hasChildren(node, childrenField));\n }\n\n // ==================== Selection Management ====================\n /**\n * Recursively select/deselect all children\n */\n selectAllChildren(\n children: AXTreeViewNode[],\n selected: boolean,\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const child of children) {\n child[selectedField] = selected;\n child[indeterminateField] = false;\n const childChildren = child[childrenField] as AXTreeViewNode[] | undefined;\n if (childChildren) {\n this.selectAllChildren(childChildren, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Get selection state of children\n */\n getChildrenSelectionState(\n children: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): AXTreeViewChildrenSelectionState {\n let selectedCount = 0;\n let indeterminateCount = 0;\n\n for (const child of children) {\n const selected = child[selectedField] as boolean | undefined;\n const indeterminate = child[indeterminateField] as boolean | undefined;\n if (selected && !indeterminate) {\n selectedCount++;\n }\n if (indeterminate) {\n indeterminateCount++;\n }\n }\n\n return {\n allSelected: selectedCount === children.length,\n someSelected: selectedCount > 0 || indeterminateCount > 0,\n };\n }\n\n /**\n * Update parent node states based on children selection (with intermediate state support)\n */\n updateParentStates(\n nodes: AXTreeViewNode[],\n changedNode: AXTreeViewNode,\n intermediateState: boolean,\n idField = 'id',\n childrenField = 'children',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): void {\n const parent = this.findParentNode(nodes, changedNode, idField, childrenField);\n const parentChildren = parent?.[childrenField] as AXTreeViewNode[] | undefined;\n if (!parent || !parentChildren) return;\n\n const { allSelected, someSelected } = this.getChildrenSelectionState(\n parentChildren,\n selectedField,\n indeterminateField,\n );\n\n if (allSelected) {\n parent[selectedField] = true;\n parent[indeterminateField] = false;\n } else if (someSelected) {\n if (intermediateState) {\n parent[selectedField] = true;\n parent[indeterminateField] = true;\n } else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n } else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n\n this.updateParentStates(\n nodes,\n parent,\n intermediateState,\n idField,\n childrenField,\n selectedField,\n indeterminateField,\n );\n }\n\n /**\n * Recursively deselect all nodes\n */\n deselectAllNodes(\n nodes: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n node[selectedField] = false;\n node[indeterminateField] = false;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.deselectAllNodes(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Recursively set selection state for all nodes\n */\n setAllSelection(\n nodes: AXTreeViewNode[],\n selected: boolean,\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n node[selectedField] = selected;\n node[indeterminateField] = false;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.setAllSelection(children, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Recursively count selected nodes\n */\n countSelected(nodes: AXTreeViewNode[], selectedField = 'selected', childrenField = 'children'): number {\n let count = 0;\n for (const node of nodes) {\n if (node[selectedField] as boolean) count++;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n count += this.countSelected(children, selectedField, childrenField);\n }\n }\n return count;\n }\n\n /**\n * Recursively collect selected nodes\n */\n collectSelected(\n nodes: AXTreeViewNode[],\n result: AXTreeViewNode[],\n selectedField = 'selected',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n if (node[selectedField] as boolean) result.push(node);\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.collectSelected(children, result, selectedField, childrenField);\n }\n }\n }\n\n /**\n * Recursively remove selected nodes\n */\n removeSelected(\n nodes: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n const selected = node[selectedField] as boolean | undefined;\n const indeterminate = node[indeterminateField] as boolean | undefined;\n if (selected && !indeterminate) {\n nodes.splice(i, 1);\n } else {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.removeSelected(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n }\n\n /**\n * Recursively update all parent states in the tree (used after deletion)\n */\n updateAllParentStates(\n nodes: AXTreeViewNode[],\n intermediateState: boolean,\n childrenField = 'children',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): void {\n for (const node of nodes) {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children && children.length > 0) {\n this.updateAllParentStates(children, intermediateState, childrenField, selectedField, indeterminateField);\n\n const { allSelected, someSelected } = this.getChildrenSelectionState(\n children,\n selectedField,\n indeterminateField,\n );\n\n if (allSelected) {\n node[selectedField] = true;\n node[indeterminateField] = false;\n } else if (someSelected) {\n if (intermediateState) {\n node[selectedField] = true;\n node[indeterminateField] = true;\n } else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n } else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n }\n }\n\n // ==================== Expansion Management ====================\n /**\n * Recursively set expanded state (with lazy loading)\n */\n async setExpandedState(\n nodes: AXTreeViewNode[],\n expanded: boolean,\n isLazyDataSource: boolean,\n loadNodeChildren: (node: AXTreeViewNode) => Promise<void>,\n expandedField = 'expanded',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): Promise<void> {\n for (const node of nodes) {\n const hasChildren = this.hasChildren(node, childrenField);\n const canLazyLoad = this.canLazyLoad(node, isLazyDataSource, childrenCountField, childrenField);\n\n if (hasChildren || canLazyLoad) {\n if (expanded && canLazyLoad) {\n await loadNodeChildren(node);\n }\n node[expandedField] = expanded;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n await this.setExpandedState(\n children,\n expanded,\n isLazyDataSource,\n loadNodeChildren,\n expandedField,\n childrenField,\n childrenCountField,\n );\n }\n }\n }\n }\n\n // ==================== Drag & Drop Helpers ====================\n /**\n * Get array reference by drop list ID\n */\n getArrayByListId(\n nodes: AXTreeViewNode[],\n listId: string,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode[] | null {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return nodes;\n }\n\n if (listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)) {\n const nodeId = listId.replace(AXTreeViewService.NODE_DROP_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n return node ? [node] : null;\n }\n\n const nodeId = listId.replace(AXTreeViewService.LIST_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n const children = node?.[childrenField] as AXTreeViewNode[] | undefined;\n return children ?? null;\n }\n\n /**\n * Find parent node by list ID\n */\n findParentByListId(\n nodes: AXTreeViewNode[],\n listId: string,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode | undefined {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return undefined;\n }\n\n const prefix = listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)\n ? AXTreeViewService.NODE_DROP_PREFIX\n : AXTreeViewService.LIST_PREFIX;\n const nodeId = listId.replace(prefix, '');\n return this.findNodeById(nodes, nodeId, idField, childrenField) ?? undefined;\n }\n\n /**\n * Generate unique list ID for each node\n */\n getListId(node: AXTreeViewNode | undefined, idField = 'id'): string {\n if (!node) return AXTreeViewService.ROOT_LIST_ID;\n const nodeId = node[idField] as string;\n return `${AXTreeViewService.LIST_PREFIX}${nodeId}`;\n }\n\n /**\n * Get root list ID constant\n */\n getRootListId(): string {\n return AXTreeViewService.ROOT_LIST_ID;\n }\n\n /**\n * Get node drop prefix constant\n */\n getNodeDropPrefix(): string {\n return AXTreeViewService.NODE_DROP_PREFIX;\n }\n\n /**\n * Get list prefix constant\n */\n getListPrefix(): string {\n return AXTreeViewService.LIST_PREFIX;\n }\n\n // ==================== Node Utilities ====================\n /**\n * Get all nodes in a flat array\n */\n getAllNodes(nodes: AXTreeViewNode[], childrenField = 'children'): AXTreeViewNode[] {\n const allNodes: AXTreeViewNode[] = [];\n const traverse = (nodeList: AXTreeViewNode[]): void => {\n for (const node of nodeList) {\n allNodes.push(node);\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(nodes);\n return allNodes;\n }\n\n /**\n * Get the path to a node (array of parent nodes from root to node)\n */\n getNodePath(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n const path: AXTreeViewNode[] = [];\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return path;\n }\n\n let current: AXTreeViewNode | null = node;\n while (current) {\n path.unshift(current);\n const parent = this.findParentNode(nodes, current, idField, childrenField);\n current = parent ?? null;\n }\n\n return path;\n }\n\n /**\n * Get the level/depth of a node (0 = root level)\n */\n getNodeLevel(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): number {\n const path = this.getNodePath(nodes, nodeId, idField, childrenField);\n return path.length > 0 ? path.length - 1 : -1;\n }\n\n /**\n * Get sibling nodes of a given node\n */\n getSiblings(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return [];\n }\n\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const siblingsArray = (parent?.[childrenField] as AXTreeViewNode[] | undefined) ?? nodes;\n\n return siblingsArray.filter((n) => (n[idField] as string) !== nodeId);\n }\n\n /**\n * Clone a node (creates a deep copy)\n */\n cloneNode(\n node: AXTreeViewNode,\n idField = 'id',\n titleField = 'title',\n tooltipField = 'tooltip',\n iconField = 'icon',\n expandedField = 'expanded',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n disabledField = 'disabled',\n hiddenField = 'hidden',\n childrenCountField = 'childrenCount',\n dataField = 'data',\n childrenField = 'children',\n ): AXTreeViewNode {\n const cloned: AXTreeViewNode = {\n [idField]: `${node[idField] as string}-clone-${Date.now()}`,\n [titleField]: node[titleField],\n [tooltipField]: node[tooltipField],\n [iconField]: node[iconField],\n [expandedField]: node[expandedField],\n [selectedField]: false, // Cloned nodes are not selected by default\n [indeterminateField]: false,\n [disabledField]: node[disabledField],\n [hiddenField]: node[hiddenField],\n [childrenCountField]: node[childrenCountField],\n [dataField]: node[dataField] ? JSON.parse(JSON.stringify(node[dataField])) : undefined,\n };\n\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children && children.length > 0) {\n cloned[childrenField] = children.map((child) =>\n this.cloneNode(\n child,\n idField,\n titleField,\n tooltipField,\n iconField,\n expandedField,\n selectedField,\n indeterminateField,\n disabledField,\n hiddenField,\n childrenCountField,\n dataField,\n childrenField,\n ),\n );\n cloned[childrenCountField] = (cloned[childrenField] as AXTreeViewNode[]).length;\n }\n\n return cloned;\n }\n\n // ==================== Node Manipulation ====================\n /**\n * Move a node to a new parent in the tree\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to move\n * @param newParentId - The ID of the new parent (undefined for root level)\n * @param index - Optional index to insert at (default: append to end)\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @param expandedField - Field name for expanded state\n * @returns Object with success status, moved node, previous parent, new parent, and indices\n */\n moveNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n newParentId: string | undefined,\n index: number | undefined,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n expandedField = 'expanded',\n ): {\n success: boolean;\n movedNode?: AXTreeViewNode;\n previousParent?: AXTreeViewNode;\n newParent?: AXTreeViewNode;\n previousIndex: number;\n currentIndex: number;\n } {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n\n // Find current parent\n const currentParent = this.findParentNode(nodes, node, idField, childrenField);\n const currentParentChildren = currentParent\n ? (currentParent[childrenField] as AXTreeViewNode[] | undefined)\n : undefined;\n const currentArray = currentParentChildren ?? nodes;\n\n // Find and remove from current location\n const currentIndex = currentArray.findIndex((n) => (n[idField] as string) === nodeId);\n if (currentIndex === -1) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n\n const movedNode = currentArray.splice(currentIndex, 1)[0];\n\n // Find new parent\n let targetArray: AXTreeViewNode[];\n let newParent: AXTreeViewNode | undefined;\n\n if (newParentId) {\n newParent = this.findNodeById(nodes, newParentId, idField, childrenField);\n if (!newParent) {\n // Restore node if new parent not found\n currentArray.splice(currentIndex, 0, movedNode);\n return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n }\n\n // Validate drop target\n if (!this.isValidDropTarget(movedNode, newParent, idField, childrenField)) {\n // Restore node if invalid drop target\n currentArray.splice(currentIndex, 0, movedNode);\n return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n }\n\n let newParentChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n if (!newParentChildren) {\n newParentChildren = [];\n newParent[childrenField] = newParentChildren;\n }\n targetArray = newParentChildren;\n } else {\n targetArray = nodes;\n }\n\n // Calculate new index before inserting\n const newIndex = index !== undefined && index >= 0 && index <= targetArray.length ? index : targetArray.length;\n\n // Insert at new location\n if (index !== undefined && index >= 0 && index <= targetArray.length) {\n targetArray.splice(index, 0, movedNode);\n } else {\n targetArray.push(movedNode);\n }\n\n // Update childrenCount\n if (currentParent) {\n const updatedChildren = currentParent[childrenField] as AXTreeViewNode[] | undefined;\n currentParent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n if (newParent) {\n const updatedChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n newParent[childrenCountField] = updatedChildren?.length ?? 0;\n newParent[expandedField] = true; // Auto-expand new parent\n }\n\n return {\n success: true,\n movedNode,\n previousParent: currentParent,\n newParent,\n previousIndex: currentIndex,\n currentIndex: newIndex,\n };\n }\n\n /**\n * Edit/update a node's properties\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to edit\n * @param updates - Partial node object with properties to update\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @returns The updated node if found, null otherwise\n */\n editNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n updates: Partial<AXTreeViewNode>,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): AXTreeViewNode | null {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\n }\n\n // Update node properties\n Object.assign(node, updates);\n\n // If children array is provided, ensure it exists and update childrenCount\n if (updates[childrenField] !== undefined) {\n const children = updates[childrenField] as AXTreeViewNode[] | undefined;\n node[childrenField] = children;\n node[childrenCountField] = children?.length;\n }\n\n return node;\n }\n\n /**\n * Add a child node to a parent node\n * @param nodes - Root nodes array\n * @param parentId - The ID of the parent node\n * @param childNode - The child node to add\n * @param index - Optional index to insert at (default: append to end)\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @param expandedField - Field name for expanded state\n * @returns The parent node if found and child was added, null otherwise\n */\n addChild(\n nodes: AXTreeViewNode[],\n parentId: string,\n childNode: AXTreeViewNode,\n index: number | undefined,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n expandedField = 'expanded',\n ): AXTreeViewNode | null {\n const parent = this.findNodeById(nodes, parentId, idField, childrenField);\n if (!parent) {\n return null;\n }\n\n // Ensure children array exists\n let children = parent[childrenField] as AXTreeViewNode[] | undefined;\n if (!children) {\n children = [];\n parent[childrenField] = children;\n }\n\n // Insert or append child\n if (index !== undefined && index >= 0 && index <= children.length) {\n children.splice(index, 0, childNode);\n } else {\n children.push(childNode);\n }\n\n // Update childrenCount\n parent[childrenCountField] = children.length;\n\n // Auto-expand parent if it was collapsed\n if (!(parent[expandedField] as boolean | undefined)) {\n parent[expandedField] = true;\n }\n\n return parent;\n }\n\n /**\n * Remove a node from the tree\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to remove\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @returns The removed node if found, null otherwise\n */\n removeNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): AXTreeViewNode | null {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\n }\n\n // Find parent to remove from its children array\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const parentChildren = parent ? (parent[childrenField] as AXTreeViewNode[] | undefined) : undefined;\n const targetArray = parentChildren ?? nodes;\n\n // Find and remove the node\n const index = targetArray.findIndex((n) => (n[idField] as string) === nodeId);\n if (index !== -1) {\n const removed = targetArray.splice(index, 1)[0];\n\n // Update parent's childrenCount if it exists\n if (parent) {\n const updatedChildren = parent[childrenField] as AXTreeViewNode[] | undefined;\n parent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n\n return removed;\n }\n\n return null;\n }\n\n /**\n * Validate node structure (check for required fields and circular references)\n */\n validateNode(\n node: AXTreeViewNode,\n visitedIds: Set<string> = new Set(),\n idField = 'id',\n titleField = 'title',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n const nodeId = node[idField] as string | undefined;\n const nodeTitle = node[titleField] as string | undefined;\n\n if (!nodeId) {\n errors.push(`Node must have an ${idField}`);\n }\n\n if (!nodeTitle) {\n errors.push(`Node must have a ${titleField}`);\n }\n\n if (nodeId && visitedIds.has(nodeId)) {\n errors.push(`Circular reference detected: node ${nodeId} appears multiple times in the tree`);\n }\n\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n const newVisited = new Set(visitedIds);\n if (nodeId) {\n newVisited.add(nodeId);\n }\n\n for (const child of children) {\n const childValidation = this.validateNode(\n child,\n newVisited,\n idField,\n titleField,\n childrenField,\n childrenCountField,\n );\n if (!childValidation.valid) {\n errors.push(...childValidation.errors.map((e) => `Child of ${nodeId}: ${e}`));\n }\n }\n\n const childrenCount = node[childrenCountField] as number | undefined;\n if (childrenCount !== undefined && childrenCount !== children.length) {\n errors.push(\n `Node ${nodeId}: ${childrenCountField} (${childrenCount}) does not match ${childrenField} array length (${children.length})`,\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n","import { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDoubleClickDirective } from '@acorex/cdk/double-click';\nimport {\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXDropListDroppedEvent,\n moveItemInArray,\n transferArrayItem,\n} from '@acorex/cdk/drag-drop';\nimport { AXFocusTrapDirective } from '@acorex/cdk/focus-trap';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCheckBoxComponent } from '@acorex/components/check-box';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n EventEmitter,\n inject,\n input,\n model,\n Output,\n output,\n signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { map } from 'rxjs/operators';\nimport { AXTreeViewService } from './tree-view.service';\nimport {\n AXTreeViewBeforeDropEvent,\n AXTreeViewCallback,\n AXTreeViewDataSource,\n AXTreeViewDragArea,\n AXTreeViewDragBehavior,\n AXTreeViewDropEvent,\n AXTreeViewFlatNode,\n AXTreeViewNode,\n AXTreeViewNodeClickEvent,\n AXTreeViewNodeDoubleClickEvent,\n AXTreeViewNodeSelectEvent,\n AXTreeViewItemTemplateContext as AXTreeViewNodeTemplateContext,\n AXTreeViewNodeToggleEvent,\n AXTreeViewSelectionBehavior,\n AXTreeViewSelectionChangeEvent,\n AXTreeViewSelectMode,\n AXTreeViewViewLook,\n} from './tree-view.types';\n\n@Component({\n selector: 'ax-tree-view',\n templateUrl: './tree-view.component.html',\n styleUrls: ['./tree-view.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [AXTreeViewService],\n imports: [\n CommonModule,\n FormsModule,\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXDoubleClickDirective,\n AXFocusTrapDirective,\n NgTemplateOutlet,\n AXButtonComponent,\n AXCheckBoxComponent,\n AXBadgeComponent,\n AXDecoratorIconComponent,\n AXSkeletonComponent,\n AXTooltipDirective,\n ],\n host: {\n class: 'ax-tree-view',\n role: 'tree',\n tabindex: '0',\n '[class.ax-tree-view-default]': \"look() === 'default'\",\n '[class.ax-tree-view-card]': \"look() === 'card'\",\n '[class.ax-tree-view-with-line]': \"look() === 'with-line'\",\n '[class.ax-tree-view-rtl]': 'isRtl',\n '[style.--ax-tree-view-indent-size]': \"indentSize() + 'px'\",\n '[style.--ax-tree-view-line-offset]': \"(indentSize() / 2) + 'px'\",\n '[attr.aria-label]': '\"Tree navigation\"',\n '(keydown)': 'handleKeyDown($event)',\n '(focus)': 'onTreeFocus($event)',\n '(blur)': 'onTreeBlur($event)',\n },\n})\nexport class AXTreeViewComponent {\n // ==================== Dependencies ====================\n private readonly treeService = inject(AXTreeViewService);\n private readonly platformService = inject(AXPlatform);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==================== Inputs ====================\n /** Tree data source - can be static array or lazy loading function */\n readonly datasource = model.required<AXTreeViewDataSource>();\n\n /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */\n readonly selectMode = input<AXTreeViewSelectMode>('single');\n\n /** Selection behavior: 'all' (select anything, no special behavior), 'intermediate' (parent indeterminate state when children selected), 'leaf' (only leaf nodes selectable), 'nested' (selecting parent selects all children). Default: `'intermediate'` */\n readonly selectionBehavior = input<AXTreeViewSelectionBehavior>('intermediate');\n\n /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */\n readonly dragArea = input<AXTreeViewDragArea>('handler');\n\n /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */\n readonly dragBehavior = input<AXTreeViewDragBehavior>('none');\n\n /** Whether to show icons. Default: `true` */\n readonly showIcons = input(true);\n\n /** Whether to show children count badge. Default: `true` */\n readonly showChildrenBadge = input(true);\n\n /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */\n readonly expandedIcon = input('fa-solid fa-chevron-down');\n\n /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */\n readonly collapsedIcon = input('fa-solid fa-chevron-right');\n\n /** Indent size in pixels for each level. Default: `16` */\n readonly indentSize = input(16);\n\n /** Visual style variant. Default: `'default'` */\n readonly look = input<AXTreeViewViewLook>('default');\n\n /** Custom template for tree items. Default: `undefined` */\n readonly nodeTemplate = input<TemplateRef<AXTreeViewNodeTemplateContext>>();\n\n /** Field name for node ID. Default: `'id'` */\n readonly idField = input('id');\n\n /** Field name for node title. Default: `'title'` */\n readonly titleField = input('title');\n\n /** Field name for node tooltip. Default: `'tooltip'` */\n readonly tooltipField = input('tooltip');\n\n /** Field name for node icon. Default: `'icon'` */\n readonly iconField = input('icon');\n\n /** Field name for expanded state. Default: `'expanded'` */\n readonly expandedField = input('expanded');\n\n /** Field name for selected state. Default: `'selected'` */\n readonly selectedField = input('selected');\n\n /** Field name for indeterminate state. Default: `'indeterminate'` */\n readonly indeterminateField = input('indeterminate');\n\n /** Field name for disabled state. Default: `'disabled'` */\n readonly disabledField = input('disabled');\n\n /** Field name for hidden state. Default: `'hidden'` */\n readonly hiddenField = input('hidden');\n\n /** Field name for children array. Default: `'children'` */\n readonly childrenField = input('children');\n\n /** Field name for children count. Default: `'childrenCount'` */\n readonly childrenCountField = input('childrenCount');\n\n /** Field name for custom data. Default: `'data'` */\n readonly dataField = input('data');\n\n /** Whether disabled state is inherited from parent nodes. Default: `true`. */\n readonly inheritDisabled = input(true);\n\n /** Whether double-click on node content toggles expand/collapse. Default: `true`. */\n readonly expandOnDoubleClick = input(true);\n\n // ==================== Outputs ====================\n /** Emitted before a drop operation - set canceled to true to prevent drop */\n readonly onBeforeDrop = output<AXTreeViewBeforeDropEvent>();\n\n /** Emitted when a node is toggled (expanded/collapsed) */\n readonly onNodeToggle = output<AXTreeViewNodeToggleEvent>();\n\n /** Emitted when a node is selected/deselected */\n readonly onNodeSelect = output<AXTreeViewNodeSelectEvent>();\n\n /** Emitted when a node is double-clicked */\n // readonly onNodeDoubleClick = output<AXTreeViewNodeDoubleClickEvent>();\n @Output() onNodeDoubleClick = new EventEmitter<AXTreeViewNodeDoubleClickEvent>();\n\n /** Emitted when a node is double-clicked */\n readonly onNodeClick = output<AXTreeViewNodeClickEvent>();\n\n /** Emitted when selection changes - returns all currently selected nodes */\n readonly onSelectionChange = output<AXTreeViewSelectionChangeEvent>();\n\n /** Emitted when nodes are reordered within the same parent */\n readonly onOrderChange = output<AXTreeViewDropEvent>();\n\n /** Emitted when a node is moved to a different parent */\n readonly onMoveChange = output<AXTreeViewDropEvent>();\n\n /** Emitted for any item change (order or move) */\n readonly onItemsChange = output<AXTreeViewDropEvent>();\n\n // ==================== Internal State ====================\n /** Internal signal for tree nodes */\n protected readonly nodes = signal<AXTreeViewNode[]>([]);\n\n /** Internal signal for tracking loading state of individual nodes */\n protected readonly loadingNodes = signal<Set<string>>(new Set());\n\n /** Signal for tracking root/tree-level loading state (used by reloadData) */\n private readonly _isLoading = signal(false);\n\n /** Public readonly signal for tree loading state - can be used in templates */\n readonly isLoading = this._isLoading.asReadonly();\n\n /** Currently focused node ID for keyboard navigation */\n protected readonly focusedNodeId = signal<string | null>(null);\n\n /** RTL detection signal */\n protected readonly isRtl = signal(this.platformService.isRtl());\n\n /** active node id */\n protected readonly activeNodeId = signal<string | null>(null);\n\n /** Computed chevron icons that flip for RTL */\n protected readonly directionExpandedIcon = computed(() => this.expandedIcon());\n\n protected readonly directionCollapsedIcon = computed(() => {\n const isRtlDirection = this.isRtl();\n const defaultIcon = this.collapsedIcon();\n\n if (isRtlDirection && defaultIcon === 'fa-solid fa-chevron-right') {\n return 'fa-solid fa-chevron-left';\n }\n if (!isRtlDirection && defaultIcon === 'fa-solid fa-chevron-left') {\n return 'fa-solid fa-chevron-right';\n }\n return defaultIcon;\n });\n\n /** Flag to prevent infinite loops when syncing datasource */\n private isUpdatingFromDatasource = false;\n\n /** Computed to check if datasource is a function */\n private readonly isLazyDataSource = computed(() => typeof this.datasource() === 'function');\n\n /** Computed: Returns true when selection is restricted to leaf nodes only */\n protected readonly isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf');\n\n /** Computed: Returns true when selecting a parent automatically selects all its children */\n protected readonly cascadesToChildren = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'nested' || behavior === 'intermediate-nested';\n });\n\n /** Computed: Returns true when parent nodes show indeterminate state based on children selection */\n protected readonly hasIntermediateState = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'intermediate' || behavior === 'intermediate-nested';\n });\n\n /** Computed: Returns true when drag handle should be shown */\n protected readonly shouldShowDragHandle = computed(() => {\n return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';\n });\n\n /** Signal to track if double-click output has subscribers */\n private readonly hasDoubleClickSubscribers = signal(false);\n\n /**\n * Returns true if double-click output has no subscribers (should disable directive)\n * Uses a computed signal that checks if EventEmitter has observers\n * If no subscribers AND expandOnDoubleClick is false, disable the directive (return true)\n * If has subscribers OR expandOnDoubleClick is true, enable the directive (return false)\n */\n protected readonly isDoubleClickDisabled = computed(() => {\n // If expandOnDoubleClick is enabled, we need the directive to work, so don't disable it\n if (this.expandOnDoubleClick()) {\n return false;\n }\n // Otherwise, disable if no subscribers\n return !this.hasDoubleClickSubscribers();\n });\n\n /** Check EventEmitter observers and update signal */\n private checkDoubleClickSubscribers(): void {\n // Access the EventEmitter's observers property\n // EventEmitter extends Subject which has observers array\n const emitter = this.onNodeDoubleClick as any;\n const observers = emitter?.observers || [];\n const hasSubscribers = observers.length > 0;\n this.hasDoubleClickSubscribers.set(hasSubscribers);\n }\n\n // ==================== Node Property Helpers ====================\n /**\n * Get a property value from a node using the configured field name\n */\n protected getNodeProp<T = unknown>(node: AXTreeViewNode, fieldName: string, defaultValue?: T): T {\n return (node[fieldName] as T) ?? (defaultValue as T);\n }\n\n /**\n * Set a property value on a node using the configured field name\n */\n protected setNodeProp(node: AXTreeViewNode, fieldName: string, value: unknown): void {\n node[fieldName] = value;\n }\n\n /**\n * Get node ID\n */\n protected getNodeId(node: AXTreeViewNode): string {\n return this.getNodeProp<string>(node, this.idField(), '');\n }\n\n /**\n * Get node title\n */\n protected getNodeTitle(node: AXTreeViewNode): string {\n return this.getNodeProp<string>(node, this.titleField(), '');\n }\n\n /**\n * Get node tooltip\n */\n protected getNodeTooltip(node: AXTreeViewNode): string | undefined {\n return this.getNodeProp<string | undefined>(node, this.tooltipField(), undefined);\n }\n\n /**\n * Get node icon\n */\n protected getNodeIcon(node: AXTreeViewNode): string | undefined {\n return this.getNodeProp<string | undefined>(node, this.iconField(), undefined);\n }\n\n /**\n * Get node expanded state\n */\n protected getNodeExpanded(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.expandedField(), false);\n }\n\n /**\n * Set node expanded state\n */\n protected setNodeExpanded(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.expandedField(), value);\n }\n\n /**\n * Get node selected state\n */\n protected getNodeSelected(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.selectedField(), false);\n }\n\n /**\n * Set node selected state\n */\n protected setNodeSelected(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.selectedField(), value);\n }\n\n /**\n * Get node indeterminate state\n */\n protected getNodeIndeterminate(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.indeterminateField(), false);\n }\n\n /**\n * Set node indeterminate state\n */\n protected setNodeIndeterminate(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.indeterminateField(), value);\n }\n\n /**\n * Get node's own disabled state (without inheritance)\n */\n protected getNodeDisabled(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.disabledField(), false);\n }\n\n /**\n * Check if node is effectively disabled (considering inheritance from parents)\n * When inheritDisabled is true:\n * - Returns true if node itself is disabled\n * - Returns true if any ancestor is disabled AND node doesn't have explicit `disabled: false`\n * When inheritDisabled is false:\n * - Only returns node's own disabled state\n */\n protected isNodeEffectivelyDisabled(node: AXTreeViewNode): boolean {\n // Check if node itself is disabled\n if (this.getNodeDisabled(node)) {\n return true;\n }\n\n // If not inheriting disabled state, just return false (node is not disabled)\n if (!this.inheritDisabled()) {\n return false;\n }\n\n // Check if node explicitly has disabled: false (override inheritance)\n const nodeDisabledValue = node[this.disabledField()];\n if (nodeDisabledValue === false) {\n return false;\n }\n\n // Check ancestors for disabled state\n return this.isAnyAncestorDisabled(node);\n }\n\n /**\n * Check if any ancestor of the node is disabled\n */\n private isAnyAncestorDisabled(node: AXTreeViewNode): boolean {\n const parent = this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField());\n\n if (!parent) {\n return false;\n }\n\n if (this.getNodeDisabled(parent)) {\n return true;\n }\n\n return this.isAnyAncestorDisabled(parent);\n }\n\n /**\n * Get node hidden state\n */\n protected getNodeHidden(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.hiddenField(), false);\n }\n\n /**\n * Get node children array\n */\n protected getNodeChildren(node: AXTreeViewNode): AXTreeViewNode[] | undefined {\n return this.getNodeProp<AXTreeViewNode[] | undefined>(node, this.childrenField(), undefined);\n }\n\n /**\n * Set node children array\n */\n protected setNodeChildren(node: AXTreeViewNode, value: AXTreeViewNode[] | undefined): void {\n this.setNodeProp(node, this.childrenField(), value);\n }\n\n /**\n * Get node children count\n */\n protected getNodeChildrenCount(node: AXTreeViewNode): number | undefined {\n return this.getNodeProp<number | undefined>(node, this.childrenCountField(), undefined);\n }\n\n /**\n * Set node children count\n */\n protected setNodeChildrenCount(node: AXTreeViewNode, value: number | undefined): void {\n this.setNodeProp(node, this.childrenCountField(), value);\n }\n\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n readonly #datasourceEffect = effect(async () => {\n if (this.isUpdatingFromDatasource) {\n return;\n }\n\n const ds = this.datasource();\n if (Array.isArray(ds)) {\n this.nodes.set([...ds]);\n } else if (typeof ds === 'function') {\n try {\n await this.loadRootItems(ds);\n } catch (error: unknown) {\n this.handleError('Failed to load root items', error);\n }\n }\n });\n\n /** Initialize direction change listener */\n readonly #initDirectionListener = afterNextRender(() => {\n this.platformService.directionChange\n .pipe(\n map((event) => event.data === 'rtl'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((isRtl) => this.isRtl.set(isRtl));\n\n // Check double-click subscribers after view initialization\n this.checkDoubleClickSubscribers();\n\n // Set up periodic check to detect when subscribers are added/removed\n // This ensures we catch template bindings that happen after initial render\n const intervalId = setInterval(() => {\n this.checkDoubleClickSubscribers();\n }, 100);\n\n // Clean up interval on destroy\n this.destroyRef.onDestroy(() => {\n clearInterval(intervalId);\n });\n });\n\n // ==================== Public API ====================\n /**\n * Expand all nodes in the tree (with lazy loading support)\n */\n async expandAll(): Promise<void> {\n await this.treeService.setExpandedState(\n this.nodes(),\n true,\n this.isLazyDataSource(),\n (node) => this.loadNodeChildren(node),\n this.expandedField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n this.refreshNodes();\n }\n\n /**\n * Collapse all nodes in the tree\n */\n collapseAll(): void {\n this.treeService.setExpandedState(\n this.nodes(),\n false,\n this.isLazyDataSource(),\n (node) => this.loadNodeChildren(node),\n this.expandedField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n this.refreshNodes();\n }\n\n /**\n * Get count of selected nodes\n */\n getSelectedCount(): number {\n return this.treeService.countSelected(this.nodes(), this.selectedField(), this.childrenField());\n }\n\n /**\n * Check if any nodes are selected\n */\n hasSelection(): boolean {\n return this.getSelectedCount() > 0;\n }\n\n /**\n * Get all selected nodes\n */\n getSelectedNodes(): AXTreeViewNode[] {\n const selected: AXTreeViewNode[] = [];\n this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());\n return selected;\n }\n\n /**\n * Delete selected nodes from the tree\n */\n deleteSelected(): void {\n this.treeService.removeSelected(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n if (!this.isLeafOnlyMode()) {\n this.treeService.updateAllParentStates(\n this.nodes(),\n this.hasIntermediateState(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Select all nodes in the tree (respects disabled state)\n */\n selectAll(): void {\n if (this.selectMode() === 'none') {\n return;\n }\n if (this.isLeafOnlyMode()) {\n // Only select leaf nodes that are not disabled\n const selectLeafs = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (this.isLeafNode(node) && !this.isNodeEffectivelyDisabled(node)) {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n selectLeafs(children);\n }\n }\n };\n selectLeafs(this.nodes());\n } else {\n // Select all nodes that are not disabled\n const selectAllNonDisabled = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (!this.isNodeEffectivelyDisabled(node)) {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n selectAllNonDisabled(children);\n }\n }\n };\n selectAllNonDisabled(this.nodes());\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Deselect all nodes in the tree\n */\n deselectAll(): void {\n this.treeService.setAllSelection(\n this.nodes(),\n false,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Find a node by ID in the tree\n */\n findNode(id: string): AXTreeViewNode | null {\n return this.treeService.findNodeById(this.nodes(), id, this.idField(), this.childrenField());\n }\n\n /**\n * Refresh the tree to trigger change detection\n */\n refresh(): void {\n this.refreshNodes();\n }\n\n /**\n * Reload the entire tree data from the datasource\n * For callback datasource: clears all nodes and reloads from root\n * For array datasource: refreshes the current data\n * @returns Promise that resolves when reload is complete\n */\n async reloadData(): Promise<void> {\n // Prevent concurrent reloads\n if (this._isLoading()) {\n return;\n }\n\n const ds = this.datasource();\n\n if (typeof ds === 'function') {\n this._isLoading.set(true);\n\n // Clear states in batch for better performance\n this.loadingNodes.set(new Set());\n this.nodes.set([]);\n this.focusedNodeId.set(null);\n this.activeNodeId.set(null);\n\n try {\n const result = ds();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n } catch (error: unknown) {\n this.handleError('Failed to reload data', error);\n this.nodes.set([]);\n } finally {\n this._isLoading.set(false);\n }\n } else if (Array.isArray(ds)) {\n // For array datasource, just refresh from the current data\n this.nodes.set([...ds]);\n }\n }\n\n /**\n * Check if the tree is currently loading data (root level)\n * @returns true if the tree is loading root data\n */\n getIsLoading(): boolean {\n return this._isLoading();\n }\n\n /**\n * Check if a node is currently loading\n */\n isNodeLoading(nodeId: string): boolean {\n return this.loadingNodes().has(nodeId);\n }\n\n /**\n * Get loading state for a node (internal state)\n */\n getNodeLoading(node: AXTreeViewNode): boolean {\n return this.loadingNodes().has(this.getNodeId(node));\n }\n\n /**\n * Edit/update a node's properties\n * @param nodeId - The ID of the node to edit\n * @param updates - Partial node object with properties to update\n * @returns true if node was found and updated, false otherwise\n */\n editNode(nodeId: string, updates: Partial<AXTreeViewNode>): boolean {\n const updated = this.treeService.editNode(\n this.nodes(),\n nodeId,\n updates,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n if (updated) {\n this.refreshNodes();\n return true;\n }\n return false;\n }\n\n /**\n * Add a child node to a parent node\n * @param parentId - The ID of the parent node\n * @param childNode - The child node to add\n * @param index - Optional index to insert at (default: append to end)\n * @returns true if parent was found and child was added, false otherwise\n */\n addChild(parentId: string, childNode: AXTreeViewNode, index?: number): boolean {\n const parent = this.treeService.addChild(\n this.nodes(),\n parentId,\n childNode,\n index,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n this.expandedField(),\n );\n if (parent) {\n this.refreshNodes();\n return true;\n }\n return false;\n }\n\n /**\n * Remove a node from the tree\n * @param nodeId - The ID of the node to remove\n * @returns The removed node if found, null otherwise\n */\n removeNode(nodeId: string): AXTreeViewNode | null {\n const removed = this.treeService.removeNode(\n this.nodes(),\n nodeId,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n if (removed) {\n // Update parent states if needed\n if (this.hasIntermediateState()) {\n this.treeService.updateAllParentStates(\n this.nodes(),\n this.hasIntermediateState(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n this.refreshNodes();\n }\n return removed;\n }\n\n /**\n * Expand a specific node\n * @param nodeId - The ID of the node to expand\n * @returns Promise that resolves when expansion is complete (if lazy loading)\n */\n async expandNode(nodeId: string): Promise<void> {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n if (hasChildren || canLazyLoad) {\n if (canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n this.setNodeExpanded(node, true);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('expand') });\n }\n }\n\n /**\n * Collapse a specific node\n * @param nodeId - The ID of the node to collapse\n */\n collapseNode(nodeId: string): void {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n if (this.getNodeExpanded(node)) {\n this.setNodeExpanded(node, false);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('collapse') });\n }\n }\n\n /**\n * Toggle expansion state of a specific node\n * @param nodeId - The ID of the node to toggle\n * @returns Promise that resolves when toggle is complete (if lazy loading)\n */\n async toggleNodeExpansion(nodeId: string): Promise<void> {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n if (this.getNodeExpanded(node)) {\n this.collapseNode(nodeId);\n } else {\n await this.expandNode(nodeId);\n }\n }\n\n /**\n * Programmatically select a node\n * @param nodeId - The ID of the node to select\n * @returns true if node was found and selected, false otherwise\n */\n selectNode(nodeId: string): boolean {\n if (this.selectMode() === 'none') {\n return false;\n }\n const node = this.findNode(nodeId);\n if (!node || this.isNodeEffectivelyDisabled(node) || !this.canSelectNode(node)) {\n return false;\n }\n\n const mode = this.selectMode();\n if (mode === 'single') {\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n } else {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n true,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: false,\n });\n this.emitSelectionChange();\n return true;\n }\n\n /**\n * Programmatically deselect a node\n * @param nodeId - The ID of the node to deselect\n * @returns true if node was found and deselected, false otherwise\n */\n deselectNode(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n if (!node) {\n return false;\n }\n\n this.setNodeSelected(node, false);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n false,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: false,\n });\n this.emitSelectionChange();\n return true;\n }\n\n /**\n * Get parent node of a given node\n * @param nodeId - The ID of the node\n * @returns The parent node if found, null otherwise\n */\n getParent(nodeId: string): AXTreeViewNode | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField()) ?? null;\n }\n\n /**\n * Get children of a node\n * @param nodeId - The ID of the parent node\n * @returns Array of child nodes, or null if node not found\n */\n getChildren(nodeId: string): AXTreeViewNode[] | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.getNodeChildren(node) ?? [];\n }\n\n /**\n * Get all root nodes\n * @returns Array of root nodes\n */\n getRootNodes(): AXTreeViewNode[] {\n return [...this.nodes()];\n }\n\n /**\n * Get all nodes in a flat array\n * @returns Array of all nodes in the tree\n */\n getAllNodes(): AXTreeViewNode[] {\n return this.treeService.getAllNodes(this.nodes(), this.childrenField());\n }\n\n /**\n * Get the path to a node (array of parent IDs from root to node)\n * @param nodeId - The ID of the node\n * @returns Array of node IDs representing the path, or empty array if node not found\n */\n getNodePath(nodeId: string): string[] {\n const nodePath = this.treeService.getNodePath(this.nodes(), nodeId, this.idField(), this.childrenField());\n return nodePath.map((node) => this.getNodeId(node));\n }\n\n /**\n * Get the level/depth of a node (0 = root level)\n * @param nodeId - The ID of the node\n * @returns The level of the node, or -1 if node not found\n */\n getNodeLevel(nodeId: string): number {\n return this.treeService.getNodeLevel(this.nodes(), nodeId, this.idField(), this.childrenField());\n }\n\n /**\n * Programmatically move a node to a new parent\n * @param nodeId - The ID of the node to move\n * @param newParentId - The ID of the new parent (undefined for root level)\n * @param index - Optional index to insert at (default: append to end)\n * @returns true if move was successful, false otherwise\n */\n moveNode(nodeId: string, newParentId?: string, index?: number): boolean {\n const result = this.treeService.moveNode(\n this.nodes(),\n nodeId,\n newParentId,\n index,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n this.expandedField(),\n );\n\n if (result.success && result.movedNode) {\n // Emit drop events\n this.emitDropEvents(\n result.movedNode,\n result.previousParent,\n result.newParent,\n result.previousIndex,\n result.currentIndex,\n false,\n );\n this.refreshNodes();\n return true;\n }\n\n return false;\n }\n\n /**\n * Clone a node (creates a deep copy)\n * @param nodeId - The ID of the node to clone\n * @returns The cloned node, or null if node not found\n */\n cloneNode(nodeId: string): AXTreeViewNode | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n\n return this.treeService.cloneNode(\n node,\n this.idField(),\n this.titleField(),\n this.tooltipField(),\n this.iconField(),\n this.expandedField(),\n this.selectedField(),\n this.indeterminateField(),\n this.disabledField(),\n this.hiddenField(),\n this.childrenCountField(),\n this.dataField(),\n this.childrenField(),\n );\n }\n\n /**\n * Focus a specific node by ID\n * @param nodeId - The ID of the node to focus\n * @returns true if node was found and focused, false otherwise\n */\n focusNode(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n if (!node || this.getNodeHidden(node) === true || this.isNodeEffectivelyDisabled(node)) {\n return false;\n }\n this.focusNodeById(nodeId);\n return true;\n }\n\n /**\n * Get all expanded nodes\n * @returns Array of expanded nodes\n */\n getExpandedNodes(): AXTreeViewNode[] {\n const expanded: AXTreeViewNode[] = [];\n const traverse = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (this.getNodeExpanded(node)) {\n expanded.push(node);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(this.nodes());\n return expanded;\n }\n\n /**\n * Get all collapsed nodes that have children\n * @returns Array of collapsed nodes with children\n */\n getCollapsedNodes(): AXTreeViewNode[] {\n const collapsed: AXTreeViewNode[] = [];\n const traverse = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n const children = this.getNodeChildren(node);\n const childrenCount = this.getNodeChildrenCount(node);\n if (!this.getNodeExpanded(node) && (children?.length || childrenCount)) {\n collapsed.push(node);\n }\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(this.nodes());\n return collapsed;\n }\n\n /**\n * Check if a node is expanded\n * @param nodeId - The ID of the node\n * @returns true if node is expanded, false otherwise\n */\n isNodeExpanded(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.getNodeExpanded(node) : false;\n }\n\n /**\n * Check if a node is selected\n * @param nodeId - The ID of the node\n * @returns true if node is selected, false otherwise\n */\n isNodeSelected(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.getNodeSelected(node) : false;\n }\n\n /**\n * Check if a node has children\n * @param nodeId - The ID of the node\n * @returns true if node has children, false otherwise\n */\n hasChildren(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return this.treeService.hasChildren(node ?? {}, this.childrenField());\n }\n\n /**\n * Check if a node is disabled (considering inheritance from parent nodes)\n * @param nodeId - The ID of the node\n * @returns true if node is disabled (directly or inherited), false otherwise\n */\n isDisabled(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.isNodeEffectivelyDisabled(node) : false;\n }\n\n /**\n * Get template context for a node\n */\n getTemplateContext(node: AXTreeViewNode, level = 0): AXTreeViewNodeTemplateContext {\n const children = this.getNodeChildren(node);\n const childrenCount = this.getNodeChildrenCount(node);\n return {\n $implicit: node,\n node,\n level,\n expanded: this.getNodeExpanded(node),\n childrenCount: childrenCount ?? children?.length ?? 0,\n loading: this.getNodeLoading(node),\n disabled: this.isNodeEffectivelyDisabled(node),\n };\n }\n\n /**\n * Calculate padding-inline for a node based on its level\n */\n getNodePaddingInline(level: number): number {\n const indent = this.indentSize();\n const currentLook = this.look();\n const multiplier = currentLook === 'with-line' ? 1 / 3 : 1;\n return level * indent * multiplier;\n }\n\n /**\n * Check if node should show expand toggle\n */\n shouldShowExpandToggle(node: AXTreeViewNode): boolean {\n return (\n this.treeService.hasChildren(node, this.childrenField()) ||\n this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField())\n );\n }\n\n /**\n * Check if checkboxes should be shown (only for multiple mode)\n */\n shouldShowCheckbox(): boolean {\n return this.selectMode() === 'multiple';\n }\n\n /**\n * Check if double-click directive should be disabled for a node\n * Disabled for leaf nodes (immediate clicks) or when isDoubleClickDisabled is true\n */\n protected isDoubleClickDisabledForNode(node: AXTreeViewNode): boolean {\n return this.isDoubleClickDisabled() || this.isLeafNode(node);\n }\n\n /**\n * Check if a node is a leaf (has no children)\n * A node is a leaf if it has no loaded children AND no childrenCount (or childrenCount is 0)\n */\n isLeafNode(node: AXTreeViewNode): boolean {\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const childrenCount = this.getNodeChildrenCount(node);\n const hasChildrenCount = childrenCount && childrenCount > 0;\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n // A node is a leaf if:\n // 1. It has no loaded children\n // 2. AND it has no childrenCount (or childrenCount is 0)\n // 3. AND it cannot be lazy loaded\n return !hasChildren && !hasChildrenCount && !canLazyLoad;\n }\n\n /**\n * Check if a node can be selected (considering selectMode and isLeafOnlyMode)\n */\n canSelectNode(node: AXTreeViewNode): boolean {\n if (this.selectMode() === 'none') {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n\n /**\n * Check if checkbox should be shown for a specific node\n */\n shouldShowCheckboxForNode(node: AXTreeViewNode): boolean {\n if (!this.shouldShowCheckbox()) {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n\n /**\n * Generate unique list ID for each node\n */\n getListId(node?: AXTreeViewNode): string {\n return this.treeService.getListId(node, this.idField());\n }\n\n /**\n * Check if a node is currently focused\n */\n isNodeFocused(nodeId: string): boolean {\n return this.focusedNodeId() === nodeId;\n }\n\n /**\n * Get ARIA level for a node\n */\n getNodeAriaLevel(level: number): number {\n return level + 1;\n }\n\n /**\n * Get ARIA expanded state for a node\n */\n getNodeAriaExpanded(node: AXTreeViewNode): string | null {\n if (!this.shouldShowExpandToggle(node)) {\n return null;\n }\n return this.getNodeExpanded(node) ? 'true' : 'false';\n }\n\n /**\n * Get ARIA selected state for a node\n */\n getNodeAriaSelected(node: AXTreeViewNode): string | null {\n if (this.selectMode() === 'none') {\n return null;\n }\n const selected = this.getNodeSelected(node);\n if (this.selectMode() === 'single') {\n return selected ? 'true' : 'false';\n }\n if (this.selectMode() === 'multiple') {\n return selected ? 'true' : 'false';\n }\n return null;\n }\n\n /**\n * Emit selection change event with all selected nodes\n */\n private emitSelectionChange(): void {\n const selectedNodes = this.getSelectedNodes();\n this.onSelectionChange.emit({\n component: this,\n selectedNodes,\n });\n }\n\n // ==================== Event Handlers ====================\n\n /**\n * Handle node double click\n */\n async onNodeDoubleClickHandle(node: AXTreeViewNode, event: Event): Promise<void> {\n if (this.isNodeEffectivelyDisabled(node)) return;\n\n // If expandOnDoubleClick is enabled and node has children, toggle expansion\n if (this.expandOnDoubleClick() && this.shouldShowExpandToggle(node)) {\n await this.toggleNodeExpansion(node[this.idField()] as string);\n }\n\n this.onNodeDoubleClick.emit({\n component: this,\n node,\n nativeEvent: event,\n });\n }\n /**\n * Handle node click handle\n */\n onNodeClickHandle(node: AXTreeViewNode, event: Event): void {\n if (this.isNodeEffectivelyDisabled(node)) return;\n\n const mode = this.selectMode();\n\n this.activeNodeId.set(this.getNodeId(node));\n if (mode === 'single') {\n this.handleSingleSelection(node, event);\n }\n\n this.onNodeClick.emit({ component: this, node, nativeEvent: event });\n }\n\n /**\n * Toggle node expansion state with lazy loading support\n * Note: Disabled nodes can still be toggled (expanded/collapsed) for better UX\n */\n async toggleNode(node: AXTreeViewNode, event: Event): Promise<void> {\n if (this.isEvent(event) && typeof event.stopPropagation === 'function') {\n event.stopPropagation();\n }\n\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n if (hasChildren || canLazyLoad) {\n const willExpand = !this.getNodeExpanded(node);\n\n if (willExpand && canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n\n this.setNodeExpanded(node, willExpand);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: event });\n }\n }\n\n /**\n * Toggle node selection state with indeterminate support (for multiple mode)\n */\n toggleSelection(node: AXTreeViewNode, event: AXValueChangedEvent): void {\n if (!event.isUserInteraction) return;\n if (this.selectMode() === 'none') return;\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n if (mode !== 'multiple') return;\n\n const newValue = event.value === null ? true : event.value;\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: event.isUserInteraction,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle drop events for tree nodes\n */\n onDrop(event: AXDropListDroppedEvent, parentNode?: AXTreeViewNode): void {\n const targetArray = parentNode ? (this.getNodeChildren(parentNode) ?? []) : this.nodes();\n const isReordering = event.previousContainer === event.container;\n\n if (isReordering) {\n this.handleReorder(event, targetArray, parentNode);\n } else {\n this.handleMove(event, targetArray, parentNode);\n }\n\n this.refreshNodes();\n }\n\n /**\n * Handle drop events when dropping directly onto a node (to make it a child)\n */\n onDropOntoNode(event: AXDropListDroppedEvent, targetNode: AXTreeViewNode): void {\n if (!this.canMoveToParent()) return;\n\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray) return;\n\n const movedNode = sourceArray[event.previousIndex];\n\n if (!this.treeService.isValidDropTarget(movedNode, targetNode, this.idField(), this.childrenField())) return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, targetNode, event.previousIndex, 0)) return;\n\n let targetChildren = this.getNodeChildren(targetNode);\n if (!targetChildren) {\n targetChildren = [];\n this.setNodeChildren(targetNode, targetChildren);\n }\n sourceArray.splice(event.previousIndex, 1);\n targetChildren.unshift(movedNode);\n this.setNodeExpanded(targetNode, true);\n\n this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), targetNode, event.previousIndex, 0, false);\n\n this.refreshNodes();\n }\n\n /**\n * Handle node focus event\n */\n onNodeFocus(nodeId: string): void {\n this.focusedNodeId.set(nodeId);\n }\n\n /**\n * Handle tree container focus - focus first node if none is focused\n */\n onTreeFocus(event: FocusEvent): void {\n if (event.target === event.currentTarget) {\n const flatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n if (flatList.length > 0) {\n const focusedId = this.focusedNodeId();\n if (focusedId) {\n // Check if the focused node still exists and is not hidden\n const focusedNode = this.treeService.findNodeById(\n this.nodes(),\n focusedId,\n this.idField(),\n this.childrenField(),\n );\n if (focusedNode && this.getNodeHidden(focusedNode) !== true) {\n this.focusNodeById(focusedId);\n } else {\n // Focused node no longer exists, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\n } else {\n // No node is focused, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\n }\n }\n }\n\n /**\n * Handle tree container blur\n */\n onTreeBlur(event: FocusEvent): void {\n if (event.relatedTarget && !(event.currentTarget as HTMLElement).contains(event.relatedTarget as Node)) {\n this.focusedNodeId.set(null);\n }\n }\n\n /**\n * Handle keyboard navigation\n */\n handleKeyDown(event: KeyboardEvent): void {\n const flatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n if (flatList.length === 0) return;\n\n const currentFocused = this.getFocusedNode();\n let currentIndex = currentFocused\n ? flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentFocused))\n : -1;\n\n if (currentIndex === -1 && event.target === event.currentTarget) {\n currentIndex = 0;\n }\n\n const navigationResult = this.handleNavigationKey(event, flatList, currentIndex, currentFocused);\n if (navigationResult.handled) {\n if (navigationResult.shouldPreventDefault) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (\n navigationResult.targetIndex !== null &&\n navigationResult.targetIndex >= 0 &&\n navigationResult.targetIndex < flatList.length\n ) {\n this.focusNodeById(this.getNodeId(flatList[navigationResult.targetIndex].node));\n }\n }\n }\n\n // ==================== Private Methods ====================\n /**\n * Load root items when datasource is a function\n */\n private async loadRootItems(loadFn: AXTreeViewCallback): Promise<void> {\n try {\n const result = loadFn();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n } catch (error: unknown) {\n this.handleError('Failed to load root items', error);\n this.nodes.set([]);\n }\n }\n\n /**\n * Load children for a node using lazy loading\n * Only calls callback if:\n * - children field is undefined or empty\n * - AND childrenCount > 0\n */\n private async loadNodeChildren(node: AXTreeViewNode): Promise<void> {\n const nodeId = this.getNodeId(node);\n if (!this.isLazyDataSource() || this.loadingNodes().has(nodeId)) return;\n\n // If children are already loaded, don't call callback\n const existingChildren = this.getNodeChildren(node);\n if (existingChildren && existingChildren.length > 0) {\n return;\n }\n\n // Only call callback if childrenCount > 0\n const childrenCount = this.getNodeChildrenCount(node);\n if (!childrenCount || childrenCount <= 0) {\n return;\n }\n\n const ds = this.datasource();\n if (typeof ds !== 'function') return;\n\n try {\n this.loadingNodes.update((set) => new Set(set).add(nodeId));\n this.refreshNodes();\n\n const result = ds(nodeId);\n const children = result instanceof Promise ? await result : result;\n this.setNodeChildren(node, children);\n this.setNodeChildrenCount(node, children.length);\n } catch (error: unknown) {\n this.handleError('Failed to load children', error);\n this.setNodeChildrenCount(node, 0);\n } finally {\n this.loadingNodes.update((set) => {\n const newSet = new Set(set);\n newSet.delete(nodeId);\n return newSet;\n });\n this.refreshNodes();\n }\n }\n\n /**\n * Internal method to refresh nodes signal and sync back to datasource if it's an array\n * Creates new array references for all nested children to ensure reactivity\n */\n private refreshNodes(): void {\n const currentNodes = this.nodes();\n // Create new array references for all nested children to ensure reactivity\n // This ensures Angular's change detection picks up changes even with callback datasource\n this.ensureNewArrayReferences(currentNodes);\n this.nodes.set([...currentNodes]);\n\n if (!this.isLazyDataSource() && !this.isUpdatingFromDatasource) {\n this.isUpdatingFromDatasource = true;\n this.datasource.set([...currentNodes]);\n setTimeout(() => {\n this.isUpdatingFromDatasource = false;\n }, 0);\n }\n }\n\n /**\n * Recursively ensure all children arrays have new references to trigger change detection\n * Mutates the tree structure by replacing children arrays with new array references\n */\n private ensureNewArrayReferences(nodes: AXTreeViewNode[]): void {\n for (const node of nodes) {\n const children = this.getNodeChildren(node);\n if (children && children.length > 0) {\n // Create new array reference for children\n this.setNodeChildren(node, [...children]);\n // Recursively process nested children\n this.ensureNewArrayReferences(children);\n }\n }\n }\n\n /**\n * Handle single selection mode\n */\n private handleSingleSelection(node: AXTreeViewNode, event: Event): void {\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)\n */\n private handleMultipleSelection(node: AXTreeViewNode, event: Event): void {\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Get array reference by drop list ID\n */\n private getArrayByListId(listId: string): AXTreeViewNode[] | null {\n return this.treeService.getArrayByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n\n /**\n * Find parent node by list ID\n */\n private findParentByListId(listId: string): AXTreeViewNode | undefined {\n return this.treeService.findParentByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n\n /**\n * Check if move operation is allowed based on dragBehavior\n */\n private canMoveToParent(): boolean {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'order-only';\n }\n\n /**\n * Check if reorder operation is allowed based on dragBehavior\n */\n private canReorder(): boolean {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'move';\n }\n\n /**\n * Handle reordering within the same list */\n private handleReorder(\n event: AXDropListDroppedEvent,\n targetArray: AXTreeViewNode[],\n parentNode?: AXTreeViewNode,\n ): void {\n if (!this.canReorder()) return;\n\n const movedNode = targetArray[event.previousIndex];\n moveItemInArray(targetArray, event.previousIndex, event.currentIndex);\n\n this.emitDropEvents(movedNode, parentNode, parentNode, event.previousIndex, event.currentIndex, true);\n }\n\n /**\n * Handle moving between different lists\n */\n private handleMove(event: AXDropListDroppedEvent, targetArray: AXTreeViewNode[], parentNode?: AXTreeViewNode): void {\n if (!this.canMoveToParent()) return;\n\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray) return;\n\n const movedNode = sourceArray[event.previousIndex];\n\n if (parentNode && !this.treeService.isValidDropTarget(movedNode, parentNode)) return;\n\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, parentNode, event.previousIndex, event.currentIndex)) {\n return;\n }\n\n transferArrayItem(sourceArray, targetArray, event.previousIndex, event.currentIndex);\n\n this.emitDropEvents(\n movedNode,\n this.findParentByListId(sourceListId),\n parentNode,\n event.previousIndex,\n event.currentIndex,\n false,\n );\n }\n\n /**\n * Emit beforeDrop event and return whether to continue\n */\n private emitBeforeDropEvent(\n movedNode: AXTreeViewNode,\n sourceListId: string,\n currentParent: AXTreeViewNode | undefined,\n previousIndex: number,\n currentIndex: number,\n ): boolean {\n const beforeDropEvent: AXTreeViewBeforeDropEvent = {\n component: this,\n movedNode,\n previousParent: this.findParentByListId(sourceListId),\n currentParent,\n previousIndex,\n currentIndex,\n canceled: false,\n };\n this.onBeforeDrop.emit(beforeDropEvent);\n\n return !beforeDropEvent.canceled;\n }\n\n /**\n * Emit drop events based on operation type\n */\n private emitDropEvents(\n node: AXTreeViewNode,\n previousParent: AXTreeViewNode | undefined,\n currentParent: AXTreeViewNode | undefined,\n previousIndex: number,\n currentIndex: number,\n isReorder: boolean,\n ): void {\n const dropEvent: AXTreeViewDropEvent = {\n component: this,\n node,\n previousParent,\n currentParent,\n previousIndex,\n currentIndex,\n };\n\n if (isReorder) {\n this.onOrderChange.emit(dropEvent);\n } else {\n this.onMoveChange.emit(dropEvent);\n }\n this.onItemsChange.emit(dropEvent);\n }\n\n /**\n * Get the currently focused node\n */\n private getFocusedNode(): AXTreeViewNode | null {\n const focusedId = this.focusedNodeId();\n if (!focusedId) return null;\n return this.treeService.findNodeById(this.nodes(), focusedId, this.idField(), this.childrenField());\n }\n\n /**\n * Set focus to a node by ID\n */\n private focusNodeById(nodeId: string): void {\n this.focusedNodeId.set(nodeId);\n setTimeout(() => {\n const element = document.querySelector<HTMLElement>(`[data-tree-node-id=\"${nodeId}\"]`);\n if (element) {\n element.focus();\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n\n /**\n * Handle keyboard navigation keys\n */\n private handleNavigationKey(\n event: KeyboardEvent,\n flatList: AXTreeViewFlatNode[],\n currentIndex: number,\n currentFocused: AXTreeViewNode | null,\n ): { handled: boolean; shouldPreventDefault: boolean; targetIndex: number | null } {\n let targetIndex: number | null = currentIndex;\n let shouldPreventDefault = true;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetIndex = currentIndex - 1;\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowDown':\n if (currentIndex < flatList.length - 1) {\n targetIndex = currentIndex + 1;\n } else if (currentIndex === -1) {\n targetIndex = 0;\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowLeft':\n if (currentFocused) {\n if (this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n this.toggleNode(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n } else {\n const currentItem = flatList[currentIndex];\n if (currentItem?.parent) {\n targetIndex = flatList.findIndex(\n (item) => this.getNodeId(item.node) === this.getNodeId(currentItem.parent),\n );\n } else {\n shouldPreventDefault = false;\n }\n }\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowRight':\n if (currentFocused) {\n if (!this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n this.toggleNode(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n } else if (\n this.getNodeExpanded(currentFocused) &&\n this.treeService.hasChildren(currentFocused, this.childrenField())\n ) {\n const children = this.getNodeChildren(currentFocused);\n if (children && children.length > 0) {\n const firstChild = children[0];\n targetIndex = flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(firstChild));\n if (targetIndex === -1) {\n const updatedFlatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n targetIndex = updatedFlatList.findIndex(\n (item) => this.getNodeId(item.node) === this.getNodeId(firstChild),\n );\n if (targetIndex >= 0 && targetIndex < updatedFlatList.length) {\n this.focusNodeById(this.getNodeId(updatedFlatList[targetIndex].node));\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n }\n } else {\n shouldPreventDefault = false;\n }\n } else {\n shouldPreventDefault = false;\n }\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'Home':\n targetIndex = 0;\n break;\n\n case 'End':\n targetIndex = flatList.length - 1;\n break;\n\n case ' ':\n case 'Space':\n if (currentFocused && this.selectMode() !== 'none' && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleSpaceKeySelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n shouldPreventDefault = false;\n break;\n\n case 'Enter':\n if (currentFocused && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleEnterKeySelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n shouldPreventDefault = false;\n break;\n\n default:\n if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {\n if (currentFocused && this.selectMode() === 'multiple' && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleCtrlEnterSelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n }\n handled = false;\n shouldPreventDefault = false;\n break;\n }\n\n return { handled, shouldPreventDefault, targetIndex };\n }\n\n /**\n * Handle Space key selection\n * In single mode: replaces selection (deselects all, selects this node)\n * In multiple mode: toggles selection\n */\n private handleSpaceKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n\n if (mode === 'single') {\n // Single mode: replace selection\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n } else {\n // Multiple mode: toggle selection\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle Enter key selection\n * In single mode: replaces selection (deselects all, selects this node)\n * In multiple mode: replaces selection (deselects all, selects this node and respects selectionBehavior)\n */\n private handleEnterKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n\n // Enter key always replaces selection (deselects all first)\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n\n if (mode === 'multiple') {\n const children = this.getNodeChildren(node);\n // Respect selectionBehavior: cascade to children if enabled\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n true,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n // Respect selectionBehavior: update parent states if intermediate mode\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle Ctrl/Cmd + Enter key selection\n */\n private handleCtrlEnterSelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Type guard to check if value is an Event\n */\n private isEvent(value: unknown): value is Event {\n return value instanceof Event;\n }\n\n /**\n * Handle errors consistently\n */\n private handleError(message: string, error: unknown): void {\n if (error instanceof Error) {\n console.error(`${message}:`, error.message);\n } else {\n console.error(`${message}:`, error);\n }\n }\n}\n","<!-- Root loading skeleton -->\n@if (isLoading()) {\n <div class=\"ax-tree-view-drop-list\">\n @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n <div class=\"ax-tree-view-node\">\n <div class=\"ax-tree-view-node-content\">\n <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Root drop list -->\n<div\n axFocusTrap\n [axDropList]=\"dragBehavior() !== 'none'\"\n [sortingDisabled]=\"false\"\n [id]=\"getListId()\"\n [attr.data-node-id]=\"null\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event)\"\n class=\"ax-tree-view-drop-list\"\n [class.ax-tree-view-card]=\"look() === 'card'\"\n [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n [class.ax-tree-view-loading]=\"isLoading()\"\n role=\"group\"\n>\n @for (node of nodes(); track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(0)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n ⋮⋮\n </span>\n }\n <ax-button\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n @if (nodeTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n <div\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"getListId(parent)\"\n [attr.data-node-id]=\"getNodeId(parent)\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event, parent)\"\n class=\"ax-tree-view-drop-list\"\n role=\"group\"\n >\n @for (node of children; track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(level)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (axSingleClick)=\"onNodeClickHandle(node, $event)\"\n (axDoubleClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n ⋮⋮\n </span>\n }\n <ax-button\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n\n @if (nodeTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { AXTreeViewComponent } from './tree-view.component';\n\n@NgModule({\n imports: [AXTreeViewComponent],\n})\nexport class AXTreeViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAGA;;;AAGG;MAEU,iBAAiB,CAAA;;aAEJ,IAAA,CAAA,YAAY,GAAG,wBAAH,CAA4B;aACxC,IAAA,CAAA,gBAAgB,GAAG,yBAAH,CAA6B;aAC7C,IAAA,CAAA,WAAW,GAAG,oBAAH,CAAwB;;AAG3D;;AAEG;IACH,YAAY,CAAC,KAAuB,EAAE,EAAU,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAA;AAC1F,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAK,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE;AAAE,gBAAA,OAAO,IAAI;AACjD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC;AACrE,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,cAAc,CACZ,KAAuB,EACvB,UAA0B,EAC1B,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAW;AAC9C,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;AACpE,YAAA,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,KAAM,KAAK,CAAC,OAAO,CAAY,KAAK,QAAQ,CAAC,EAAE;AACtE,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC;AAC/E,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;AAGG;IACH,iBAAiB,CACf,SAAyB,EACzB,UAA0B,EAC1B,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAW;AAC5C,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAW;AAC9C,QAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;AAClG,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACK,kBAAkB,CACxB,UAA0B,EAC1B,YAA4B,EAC5B,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAW;AAC9C,QAAA,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAW;AAClD,QAAA,IAAI,QAAQ,KAAK,UAAU,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAiC;QAC5E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAW;AACxC,YAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;AACxB,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;AACtE,gBAAA,OAAO,IAAI;YACb;QACF;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;AACH,IAAA,iBAAiB,CACf,KAAuB,EACvB,WAAW,GAAG,QAAQ,EACtB,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAAA;QAE1B,MAAM,QAAQ,GAAyB,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,QAA0B,EAAE,KAAa,EAAE,MAAuB,KAAU;AAC5F,YAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAwB;AACvD,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAwB;AAC3D,gBAAA,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACtC,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAwB;AAC3D,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;AACpE,oBAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;wBACxB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC;oBACrC;gBACF;YACF;AACF,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;AAClB,QAAA,OAAO,QAAQ;IACjB;;AAGA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAoB,EAAE,aAAa,GAAG,UAAU,EAAA;AAC1D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;AACpE,QAAA,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClC;AAEA;;AAEG;IACH,WAAW,CACT,IAAoB,EACpB,gBAAyB,EACzB,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAuB;QACpE,OAAO,gBAAgB,IAAI,OAAO,CAAC,aAAa,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClH;;AAGA;;AAEG;AACH,IAAA,iBAAiB,CACf,QAA0B,EAC1B,QAAiB,EACjB,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,YAAA,KAAK,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC/B,YAAA,KAAK,CAAC,kBAAkB,CAAC,GAAG,KAAK;AACjC,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAiC;YAC1E,IAAI,aAAa,EAAE;AACjB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;YACnG;QACF;IACF;AAEA;;AAEG;IACH,yBAAyB,CACvB,QAA0B,EAC1B,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;QAEpC,IAAI,aAAa,GAAG,CAAC;QACrB,IAAI,kBAAkB,GAAG,CAAC;AAE1B,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAwB;AAC5D,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,kBAAkB,CAAwB;AACtE,YAAA,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC9B,gBAAA,aAAa,EAAE;YACjB;YACA,IAAI,aAAa,EAAE;AACjB,gBAAA,kBAAkB,EAAE;YACtB;QACF;QAEA,OAAO;AACL,YAAA,WAAW,EAAE,aAAa,KAAK,QAAQ,CAAC,MAAM;AAC9C,YAAA,YAAY,EAAE,aAAa,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC;SAC1D;IACH;AAEA;;AAEG;IACH,kBAAkB,CAChB,KAAuB,EACvB,WAA2B,EAC3B,iBAA0B,EAC1B,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;AAEpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC;AAC9E,QAAA,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,CAAiC;AAC9E,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc;YAAE;AAEhC,QAAA,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAClE,cAAc,EACd,aAAa,EACb,kBAAkB,CACnB;QAED,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;AAC5B,YAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;QACpC;aAAO,IAAI,YAAY,EAAE;YACvB,IAAI,iBAAiB,EAAE;AACrB,gBAAA,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;AAC5B,gBAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,IAAI;YACnC;iBAAO;AACL,gBAAA,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK;AAC7B,gBAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;YACpC;QACF;aAAO;AACL,YAAA,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK;AAC7B,YAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;QACpC;AAEA,QAAA,IAAI,CAAC,kBAAkB,CACrB,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,aAAa,EACb,kBAAkB,CACnB;IACH;AAEA;;AAEG;AACH,IAAA,gBAAgB,CACd,KAAuB,EACvB,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAChC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;YACnF;QACF;IACF;AAEA;;AAEG;AACH,IAAA,eAAe,CACb,KAAuB,EACvB,QAAiB,EACjB,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC9B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAChC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;YAC5F;QACF;IACF;AAEA;;AAEG;IACH,aAAa,CAAC,KAAuB,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAA;QAC3F,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,aAAa,CAAY;AAAE,gBAAA,KAAK,EAAE;AAC3C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,EAAE;gBACZ,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC;YACrE;QACF;AACA,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;IACH,eAAe,CACb,KAAuB,EACvB,MAAwB,EACxB,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,aAAa,CAAY;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACrD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC;YACtE;QACF;IACF;AAEA;;AAEG;AACH,IAAA,cAAc,CACZ,KAAuB,EACvB,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAwB;AAC3D,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAwB;AACrE,YAAA,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC9B,gBAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB;iBAAO;AACL,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;gBACpE,IAAI,QAAQ,EAAE;oBACZ,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;gBACjF;YACF;QACF;IACF;AAEA;;AAEG;AACH,IAAA,qBAAqB,CACnB,KAAuB,EACvB,iBAA0B,EAC1B,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;AAEpC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;YACpE,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,CAAC;AAEzG,gBAAA,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAClE,QAAQ,EACR,aAAa,EACb,kBAAkB,CACnB;gBAED,IAAI,WAAW,EAAE;AACf,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;AAC1B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;gBAClC;qBAAO,IAAI,YAAY,EAAE;oBACvB,IAAI,iBAAiB,EAAE;AACrB,wBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;AAC1B,wBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI;oBACjC;yBAAO;AACL,wBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AAC3B,wBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;oBAClC;gBACF;qBAAO;AACL,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AAC3B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;gBAClC;YACF;QACF;IACF;;AAGA;;AAEG;IACH,MAAM,gBAAgB,CACpB,KAAuB,EACvB,QAAiB,EACjB,gBAAyB,EACzB,gBAAyD,EACzD,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;AAEpC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;AACzD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,CAAC;AAE/F,YAAA,IAAI,WAAW,IAAI,WAAW,EAAE;AAC9B,gBAAA,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC3B,oBAAA,MAAM,gBAAgB,CAAC,IAAI,CAAC;gBAC9B;AACA,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC9B,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;gBACpE,IAAI,QAAQ,EAAE;AACZ,oBAAA,MAAM,IAAI,CAAC,gBAAgB,CACzB,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,CACnB;gBACH;YACF;QACF;IACF;;AAGA;;AAEG;IACH,gBAAgB,CACd,KAAuB,EACvB,MAAc,EACd,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,IAAI,MAAM,KAAK,iBAAiB,CAAC,YAAY,EAAE;AAC7C,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE;AACzD,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,CAAC;AACrE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;YACrE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI;QAC7B;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;AAChE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;AACrE,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,aAAa,CAAiC;QACtE,OAAO,QAAQ,IAAI,IAAI;IACzB;AAEA;;AAEG;IACH,kBAAkB,CAChB,KAAuB,EACvB,MAAc,EACd,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,IAAI,MAAM,KAAK,iBAAiB,CAAC,YAAY,EAAE;AAC7C,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,gBAAgB;cAC/D,iBAAiB,CAAC;AACpB,cAAE,iBAAiB,CAAC,WAAW;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACzC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,SAAS;IAC9E;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,IAAgC,EAAE,OAAO,GAAG,IAAI,EAAA;AACxD,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO,iBAAiB,CAAC,YAAY;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAW;AACtC,QAAA,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAA,EAAG,MAAM,EAAE;IACpD;AAEA;;AAEG;IACH,aAAa,GAAA;QACX,OAAO,iBAAiB,CAAC,YAAY;IACvC;AAEA;;AAEG;IACH,iBAAiB,GAAA;QACf,OAAO,iBAAiB,CAAC,gBAAgB;IAC3C;AAEA;;AAEG;IACH,aAAa,GAAA;QACX,OAAO,iBAAiB,CAAC,WAAW;IACtC;;AAGA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAuB,EAAE,aAAa,GAAG,UAAU,EAAA;QAC7D,MAAM,QAAQ,GAAqB,EAAE;AACrC,QAAA,MAAM,QAAQ,GAAG,CAAC,QAA0B,KAAU;AACpD,YAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;gBACpE,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,QAAQ,CAAC;gBACpB;YACF;AACF,QAAA,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC;AACf,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;IACH,WAAW,CAAC,KAAuB,EAAE,MAAc,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAA;QAC7F,MAAM,IAAI,GAAqB,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;QAEA,IAAI,OAAO,GAA0B,IAAI;QACzC,OAAO,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACrB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;AAC1E,YAAA,OAAO,GAAG,MAAM,IAAI,IAAI;QAC1B;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,YAAY,CAAC,KAAuB,EAAE,MAAc,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAA;AAC9F,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;AACpE,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C;AAEA;;AAEG;IACH,WAAW,CAAC,KAAuB,EAAE,MAAc,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAA;AAC7F,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QACvE,MAAM,aAAa,GAAI,MAAM,GAAG,aAAa,CAAkC,IAAI,KAAK;AAExF,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,OAAO,CAAY,KAAK,MAAM,CAAC;IACvE;AAEA;;AAEG;IACH,SAAS,CACP,IAAoB,EACpB,OAAO,GAAG,IAAI,EACd,UAAU,GAAG,OAAO,EACpB,YAAY,GAAG,SAAS,EACxB,SAAS,GAAG,MAAM,EAClB,aAAa,GAAG,UAAU,EAC1B,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAC1B,WAAW,GAAG,QAAQ,EACtB,kBAAkB,GAAG,eAAe,EACpC,SAAS,GAAG,MAAM,EAClB,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAmB;AAC7B,YAAA,CAAC,OAAO,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAW,CAAA,OAAA,EAAU,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;AAC3D,YAAA,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AAC9B,YAAA,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;AAClC,YAAA,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AACpC,YAAA,CAAC,aAAa,GAAG,KAAK;YACtB,CAAC,kBAAkB,GAAG,KAAK;AAC3B,YAAA,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AACpC,YAAA,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;AAChC,YAAA,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;SACvF;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;QACpE,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KACzC,IAAI,CAAC,SAAS,CACZ,KAAK,EACL,OAAO,EACP,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,aAAa,CACd,CACF;YACD,MAAM,CAAC,kBAAkB,CAAC,GAAI,MAAM,CAAC,aAAa,CAAsB,CAAC,MAAM;QACjF;AAEA,QAAA,OAAO,MAAM;IACf;;AAGA;;;;;;;;;;;AAWG;IACH,QAAQ,CACN,KAAuB,EACvB,MAAc,EACd,WAA+B,EAC/B,KAAyB,EACzB,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAS1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;QAChE;;AAGA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAC9E,MAAM,qBAAqB,GAAG;AAC5B,cAAG,aAAa,CAAC,aAAa;cAC5B,SAAS;AACb,QAAA,MAAM,YAAY,GAAG,qBAAqB,IAAI,KAAK;;AAGnD,QAAA,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,OAAO,CAAY,KAAK,MAAM,CAAC;AACrF,QAAA,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;AACvB,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;QAChE;AAEA,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGzD,QAAA,IAAI,WAA6B;AACjC,QAAA,IAAI,SAAqC;QAEzC,IAAI,WAAW,EAAE;AACf,YAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC;YACzE,IAAI,CAAC,SAAS,EAAE;;gBAEd,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC;AAC/C,gBAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;YAC1E;;AAGA,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;;gBAEzE,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC;AAC/C,gBAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;YAC1E;AAEA,YAAA,IAAI,iBAAiB,GAAG,SAAS,CAAC,aAAa,CAAiC;YAChF,IAAI,CAAC,iBAAiB,EAAE;gBACtB,iBAAiB,GAAG,EAAE;AACtB,gBAAA,SAAS,CAAC,aAAa,CAAC,GAAG,iBAAiB;YAC9C;YACA,WAAW,GAAG,iBAAiB;QACjC;aAAO;YACL,WAAW,GAAG,KAAK;QACrB;;QAGA,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM;;AAG9G,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE;YACpE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;QACzC;aAAO;AACL,YAAA,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7B;;QAGA,IAAI,aAAa,EAAE;AACjB,YAAA,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAiC;YACpF,aAAa,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;QAClE;QACA,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAiC;YAChF,SAAS,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;AAC5D,YAAA,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;QAClC;QAEA,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;YACb,SAAS;AACT,YAAA,cAAc,EAAE,aAAa;YAC7B,SAAS;AACT,YAAA,aAAa,EAAE,YAAY;AAC3B,YAAA,YAAY,EAAE,QAAQ;SACvB;IACH;AAEA;;;;;;;;;AASG;AACH,IAAA,QAAQ,CACN,KAAuB,EACvB,MAAc,EACd,OAAgC,EAChC,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;AAEpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;;AAG5B,QAAA,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE;AACxC,YAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAiC;AACvE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC9B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,QAAQ,EAAE,MAAM;QAC7C;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;;;;;;AAWG;IACH,QAAQ,CACN,KAAuB,EACvB,QAAgB,EAChB,SAAyB,EACzB,KAAyB,EACzB,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EACpC,aAAa,GAAG,UAAU,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC;QACzE,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAiC;QACpE,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,EAAE;AACb,YAAA,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ;QAClC;;AAGA,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;YACjE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;QACtC;aAAO;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1B;;AAGA,QAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC,MAAM;;AAG5C,QAAA,IAAI,CAAE,MAAM,CAAC,aAAa,CAAyB,EAAE;AACnD,YAAA,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;QAC9B;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;;;AAQG;AACH,IAAA,UAAU,CACR,KAAuB,EACvB,MAAc,EACd,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;AAEpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;AACvE,QAAA,MAAM,cAAc,GAAG,MAAM,GAAI,MAAM,CAAC,aAAa,CAAkC,GAAG,SAAS;AACnG,QAAA,MAAM,WAAW,GAAG,cAAc,IAAI,KAAK;;AAG3C,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,OAAO,CAAY,KAAK,MAAM,CAAC;AAC7E,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;YAG/C,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,CAAiC;gBAC7E,MAAM,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;YAC3D;AAEA,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,YAAY,CACV,IAAoB,EACpB,UAAA,GAA0B,IAAI,GAAG,EAAE,EACnC,OAAO,GAAG,IAAI,EACd,UAAU,GAAG,OAAO,EACpB,aAAa,GAAG,UAAU,EAC1B,kBAAkB,GAAG,eAAe,EAAA;QAEpC,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAuB;AAClD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAuB;QAExD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAA,CAAE,CAAC;QAC7C;QAEA,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAA,CAAE,CAAC;QAC/C;QAEA,IAAI,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACpC,YAAA,MAAM,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAA,mCAAA,CAAqC,CAAC;QAC/F;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiC;QACpE,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;YACtC,IAAI,MAAM,EAAE;AACV,gBAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;AAEA,YAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CACvC,KAAK,EACL,UAAU,EACV,OAAO,EACP,UAAU,EACV,aAAa,EACb,kBAAkB,CACnB;AACD,gBAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;oBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,SAAA,EAAY,MAAM,KAAK,CAAC,CAAA,CAAE,CAAC,CAAC;gBAC/E;YACF;AAEA,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAuB;YACpE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM,EAAE;AACpE,gBAAA,MAAM,CAAC,IAAI,CACT,CAAA,KAAA,EAAQ,MAAM,KAAK,kBAAkB,CAAA,EAAA,EAAK,aAAa,CAAA,iBAAA,EAAoB,aAAa,CAAA,eAAA,EAAkB,QAAQ,CAAC,MAAM,CAAA,CAAA,CAAG,CAC7H;YACH;QACF;QAEA,OAAO;AACL,YAAA,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP;IACH;+GAn5BW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAjB,iBAAiB,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;MC4FY,mBAAmB,CAAA;AAvChC,IAAA,WAAA,GAAA;;AAyCmB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;AACpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;;AAIvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAwB;;AAGnD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAuB,QAAQ,sDAAC;;AAGlD,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAA8B,cAAc,6DAAC;;AAGtE,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;;AAG/C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAyB,MAAM,wDAAC;;AAGpD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;;AAGvB,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAC,IAAI,6DAAC;;AAG/B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,0BAA0B,wDAAC;;AAGhD,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,2BAA2B,yDAAC;;AAGlD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,EAAE,sDAAC;;AAGtB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,SAAS,gDAAC;;QAG3C,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA8C;;AAGlE,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,IAAI,mDAAC;;AAGrB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,OAAO,sDAAC;;AAG3B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,SAAS,wDAAC;;AAG/B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,MAAM,qDAAC;;AAGzB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,UAAU,yDAAC;;AAGjC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,UAAU,yDAAC;;AAGjC,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAC,eAAe,8DAAC;;AAG3C,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,UAAU,yDAAC;;AAGjC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,uDAAC;;AAG7B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,UAAU,yDAAC;;AAGjC,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAC,eAAe,8DAAC;;AAG3C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,MAAM,qDAAC;;AAGzB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;;AAG7B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;;;QAIjC,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;;QAGlD,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;;QAGlD,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;;;AAIjD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAkC;;QAGvE,IAAA,CAAA,WAAW,GAAG,MAAM,EAA4B;;QAGhD,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAAkC;;QAG5D,IAAA,CAAA,aAAa,GAAG,MAAM,EAAuB;;QAG7C,IAAA,CAAA,YAAY,GAAG,MAAM,EAAuB;;QAG5C,IAAA,CAAA,aAAa,GAAG,MAAM,EAAuB;;;AAInC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAmB,EAAE,iDAAC;;AAGpC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,wDAAC;;AAG/C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAGlC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;AAG9B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;;QAG3C,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAG5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,wDAAC;;QAG1C,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAE3D,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AACxD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE;AACnC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AAExC,YAAA,IAAI,cAAc,IAAI,WAAW,KAAK,2BAA2B,EAAE;AACjE,gBAAA,OAAO,0BAA0B;YACnC;AACA,YAAA,IAAI,CAAC,cAAc,IAAI,WAAW,KAAK,0BAA0B,EAAE;AACjE,gBAAA,OAAO,2BAA2B;YACpC;AACA,YAAA,OAAO,WAAW;AACpB,QAAA,CAAC,kEAAC;;QAGM,IAAA,CAAA,wBAAwB,GAAG,KAAK;;AAGvB,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,4DAAC;;AAGxE,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,0DAAC;;AAGpE,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACpD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACzC,YAAA,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,qBAAqB;AACpE,QAAA,CAAC,8DAAC;;AAGiB,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACtD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACzC,YAAA,OAAO,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,qBAAqB;AAC1E,QAAA,CAAC,gEAAC;;AAGiB,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACtD,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM;AACxE,QAAA,CAAC,gEAAC;;AAGe,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,KAAK,qEAAC;AAE1D;;;;;AAKG;AACgB,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;;AAEvD,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;AAC9B,gBAAA,OAAO,KAAK;YACd;;AAEA,YAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC1C,QAAA,CAAC,iEAAC;;;AA2LO,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,YAAW;AAC7C,YAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBACjC;YACF;AAEA,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB;AAAO,iBAAA,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;AACnC,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9B;gBAAE,OAAO,KAAc,EAAE;AACvB,oBAAA,IAAI,CAAC,WAAW,CAAC,2BAA2B,EAAE,KAAK,CAAC;gBACtD;YACF;AACF,QAAA,CAAC,6DAAC;;AAGO,QAAA,IAAA,CAAA,sBAAsB,GAAG,eAAe,CAAC,MAAK;YACrD,IAAI,CAAC,eAAe,CAAC;iBAClB,IAAI,CACH,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EACpC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;YAG9C,IAAI,CAAC,2BAA2B,EAAE;;;AAIlC,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;gBAClC,IAAI,CAAC,2BAA2B,EAAE;YACpC,CAAC,EAAE,GAAG,CAAC;;AAGP,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;gBAC7B,aAAa,CAAC,UAAU,CAAC;AAC3B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AA+qDH,IAAA;;IA94DS,2BAA2B,GAAA;;;AAGjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAwB;AAC7C,QAAA,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE;AAC1C,QAAA,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;AAC3C,QAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,cAAc,CAAC;IACpD;;AAGA;;AAEG;AACO,IAAA,WAAW,CAAc,IAAoB,EAAE,SAAiB,EAAE,YAAgB,EAAA;AAC1F,QAAA,OAAQ,IAAI,CAAC,SAAS,CAAO,IAAK,YAAkB;IACtD;AAEA;;AAEG;AACO,IAAA,WAAW,CAAC,IAAoB,EAAE,SAAiB,EAAE,KAAc,EAAA;AAC3E,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK;IACzB;AAEA;;AAEG;AACO,IAAA,SAAS,CAAC,IAAoB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAS,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3D;AAEA;;AAEG;AACO,IAAA,YAAY,CAAC,IAAoB,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAS,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC;IAC9D;AAEA;;AAEG;AACO,IAAA,cAAc,CAAC,IAAoB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAqB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC;IACnF;AAEA;;AAEG;AACO,IAAA,WAAW,CAAC,IAAoB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAqB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC;IAChF;AAEA;;AAEG;AACO,IAAA,eAAe,CAAC,IAAoB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAU,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrE;AAEA;;AAEG;IACO,eAAe,CAAC,IAAoB,EAAE,KAAc,EAAA;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrD;AAEA;;AAEG;AACO,IAAA,eAAe,CAAC,IAAoB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAU,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrE;AAEA;;AAEG;IACO,eAAe,CAAC,IAAoB,EAAE,KAAc,EAAA;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrD;AAEA;;AAEG;AACO,IAAA,oBAAoB,CAAC,IAAoB,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAU,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;IAC1E;AAEA;;AAEG;IACO,oBAAoB,CAAC,IAAoB,EAAE,KAAc,EAAA;AACjE,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;IAC1D;AAEA;;AAEG;AACO,IAAA,eAAe,CAAC,IAAoB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAU,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrE;AAEA;;;;;;;AAOG;AACO,IAAA,yBAAyB,CAAC,IAAoB,EAAA;;AAEtD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,OAAO,KAAK;QACd;;QAGA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AACpD,QAAA,IAAI,iBAAiB,KAAK,KAAK,EAAE;AAC/B,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;IACzC;AAEA;;AAEG;AACK,IAAA,qBAAqB,CAAC,IAAoB,EAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAExG,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;AAChC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;IAC3C;AAEA;;AAEG;AACO,IAAA,aAAa,CAAC,IAAoB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAU,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;IACnE;AAEA;;AAEG;AACO,IAAA,eAAe,CAAC,IAAoB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,WAAW,CAA+B,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC;IAC9F;AAEA;;AAEG;IACO,eAAe,CAAC,IAAoB,EAAE,KAAmC,EAAA;AACjF,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;IACrD;AAEA;;AAEG;AACO,IAAA,oBAAoB,CAAC,IAAoB,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAqB,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC;IACzF;AAEA;;AAEG;IACO,oBAAoB,CAAC,IAAoB,EAAE,KAAyB,EAAA;AAC5E,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;IAC1D;;;AAIS,IAAA,iBAAiB;;AAkBjB,IAAA,sBAAsB;;AAwB/B;;AAEG;AACH,IAAA,MAAM,SAAS,GAAA;QACb,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACrC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,gBAAgB,EAAE,EACvB,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACrC,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACD,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,KAAK,EAAE,EACZ,KAAK,EACL,IAAI,CAAC,gBAAgB,EAAE,EACvB,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACrC,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACD,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;IACH,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACjG;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACpC;AAEA;;AAEG;IACH,gBAAgB,GAAA;QACd,MAAM,QAAQ,GAAqB,EAAE;QACrC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACpG,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,IAAI,CAAC,WAAW,CAAC,cAAc,CAC7B,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,CACpC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACH;QACA,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;YAChC;QACF;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;;AAEzB,YAAA,MAAM,WAAW,GAAG,CAAC,KAAuB,KAAU;AACpD,gBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,oBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE;AAClE,wBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,wBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;oBACxC;oBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAC3C,IAAI,QAAQ,EAAE;wBACZ,WAAW,CAAC,QAAQ,CAAC;oBACvB;gBACF;AACF,YAAA,CAAC;AACD,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B;aAAO;;AAEL,YAAA,MAAM,oBAAoB,GAAG,CAAC,KAAuB,KAAU;AAC7D,gBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE;AACzC,wBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,wBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;oBACxC;oBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAC3C,IAAI,QAAQ,EAAE;wBACZ,oBAAoB,CAAC,QAAQ,CAAC;oBAChC;gBACF;AACF,YAAA,CAAC;AACD,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC;QACA,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,IAAI,CAAC,KAAK,EAAE,EACZ,KAAK,EACL,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACD,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,EAAU,EAAA;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9F;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;;;;AAKG;AACH,IAAA,MAAM,UAAU,GAAA;;AAEd,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB;QACF;AAEA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAE5B,QAAA,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;YAGzB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,YAAA,IAAI;AACF,gBAAA,MAAM,MAAM,GAAG,EAAE,EAAE;AACnB,gBAAA,MAAM,SAAS,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;AACnE,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAC3B;YAAE,OAAO,KAAc,EAAE;AACvB,gBAAA,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAChD,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB;oBAAU;AACR,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;QACF;AAAO,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;;YAE5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACzB;IACF;AAEA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC1B;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAc,EAAA;QAC1B,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;IACxC;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,IAAoB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD;AAEA;;;;;AAKG;IACH,QAAQ,CAAC,MAAc,EAAE,OAAgC,EAAA;AACvD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CACvC,IAAI,CAAC,KAAK,EAAE,EACZ,MAAM,EACN,OAAO,EACP,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACD,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;AAEA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,QAAgB,EAAE,SAAyB,EAAE,KAAc,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CACtC,IAAI,CAAC,KAAK,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CACzC,IAAI,CAAC,KAAK,EAAE,EACZ,MAAM,EACN,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACD,IAAI,OAAO,EAAE;;AAEX,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,gBAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,CACpC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;YACH;YACA,IAAI,CAAC,YAAY,EAAE;QACrB;AACA,QAAA,OAAO,OAAO;IAChB;AAEA;;;;AAIG;IACH,MAAM,UAAU,CAAC,MAAc,EAAA;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAC9C,IAAI,EACJ,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AAED,QAAA,IAAI,WAAW,IAAI,WAAW,EAAE;YAC9B,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACnC;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrF;IACF;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;YACjC,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACvF;IACF;AAEA;;;;AAIG;IACH,MAAM,mBAAmB,CAAC,MAAc,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3B;aAAO;AACL,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/B;IACF;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAChC,YAAA,OAAO,KAAK;QACd;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;AAC9E,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QACxC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,IAAI,EACJ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;YACH;YAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,gBAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;YACH;QACF;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,iBAAiB,EAAE,KAAK;AACzB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,OAAO,IAAI;IACb;AAEA;;;;AAIG;AACH,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,KAAK,EACL,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACH;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,iBAAiB,EAAE,KAAK;AACzB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,OAAO,IAAI;IACb;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAc,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,IAAI;IAC1G;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;QACA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;IACzC;AAEA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1B;AAEA;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACzE;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzG,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrD;AAEA;;;;AAIG;AACH,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAClG;AAEA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,MAAc,EAAE,WAAoB,EAAE,KAAc,EAAA;AAC3D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CACtC,IAAI,CAAC,KAAK,EAAE,EACZ,MAAM,EACN,WAAW,EACX,KAAK,EACL,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QAED,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE;;YAEtC,IAAI,CAAC,cAAc,CACjB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,YAAY,EACnB,KAAK,CACN;YACD,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAc,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAC/B,IAAI,EACJ,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,YAAY,EAAE,EACnB,IAAI,CAAC,SAAS,EAAE,EAChB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,SAAS,EAAE,EAChB,IAAI,CAAC,aAAa,EAAE,CACrB;IACH;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAc,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE;AACtF,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;IACH,gBAAgB,GAAA;QACd,MAAM,QAAQ,GAAqB,EAAE;AACrC,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAuB,KAAU;AACjD,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC9B,oBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrB;gBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC3C,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,QAAQ,CAAC;gBACpB;YACF;AACF,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,QAAA,OAAO,QAAQ;IACjB;AAEA;;;AAGG;IACH,iBAAiB,GAAA;QACf,MAAM,SAAS,GAAqB,EAAE;AACtC,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAuB,KAAU;AACjD,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACrD,gBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,MAAM,IAAI,aAAa,CAAC,EAAE;AACtE,oBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtB;gBACA,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,QAAQ,CAAC;gBACpB;YACF;AACF,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,QAAA,OAAO,SAAS;IAClB;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK;IAClD;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK;IAClD;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACvE;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,KAAK;IAC5D;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,IAAoB,EAAE,KAAK,GAAG,CAAC,EAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACrD,OAAO;AACL,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;YACJ,KAAK;AACL,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACpC,YAAA,aAAa,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrD,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAClC,YAAA,QAAQ,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;SAC/C;IACH;AAEA;;AAEG;AACH,IAAA,oBAAoB,CAAC,KAAa,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,MAAM,UAAU,GAAG,WAAW,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1D,QAAA,OAAO,KAAK,GAAG,MAAM,GAAG,UAAU;IACpC;AAEA;;AAEG;AACH,IAAA,sBAAsB,CAAC,IAAoB,EAAA;AACzC,QAAA,QACE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YACxD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAEhH;AAEA;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU;IACzC;AAEA;;;AAGG;AACO,IAAA,4BAA4B,CAAC,IAAoB,EAAA;QACzD,OAAO,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9D;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,IAAoB,EAAA;AAC7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACrD,QAAA,MAAM,gBAAgB,GAAG,aAAa,IAAI,aAAa,GAAG,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAC9C,IAAI,EACJ,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;;;;;QAMD,OAAO,CAAC,WAAW,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW;IAC1D;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,IAAoB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAChC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,yBAAyB,CAAC,IAAoB,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,IAAqB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;IACxC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAC5B,OAAO,KAAK,GAAG,CAAC;IAClB;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,IAAoB,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO;IACtD;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,IAAoB,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAChC,YAAA,OAAO,IAAI;QACb;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE;YAClC,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO;QACpC;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;YACpC,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO;QACpC;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC7C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,SAAS,EAAE,IAAI;YACf,aAAa;AACd,SAAA,CAAC;IACJ;;AAIA;;AAEG;AACH,IAAA,MAAM,uBAAuB,CAAC,IAAoB,EAAE,KAAY,EAAA;AAC9D,QAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;YAAE;;AAG1C,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;AACnE,YAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAW,CAAC;QAChE;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AACnB,SAAA,CAAC;IACJ;AACA;;AAEG;IACH,iBAAiB,CAAC,IAAoB,EAAE,KAAY,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;YAAE;AAE1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAE9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC3C,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC;QACzC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACtE;AAEA;;;AAGG;AACH,IAAA,MAAM,UAAU,CAAC,IAAoB,EAAE,KAAY,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,UAAU,EAAE;YACtE,KAAK,CAAC,eAAe,EAAE;QACzB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAC9C,IAAI,EACJ,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AAED,QAAA,IAAI,WAAW,IAAI,WAAW,EAAE;YAC9B,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAE9C,YAAA,IAAI,UAAU,IAAI,WAAW,EAAE;AAC7B,gBAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACnC;AAEA,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC;YACtC,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACvE;IACF;AAEA;;AAEG;IACH,eAAe,CAAC,IAAoB,EAAE,KAA0B,EAAA;QAC9D,IAAI,CAAC,KAAK,CAAC,iBAAiB;YAAE;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM;YAAE;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE;AAE/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QAC9B,IAAI,IAAI,KAAK,UAAU;YAAE;AAEzB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK;AAC1D,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACH;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;YACJ,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;AAC3C,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACH,MAAM,CAAC,KAA6B,EAAE,UAA2B,EAAA;QAC/D,MAAM,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;QACxF,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS;QAEhE,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;QACpD;aAAO;YACL,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;QACjD;QAEA,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;IACH,cAAc,CAAC,KAA6B,EAAE,UAA0B,EAAA;AACtE,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAAE;QAE7B,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AACvD,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;QAElD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YAAE;AACtG,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAAE;QAE5F,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;QACrD,IAAI,CAAC,cAAc,EAAE;YACnB,cAAc,GAAG,EAAE;AACnB,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC;QAClD;QACA,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;AAC1C,QAAA,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC;QAEtC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC;QAEhH,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IAChC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;AACxC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CACjD,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,YAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;gBACtC,IAAI,SAAS,EAAE;;oBAEb,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAC/C,IAAI,CAAC,KAAK,EAAE,EACZ,SAAS,EACT,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,CACrB;oBACD,IAAI,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;AAC3D,wBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;oBAC/B;yBAAO;;AAEL,wBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACtD;gBACF;qBAAO;;AAEL,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtD;YACF;QACF;IACF;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,KAAiB,EAAA;AAC1B,QAAA,IAAI,KAAK,CAAC,aAAa,IAAI,CAAE,KAAK,CAAC,aAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAqB,CAAC,EAAE;AACtG,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;IACF;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CACjD,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;AAE3B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAC5C,IAAI,YAAY,GAAG;cACf,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;cACzF,CAAC,CAAC;AAEN,QAAA,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YAC/D,YAAY,GAAG,CAAC;QAClB;AAEA,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC;AAChG,QAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AAC5B,YAAA,IAAI,gBAAgB,CAAC,oBAAoB,EAAE;gBACzC,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;YACzB;AACA,YAAA,IACE,gBAAgB,CAAC,WAAW,KAAK,IAAI;gBACrC,gBAAgB,CAAC,WAAW,IAAI,CAAC;AACjC,gBAAA,gBAAgB,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,EAC9C;AACA,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;YACjF;QACF;IACF;;AAGA;;AAEG;IACK,MAAM,aAAa,CAAC,MAA0B,EAAA;AACpD,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE;AACvB,YAAA,MAAM,SAAS,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;AACnE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAC3B;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,2BAA2B,EAAE,KAAK,CAAC;AACpD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB;IACF;AAEA;;;;;AAKG;IACK,MAAM,gBAAgB,CAAC,IAAoB,EAAA;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE;;QAGjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACnD,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YACnD;QACF;;QAGA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,CAAC,EAAE;YACxC;QACF;AAEA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;QAC5B,IAAI,OAAO,EAAE,KAAK,UAAU;YAAE;AAE9B,QAAA,IAAI;YACF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,EAAE;AAEnB,YAAA,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;AACzB,YAAA,MAAM,QAAQ,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;AAClE,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;YACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;QAClD;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAClD,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC;gBAAU;YACR,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC/B,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AACrB,gBAAA,OAAO,MAAM;AACf,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEA;;;AAGG;IACK,YAAY,GAAA;AAClB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;;;AAGjC,QAAA,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC9D,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;YACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;YACtC,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK;YACvC,CAAC,EAAE,CAAC,CAAC;QACP;IACF;AAEA;;;AAGG;AACK,IAAA,wBAAwB,CAAC,KAAuB,EAAA;AACtD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;;gBAEnC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;;AAEzC,gBAAA,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;YACzC;QACF;IACF;AAEA;;AAEG;IACK,qBAAqB,CAAC,IAAoB,EAAE,KAAY,EAAA;QAC9D,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QACtC,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACK,uBAAuB,CAAC,IAAoB,EAAE,KAAY,EAAA;QAChE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACH;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,MAAc,EAAA;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACtG;AAEA;;AAEG;AACK,IAAA,kBAAkB,CAAC,MAAc,EAAA;QACvC,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACxG;AAEA;;AAEG;IACK,eAAe,GAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY;IACzD;AAEA;;AAEG;IACK,UAAU,GAAA;AAChB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;IACnD;AAEA;AAC8C;AACtC,IAAA,aAAa,CACnB,KAA6B,EAC7B,WAA6B,EAC7B,UAA2B,EAAA;AAE3B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE;QAExB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;QAClD,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAErE,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC;IACvG;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,KAA6B,EAAE,WAA6B,EAAE,UAA2B,EAAA;AAC1G,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAAE;QAE7B,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AACvD,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;AAElD,QAAA,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC;YAAE;QAE9E,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE;YAC3G;QACF;AAEA,QAAA,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;QAEpF,IAAI,CAAC,cAAc,CACjB,SAAS,EACT,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EACrC,UAAU,EACV,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,EAClB,KAAK,CACN;IACH;AAEA;;AAEG;IACK,mBAAmB,CACzB,SAAyB,EACzB,YAAoB,EACpB,aAAyC,EACzC,aAAqB,EACrB,YAAoB,EAAA;AAEpB,QAAA,MAAM,eAAe,GAA8B;AACjD,YAAA,SAAS,EAAE,IAAI;YACf,SAAS;AACT,YAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACrD,aAAa;YACb,aAAa;YACb,YAAY;AACZ,YAAA,QAAQ,EAAE,KAAK;SAChB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AAEvC,QAAA,OAAO,CAAC,eAAe,CAAC,QAAQ;IAClC;AAEA;;AAEG;IACK,cAAc,CACpB,IAAoB,EACpB,cAA0C,EAC1C,aAAyC,EACzC,aAAqB,EACrB,YAAoB,EACpB,SAAkB,EAAA;AAElB,QAAA,MAAM,SAAS,GAAwB;AACrC,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;YACJ,cAAc;YACd,aAAa;YACb,aAAa;YACb,YAAY;SACb;QAED,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;AAEA;;AAEG;IACK,cAAc,GAAA;AACpB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACrG;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,MAAc,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9B,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAc,CAAA,oBAAA,EAAuB,MAAM,CAAA,EAAA,CAAI,CAAC;YACtF,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,KAAK,EAAE;AACf,gBAAA,OAAO,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAClE;QACF,CAAC,EAAE,CAAC,CAAC;IACP;AAEA;;AAEG;AACK,IAAA,mBAAmB,CACzB,KAAoB,EACpB,QAA8B,EAC9B,YAAoB,EACpB,cAAqC,EAAA;QAErC,IAAI,WAAW,GAAkB,YAAY;QAC7C,IAAI,oBAAoB,GAAG,IAAI;QAC/B,IAAI,OAAO,GAAG,IAAI;AAElB,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,YAAY,GAAG,CAAC,EAAE;AACpB,oBAAA,WAAW,GAAG,YAAY,GAAG,CAAC;gBAChC;qBAAO;oBACL,oBAAoB,GAAG,KAAK;gBAC9B;gBACA;AAEF,YAAA,KAAK,WAAW;gBACd,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,oBAAA,WAAW,GAAG,YAAY,GAAG,CAAC;gBAChC;AAAO,qBAAA,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;oBAC9B,WAAW,GAAG,CAAC;gBACjB;qBAAO;oBACL,oBAAoB,GAAG,KAAK;gBAC9B;gBACA;AAEF,YAAA,KAAK,WAAW;gBACd,IAAI,cAAc,EAAE;AAClB,oBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;AACvF,wBAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AACtC,wBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;oBACzE;yBAAO;AACL,wBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;AAC1C,wBAAA,IAAI,WAAW,EAAE,MAAM,EAAE;AACvB,4BAAA,WAAW,GAAG,QAAQ,CAAC,SAAS,CAC9B,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAC3E;wBACH;6BAAO;4BACL,oBAAoB,GAAG,KAAK;wBAC9B;oBACF;gBACF;qBAAO;oBACL,oBAAoB,GAAG,KAAK;gBAC9B;gBACA;AAEF,YAAA,KAAK,YAAY;gBACf,IAAI,cAAc,EAAE;AAClB,oBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;AACxF,wBAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AACtC,wBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;oBACzE;AAAO,yBAAA,IACL,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;AACpC,wBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAClE;wBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;wBACrD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,4BAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;4BAC9B,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACpG,4BAAA,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;AACtB,gCAAA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CACxD,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,CACrB;gCACD,WAAW,GAAG,eAAe,CAAC,SAAS,CACrC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CACnE;gCACD,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE;AAC5D,oCAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;AACrE,oCAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;gCACzE;4BACF;wBACF;6BAAO;4BACL,oBAAoB,GAAG,KAAK;wBAC9B;oBACF;yBAAO;wBACL,oBAAoB,GAAG,KAAK;oBAC9B;gBACF;qBAAO;oBACL,oBAAoB,GAAG,KAAK;gBAC9B;gBACA;AAEF,YAAA,KAAK,MAAM;gBACT,WAAW,GAAG,CAAC;gBACf;AAEF,YAAA,KAAK,KAAK;AACR,gBAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjC;AAEF,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;oBACxF,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC;AACnD,oBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;gBACzE;gBACA,oBAAoB,GAAG,KAAK;gBAC5B;AAEF,YAAA,KAAK,OAAO;gBACV,IAAI,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;oBACxD,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC;AACnD,oBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;gBACzE;gBACA,oBAAoB,GAAG,KAAK;gBAC5B;AAEF,YAAA;AACE,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;AAC7D,oBAAA,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;wBAC5F,KAAK,CAAC,cAAc,EAAE;AACtB,wBAAA,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,KAAK,CAAC;AACpD,wBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;oBACzE;gBACF;gBACA,OAAO,GAAG,KAAK;gBACf,oBAAoB,GAAG,KAAK;gBAC5B;;AAGJ,QAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE;IACvD;AAEA;;;;AAIG;IACK,uBAAuB,CAAC,IAAoB,EAAE,KAAoB,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE;AAE/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAE9B,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;;YAErB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QACxC;aAAO;;YAEL,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;YACH;YAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,gBAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;YACH;QACF;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;;;AAIG;IACK,uBAAuB,CAAC,IAAoB,EAAE,KAAoB,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE;AAE/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;;QAG9B,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAEtC,QAAA,IAAI,IAAI,KAAK,UAAU,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;;AAE3C,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,IAAI,EACJ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;YACH;;YAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,gBAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;YACH;QACF;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACK,wBAAwB,CAAC,IAAoB,EAAE,KAAoB,EAAA;AACzE,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE;QAE/B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,aAAa,EAAE,CACrB;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACjC,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,kBAAkB,EAAE,CAC1B;QACH;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,SAAS,EAAE,IAAI;YACf,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;AACK,IAAA,OAAO,CAAC,KAAc,EAAA;QAC5B,OAAO,KAAK,YAAY,KAAK;IAC/B;AAEA;;AAEG;IACK,WAAW,CAAC,OAAe,EAAE,KAAc,EAAA;AACjD,QAAA,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,CAAA,EAAG,OAAO,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC,OAAO,CAAC;QAC7C;aAAO;YACL,OAAO,CAAC,KAAK,CAAC,CAAA,EAAG,OAAO,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;QACrC;IACF;+GAllEW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,4BAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,8BAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,OAAA,EAAA,kCAAA,EAAA,qBAAA,EAAA,kCAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAjCnB,CAAC,iBAAiB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClEhC,skXAmRA,EAAA,MAAA,EAAA,CAAA,2hLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/MI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,eAAe,qUACf,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEpB,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,mBAAmB,8EACnB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAkBT,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAvC/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,eAAA,EAGP,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,SAAA,EAC1B,CAAC,iBAAiB,CAAC,EAAA,OAAA,EACrB;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,qBAAqB;wBACrB,mBAAmB;wBACnB,sBAAsB;wBACtB,oBAAoB;wBACpB,gBAAgB;wBAChB,iBAAiB;wBACjB,mBAAmB;wBACnB,gBAAgB;wBAChB,wBAAwB;wBACxB,mBAAmB;wBACnB,kBAAkB;qBACnB,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,cAAc;AACrB,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,8BAA8B,EAAE,sBAAsB;AACtD,wBAAA,2BAA2B,EAAE,mBAAmB;AAChD,wBAAA,gCAAgC,EAAE,wBAAwB;AAC1D,wBAAA,0BAA0B,EAAE,OAAO;AACnC,wBAAA,oCAAoC,EAAE,qBAAqB;AAC3D,wBAAA,oCAAoC,EAAE,2BAA2B;AACjE,wBAAA,mBAAmB,EAAE,mBAAmB;AACxC,wBAAA,WAAW,EAAE,uBAAuB;AACpC,wBAAA,SAAS,EAAE,qBAAqB;AAChC,wBAAA,QAAQ,EAAE,oBAAoB;AAC/B,qBAAA,EAAA,QAAA,EAAA,skXAAA,EAAA,MAAA,EAAA,CAAA,2hLAAA,CAAA,EAAA;;sBAmGA;;;ME9LU,gBAAgB,CAAA;+GAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YAFjB,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAElB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YAFjB,mBAAmB,CAAA,EAAA,CAAA,CAAA;;4FAElB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC/B,iBAAA;;;ACLD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-components-tree-view.mjs","sources":["../../../../packages/components/tree-view/src/lib/tree-view.service.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.ts","../../../../packages/components/tree-view/src/lib/tree-view.component.html","../../../../packages/components/tree-view/src/lib/tree-view.module.ts","../../../../packages/components/tree-view/src/acorex-components-tree-view.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { AXTreeViewChildrenSelectionState, AXTreeViewFlatNode, AXTreeViewNode } from './tree-view.types';\n\n/**\n * Service for tree node operations\n * Handles all business logic for tree node manipulation\n */\n@Injectable()\nexport class AXTreeViewService {\n // ==================== Constants ====================\n private static readonly ROOT_LIST_ID = 'ax-tree-view-root-list';\n private static readonly NODE_DROP_PREFIX = 'ax-tree-view-node-drop-';\n private static readonly LIST_PREFIX = 'ax-tree-view-list-';\n\n // ==================== Node Finding & Traversal ====================\n /**\n * Find a node by ID in the tree\n */\n findNodeById(nodes: AXTreeViewNode[], id: string, idField = 'id', childrenField = 'children'): AXTreeViewNode | null {\n for (const node of nodes) {\n if ((node[idField] as string) === id) return node;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n const found = this.findNodeById(children, id, idField, childrenField);\n if (found) return found;\n }\n }\n return null;\n }\n\n /**\n * Find parent node of a given node\n */\n findParentNode(\n nodes: AXTreeViewNode[],\n targetNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode | undefined {\n const targetId = targetNode[idField] as string;\n for (const node of nodes) {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children?.some((child) => (child[idField] as string) === targetId)) {\n return node;\n }\n if (children) {\n const found = this.findParentNode(children, targetNode, idField, childrenField);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n /**\n * Check if targetNode is a descendant of ancestorNode (or the same node)\n * Prevents circular references by checking if target exists in ancestor's children tree\n */\n isValidDropTarget(\n movedNode: AXTreeViewNode,\n targetNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): boolean {\n const movedId = movedNode[idField] as string;\n const targetId = targetNode[idField] as string;\n if (movedId === targetId || this.isNodeDescendantOf(targetNode, movedNode, idField, childrenField)) {\n return false;\n }\n return true;\n }\n\n /**\n * Check if targetNode is a descendant of ancestorNode\n */\n private isNodeDescendantOf(\n targetNode: AXTreeViewNode,\n ancestorNode: AXTreeViewNode,\n idField = 'id',\n childrenField = 'children',\n ): boolean {\n const targetId = targetNode[idField] as string;\n const ancestorId = ancestorNode[idField] as string;\n if (targetId === ancestorId) {\n return true;\n }\n\n const children = ancestorNode[childrenField] as AXTreeViewNode[] | undefined;\n if (!children || children.length === 0) {\n return false;\n }\n\n for (const child of children) {\n const childId = child[idField] as string;\n if (childId === targetId) {\n return true;\n }\n if (this.isNodeDescendantOf(targetNode, child, idField, childrenField)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Build a flat list of all visible focusable nodes\n */\n buildFlatNodeList(\n nodes: AXTreeViewNode[],\n hiddenField = 'hidden',\n disabledField = 'disabled',\n expandedField = 'expanded',\n childrenField = 'children',\n ): AXTreeViewFlatNode[] {\n const flatList: AXTreeViewFlatNode[] = [];\n const traverse = (nodeList: AXTreeViewNode[], level: number, parent?: AXTreeViewNode): void => {\n for (const node of nodeList) {\n const hidden = node[hiddenField] as boolean | undefined;\n const disabled = node[disabledField] as boolean | undefined;\n if (hidden !== true && !disabled) {\n flatList.push({ node, level, parent });\n const expanded = node[expandedField] as boolean | undefined;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (expanded && children) {\n traverse(children, level + 1, node);\n }\n }\n }\n };\n traverse(nodes, 0);\n return flatList;\n }\n\n // ==================== Node State Checks ====================\n /**\n * Check if node has children\n */\n hasChildren(node: AXTreeViewNode, childrenField = 'children'): boolean {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n return Boolean(children?.length);\n }\n\n /**\n * Check if node can be lazy loaded\n */\n canLazyLoad(\n node: AXTreeViewNode,\n isLazyDataSource: boolean,\n childrenCountField = 'childrenCount',\n childrenField = 'children',\n ): boolean {\n const childrenCount = node[childrenCountField] as number | undefined;\n return isLazyDataSource && Boolean(childrenCount && childrenCount > 0 && !this.hasChildren(node, childrenField));\n }\n\n // ==================== Selection Management ====================\n /**\n * Recursively select/deselect all children\n */\n selectAllChildren(\n children: AXTreeViewNode[],\n selected: boolean,\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const child of children) {\n child[selectedField] = selected;\n child[indeterminateField] = false;\n const childChildren = child[childrenField] as AXTreeViewNode[] | undefined;\n if (childChildren) {\n this.selectAllChildren(childChildren, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Get selection state of children\n */\n getChildrenSelectionState(\n children: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): AXTreeViewChildrenSelectionState {\n let selectedCount = 0;\n let indeterminateCount = 0;\n\n for (const child of children) {\n const selected = child[selectedField] as boolean | undefined;\n const indeterminate = child[indeterminateField] as boolean | undefined;\n if (selected && !indeterminate) {\n selectedCount++;\n }\n if (indeterminate) {\n indeterminateCount++;\n }\n }\n\n return {\n allSelected: selectedCount === children.length,\n someSelected: selectedCount > 0 || indeterminateCount > 0,\n };\n }\n\n /**\n * Update parent node states based on children selection (with intermediate state support)\n */\n updateParentStates(\n nodes: AXTreeViewNode[],\n changedNode: AXTreeViewNode,\n intermediateState: boolean,\n idField = 'id',\n childrenField = 'children',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): void {\n const parent = this.findParentNode(nodes, changedNode, idField, childrenField);\n const parentChildren = parent?.[childrenField] as AXTreeViewNode[] | undefined;\n if (!parent || !parentChildren) return;\n\n const { allSelected, someSelected } = this.getChildrenSelectionState(\n parentChildren,\n selectedField,\n indeterminateField,\n );\n\n if (allSelected) {\n parent[selectedField] = true;\n parent[indeterminateField] = false;\n } else if (someSelected) {\n if (intermediateState) {\n parent[selectedField] = true;\n parent[indeterminateField] = true;\n } else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n } else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n\n this.updateParentStates(\n nodes,\n parent,\n intermediateState,\n idField,\n childrenField,\n selectedField,\n indeterminateField,\n );\n }\n\n /**\n * Recursively deselect all nodes\n */\n deselectAllNodes(\n nodes: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n node[selectedField] = false;\n node[indeterminateField] = false;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.deselectAllNodes(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Recursively set selection state for all nodes\n */\n setAllSelection(\n nodes: AXTreeViewNode[],\n selected: boolean,\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n node[selectedField] = selected;\n node[indeterminateField] = false;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.setAllSelection(children, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n\n /**\n * Recursively count selected nodes\n */\n countSelected(nodes: AXTreeViewNode[], selectedField = 'selected', childrenField = 'children'): number {\n let count = 0;\n for (const node of nodes) {\n if (node[selectedField] as boolean) count++;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n count += this.countSelected(children, selectedField, childrenField);\n }\n }\n return count;\n }\n\n /**\n * Recursively collect selected nodes\n */\n collectSelected(\n nodes: AXTreeViewNode[],\n result: AXTreeViewNode[],\n selectedField = 'selected',\n childrenField = 'children',\n ): void {\n for (const node of nodes) {\n if (node[selectedField] as boolean) result.push(node);\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.collectSelected(children, result, selectedField, childrenField);\n }\n }\n }\n\n /**\n * Recursively remove selected nodes\n */\n removeSelected(\n nodes: AXTreeViewNode[],\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n childrenField = 'children',\n ): void {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n const selected = node[selectedField] as boolean | undefined;\n const indeterminate = node[indeterminateField] as boolean | undefined;\n if (selected && !indeterminate) {\n nodes.splice(i, 1);\n } else {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n this.removeSelected(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n }\n\n /**\n * Recursively update all parent states in the tree (used after deletion)\n */\n updateAllParentStates(\n nodes: AXTreeViewNode[],\n intermediateState: boolean,\n childrenField = 'children',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n ): void {\n for (const node of nodes) {\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children && children.length > 0) {\n this.updateAllParentStates(children, intermediateState, childrenField, selectedField, indeterminateField);\n\n const { allSelected, someSelected } = this.getChildrenSelectionState(\n children,\n selectedField,\n indeterminateField,\n );\n\n if (allSelected) {\n node[selectedField] = true;\n node[indeterminateField] = false;\n } else if (someSelected) {\n if (intermediateState) {\n node[selectedField] = true;\n node[indeterminateField] = true;\n } else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n } else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n }\n }\n\n // ==================== Expansion Management ====================\n /**\n * Recursively set expanded state (with lazy loading)\n */\n async setExpandedState(\n nodes: AXTreeViewNode[],\n expanded: boolean,\n isLazyDataSource: boolean,\n loadNodeChildren: (node: AXTreeViewNode) => Promise<void>,\n expandedField = 'expanded',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): Promise<void> {\n for (const node of nodes) {\n const hasChildren = this.hasChildren(node, childrenField);\n const canLazyLoad = this.canLazyLoad(node, isLazyDataSource, childrenCountField, childrenField);\n\n if (hasChildren || canLazyLoad) {\n if (expanded && canLazyLoad) {\n await loadNodeChildren(node);\n }\n node[expandedField] = expanded;\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n await this.setExpandedState(\n children,\n expanded,\n isLazyDataSource,\n loadNodeChildren,\n expandedField,\n childrenField,\n childrenCountField,\n );\n }\n }\n }\n }\n\n // ==================== Drag & Drop Helpers ====================\n /**\n * Get array reference by drop list ID\n */\n getArrayByListId(\n nodes: AXTreeViewNode[],\n listId: string,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode[] | null {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return nodes;\n }\n\n if (listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)) {\n const nodeId = listId.replace(AXTreeViewService.NODE_DROP_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n return node ? [node] : null;\n }\n\n const nodeId = listId.replace(AXTreeViewService.LIST_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n const children = node?.[childrenField] as AXTreeViewNode[] | undefined;\n return children ?? null;\n }\n\n /**\n * Find parent node by list ID\n */\n findParentByListId(\n nodes: AXTreeViewNode[],\n listId: string,\n idField = 'id',\n childrenField = 'children',\n ): AXTreeViewNode | undefined {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return undefined;\n }\n\n const prefix = listId.startsWith(AXTreeViewService.NODE_DROP_PREFIX)\n ? AXTreeViewService.NODE_DROP_PREFIX\n : AXTreeViewService.LIST_PREFIX;\n const nodeId = listId.replace(prefix, '');\n return this.findNodeById(nodes, nodeId, idField, childrenField) ?? undefined;\n }\n\n /**\n * Generate unique list ID for each node\n */\n getListId(node: AXTreeViewNode | undefined, idField = 'id'): string {\n if (!node) return AXTreeViewService.ROOT_LIST_ID;\n const nodeId = node[idField] as string;\n return `${AXTreeViewService.LIST_PREFIX}${nodeId}`;\n }\n\n /**\n * Get root list ID constant\n */\n getRootListId(): string {\n return AXTreeViewService.ROOT_LIST_ID;\n }\n\n /**\n * Get node drop prefix constant\n */\n getNodeDropPrefix(): string {\n return AXTreeViewService.NODE_DROP_PREFIX;\n }\n\n /**\n * Get list prefix constant\n */\n getListPrefix(): string {\n return AXTreeViewService.LIST_PREFIX;\n }\n\n // ==================== Node Utilities ====================\n /**\n * Get all nodes in a flat array\n */\n getAllNodes(nodes: AXTreeViewNode[], childrenField = 'children'): AXTreeViewNode[] {\n const allNodes: AXTreeViewNode[] = [];\n const traverse = (nodeList: AXTreeViewNode[]): void => {\n for (const node of nodeList) {\n allNodes.push(node);\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(nodes);\n return allNodes;\n }\n\n /**\n * Get the path to a node (array of parent nodes from root to node)\n */\n getNodePath(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n const path: AXTreeViewNode[] = [];\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return path;\n }\n\n let current: AXTreeViewNode | null = node;\n while (current) {\n path.unshift(current);\n const parent = this.findParentNode(nodes, current, idField, childrenField);\n current = parent ?? null;\n }\n\n return path;\n }\n\n /**\n * Get the level/depth of a node (0 = root level)\n */\n getNodeLevel(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): number {\n const path = this.getNodePath(nodes, nodeId, idField, childrenField);\n return path.length > 0 ? path.length - 1 : -1;\n }\n\n /**\n * Get sibling nodes of a given node\n */\n getSiblings(nodes: AXTreeViewNode[], nodeId: string, idField = 'id', childrenField = 'children'): AXTreeViewNode[] {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return [];\n }\n\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const siblingsArray = (parent?.[childrenField] as AXTreeViewNode[] | undefined) ?? nodes;\n\n return siblingsArray.filter((n) => (n[idField] as string) !== nodeId);\n }\n\n /**\n * Clone a node (creates a deep copy)\n */\n cloneNode(\n node: AXTreeViewNode,\n idField = 'id',\n titleField = 'title',\n tooltipField = 'tooltip',\n iconField = 'icon',\n expandedField = 'expanded',\n selectedField = 'selected',\n indeterminateField = 'indeterminate',\n disabledField = 'disabled',\n hiddenField = 'hidden',\n childrenCountField = 'childrenCount',\n dataField = 'data',\n childrenField = 'children',\n ): AXTreeViewNode {\n const cloned: AXTreeViewNode = {\n [idField]: `${node[idField] as string}-clone-${Date.now()}`,\n [titleField]: node[titleField],\n [tooltipField]: node[tooltipField],\n [iconField]: node[iconField],\n [expandedField]: node[expandedField],\n [selectedField]: false, // Cloned nodes are not selected by default\n [indeterminateField]: false,\n [disabledField]: node[disabledField],\n [hiddenField]: node[hiddenField],\n [childrenCountField]: node[childrenCountField],\n [dataField]: node[dataField] ? JSON.parse(JSON.stringify(node[dataField])) : undefined,\n };\n\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children && children.length > 0) {\n cloned[childrenField] = children.map((child) =>\n this.cloneNode(\n child,\n idField,\n titleField,\n tooltipField,\n iconField,\n expandedField,\n selectedField,\n indeterminateField,\n disabledField,\n hiddenField,\n childrenCountField,\n dataField,\n childrenField,\n ),\n );\n cloned[childrenCountField] = (cloned[childrenField] as AXTreeViewNode[]).length;\n }\n\n return cloned;\n }\n\n // ==================== Node Manipulation ====================\n /**\n * Move a node to a new parent in the tree\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to move\n * @param newParentId - The ID of the new parent (undefined for root level)\n * @param index - Optional index to insert at (default: append to end)\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @param expandedField - Field name for expanded state\n * @returns Object with success status, moved node, previous parent, new parent, and indices\n */\n moveNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n newParentId: string | undefined,\n index: number | undefined,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n expandedField = 'expanded',\n ): {\n success: boolean;\n movedNode?: AXTreeViewNode;\n previousParent?: AXTreeViewNode;\n newParent?: AXTreeViewNode;\n previousIndex: number;\n currentIndex: number;\n } {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n\n // Find current parent\n const currentParent = this.findParentNode(nodes, node, idField, childrenField);\n const currentParentChildren = currentParent\n ? (currentParent[childrenField] as AXTreeViewNode[] | undefined)\n : undefined;\n const currentArray = currentParentChildren ?? nodes;\n\n // Find and remove from current location\n const currentIndex = currentArray.findIndex((n) => (n[idField] as string) === nodeId);\n if (currentIndex === -1) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n\n const movedNode = currentArray.splice(currentIndex, 1)[0];\n\n // Find new parent\n let targetArray: AXTreeViewNode[];\n let newParent: AXTreeViewNode | undefined;\n\n if (newParentId) {\n newParent = this.findNodeById(nodes, newParentId, idField, childrenField);\n if (!newParent) {\n // Restore node if new parent not found\n currentArray.splice(currentIndex, 0, movedNode);\n return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n }\n\n // Validate drop target\n if (!this.isValidDropTarget(movedNode, newParent, idField, childrenField)) {\n // Restore node if invalid drop target\n currentArray.splice(currentIndex, 0, movedNode);\n return { success: false, previousIndex: currentIndex, currentIndex: -1 };\n }\n\n let newParentChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n if (!newParentChildren) {\n newParentChildren = [];\n newParent[childrenField] = newParentChildren;\n }\n targetArray = newParentChildren;\n } else {\n targetArray = nodes;\n }\n\n // Calculate new index before inserting\n const newIndex = index !== undefined && index >= 0 && index <= targetArray.length ? index : targetArray.length;\n\n // Insert at new location\n if (index !== undefined && index >= 0 && index <= targetArray.length) {\n targetArray.splice(index, 0, movedNode);\n } else {\n targetArray.push(movedNode);\n }\n\n // Update childrenCount\n if (currentParent) {\n const updatedChildren = currentParent[childrenField] as AXTreeViewNode[] | undefined;\n currentParent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n if (newParent) {\n const updatedChildren = newParent[childrenField] as AXTreeViewNode[] | undefined;\n newParent[childrenCountField] = updatedChildren?.length ?? 0;\n newParent[expandedField] = true; // Auto-expand new parent\n }\n\n return {\n success: true,\n movedNode,\n previousParent: currentParent,\n newParent,\n previousIndex: currentIndex,\n currentIndex: newIndex,\n };\n }\n\n /**\n * Edit/update a node's properties\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to edit\n * @param updates - Partial node object with properties to update\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @returns The updated node if found, null otherwise\n */\n editNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n updates: Partial<AXTreeViewNode>,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): AXTreeViewNode | null {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\n }\n\n // Update node properties\n Object.assign(node, updates);\n\n // If children array is provided, ensure it exists and update childrenCount\n if (updates[childrenField] !== undefined) {\n const children = updates[childrenField] as AXTreeViewNode[] | undefined;\n node[childrenField] = children;\n node[childrenCountField] = children?.length;\n }\n\n return node;\n }\n\n /**\n * Add a child node to a parent node\n * @param nodes - Root nodes array\n * @param parentId - The ID of the parent node\n * @param childNode - The child node to add\n * @param index - Optional index to insert at (default: append to end)\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @param expandedField - Field name for expanded state\n * @returns The parent node if found and child was added, null otherwise\n */\n addChild(\n nodes: AXTreeViewNode[],\n parentId: string,\n childNode: AXTreeViewNode,\n index: number | undefined,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n expandedField = 'expanded',\n ): AXTreeViewNode | null {\n const parent = this.findNodeById(nodes, parentId, idField, childrenField);\n if (!parent) {\n return null;\n }\n\n // Ensure children array exists\n let children = parent[childrenField] as AXTreeViewNode[] | undefined;\n if (!children) {\n children = [];\n parent[childrenField] = children;\n }\n\n // Insert or append child\n if (index !== undefined && index >= 0 && index <= children.length) {\n children.splice(index, 0, childNode);\n } else {\n children.push(childNode);\n }\n\n // Update childrenCount\n parent[childrenCountField] = children.length;\n\n // Auto-expand parent if it was collapsed\n if (!(parent[expandedField] as boolean | undefined)) {\n parent[expandedField] = true;\n }\n\n return parent;\n }\n\n /**\n * Remove a node from the tree\n * @param nodes - Root nodes array\n * @param nodeId - The ID of the node to remove\n * @param idField - Field name for node ID\n * @param childrenField - Field name for children array\n * @param childrenCountField - Field name for children count\n * @returns The removed node if found, null otherwise\n */\n removeNode(\n nodes: AXTreeViewNode[],\n nodeId: string,\n idField = 'id',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): AXTreeViewNode | null {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\n }\n\n // Find parent to remove from its children array\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const parentChildren = parent ? (parent[childrenField] as AXTreeViewNode[] | undefined) : undefined;\n const targetArray = parentChildren ?? nodes;\n\n // Find and remove the node\n const index = targetArray.findIndex((n) => (n[idField] as string) === nodeId);\n if (index !== -1) {\n const removed = targetArray.splice(index, 1)[0];\n\n // Update parent's childrenCount if it exists\n if (parent) {\n const updatedChildren = parent[childrenField] as AXTreeViewNode[] | undefined;\n parent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n\n return removed;\n }\n\n return null;\n }\n\n /**\n * Validate node structure (check for required fields and circular references)\n */\n validateNode(\n node: AXTreeViewNode,\n visitedIds: Set<string> = new Set(),\n idField = 'id',\n titleField = 'title',\n childrenField = 'children',\n childrenCountField = 'childrenCount',\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n const nodeId = node[idField] as string | undefined;\n const nodeTitle = node[titleField] as string | undefined;\n\n if (!nodeId) {\n errors.push(`Node must have an ${idField}`);\n }\n\n if (!nodeTitle) {\n errors.push(`Node must have a ${titleField}`);\n }\n\n if (nodeId && visitedIds.has(nodeId)) {\n errors.push(`Circular reference detected: node ${nodeId} appears multiple times in the tree`);\n }\n\n const children = node[childrenField] as AXTreeViewNode[] | undefined;\n if (children) {\n const newVisited = new Set(visitedIds);\n if (nodeId) {\n newVisited.add(nodeId);\n }\n\n for (const child of children) {\n const childValidation = this.validateNode(\n child,\n newVisited,\n idField,\n titleField,\n childrenField,\n childrenCountField,\n );\n if (!childValidation.valid) {\n errors.push(...childValidation.errors.map((e) => `Child of ${nodeId}: ${e}`));\n }\n }\n\n const childrenCount = node[childrenCountField] as number | undefined;\n if (childrenCount !== undefined && childrenCount !== children.length) {\n errors.push(\n `Node ${nodeId}: ${childrenCountField} (${childrenCount}) does not match ${childrenField} array length (${children.length})`,\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n","import { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDoubleClickDirective } from '@acorex/cdk/double-click';\nimport {\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXDropListDroppedEvent,\n moveItemInArray,\n transferArrayItem,\n} from '@acorex/cdk/drag-drop';\nimport { AXFocusTrapDirective } from '@acorex/cdk/focus-trap';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCheckBoxComponent } from '@acorex/components/check-box';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n EventEmitter,\n inject,\n input,\n model,\n Output,\n output,\n signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { map } from 'rxjs/operators';\nimport { AXTreeViewService } from './tree-view.service';\nimport {\n AXTreeViewBeforeDropEvent,\n AXTreeViewCallback,\n AXTreeViewDataSource,\n AXTreeViewDragArea,\n AXTreeViewDragBehavior,\n AXTreeViewDropEvent,\n AXTreeViewFlatNode,\n AXTreeViewNode,\n AXTreeViewNodeClickEvent,\n AXTreeViewNodeDoubleClickEvent,\n AXTreeViewNodeSelectEvent,\n AXTreeViewItemTemplateContext as AXTreeViewNodeTemplateContext,\n AXTreeViewNodeToggleEvent,\n AXTreeViewSelectionBehavior,\n AXTreeViewSelectionChangeEvent,\n AXTreeViewSelectMode,\n AXTreeViewViewLook,\n} from './tree-view.types';\n\n@Component({\n selector: 'ax-tree-view',\n templateUrl: './tree-view.component.html',\n styleUrls: ['./tree-view.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [AXTreeViewService],\n imports: [\n CommonModule,\n FormsModule,\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXDoubleClickDirective,\n AXFocusTrapDirective,\n NgTemplateOutlet,\n AXButtonComponent,\n AXCheckBoxComponent,\n AXBadgeComponent,\n AXDecoratorIconComponent,\n AXSkeletonComponent,\n AXTooltipDirective,\n ],\n host: {\n class: 'ax-tree-view',\n role: 'tree',\n tabindex: '0',\n '[class.ax-tree-view-default]': \"look() === 'default'\",\n '[class.ax-tree-view-card]': \"look() === 'card'\",\n '[class.ax-tree-view-with-line]': \"look() === 'with-line'\",\n '[class.ax-tree-view-rtl]': 'isRtl',\n '[style.--ax-tree-view-indent-size]': \"indentSize() + 'px'\",\n '[style.--ax-tree-view-line-offset]': \"(indentSize() / 2) + 'px'\",\n '[attr.aria-label]': '\"Tree navigation\"',\n '(keydown)': 'handleKeyDown($event)',\n '(focus)': 'onTreeFocus($event)',\n '(blur)': 'onTreeBlur($event)',\n },\n})\nexport class AXTreeViewComponent {\n // ==================== Dependencies ====================\n private readonly treeService = inject(AXTreeViewService);\n private readonly platformService = inject(AXPlatform);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==================== Inputs ====================\n /** Tree data source - can be static array or lazy loading function */\n readonly datasource = model.required<AXTreeViewDataSource>();\n\n /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */\n readonly selectMode = input<AXTreeViewSelectMode>('single');\n\n /** Selection behavior: 'all' (select anything, no special behavior), 'intermediate' (parent indeterminate state when children selected), 'leaf' (only leaf nodes selectable), 'nested' (selecting parent selects all children). Default: `'intermediate'` */\n readonly selectionBehavior = input<AXTreeViewSelectionBehavior>('intermediate');\n\n /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */\n readonly dragArea = input<AXTreeViewDragArea>('handler');\n\n /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */\n readonly dragBehavior = input<AXTreeViewDragBehavior>('none');\n\n /** Whether to show icons. Default: `true` */\n readonly showIcons = input(true);\n\n /** Whether to show children count badge. Default: `true` */\n readonly showChildrenBadge = input(true);\n\n /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */\n readonly expandedIcon = input('fa-solid fa-chevron-down');\n\n /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */\n readonly collapsedIcon = input('fa-solid fa-chevron-right');\n\n /** Indent size in pixels for each level. Default: `16` */\n readonly indentSize = input(16);\n\n /** Visual style variant. Default: `'default'` */\n readonly look = input<AXTreeViewViewLook>('default');\n\n /** Custom template for tree items. Default: `undefined` */\n readonly nodeTemplate = input<TemplateRef<AXTreeViewNodeTemplateContext>>();\n\n /** Field name for node ID. Default: `'id'` */\n readonly idField = input('id');\n\n /** Field name for node title. Default: `'title'` */\n readonly titleField = input('title');\n\n /** Field name for node tooltip. Default: `'tooltip'` */\n readonly tooltipField = input('tooltip');\n\n /** Field name for node icon. Default: `'icon'` */\n readonly iconField = input('icon');\n\n /** Field name for expanded state. Default: `'expanded'` */\n readonly expandedField = input('expanded');\n\n /** Field name for selected state. Default: `'selected'` */\n readonly selectedField = input('selected');\n\n /** Field name for indeterminate state. Default: `'indeterminate'` */\n readonly indeterminateField = input('indeterminate');\n\n /** Field name for disabled state. Default: `'disabled'` */\n readonly disabledField = input('disabled');\n\n /** Field name for hidden state. Default: `'hidden'` */\n readonly hiddenField = input('hidden');\n\n /** Field name for children array. Default: `'children'` */\n readonly childrenField = input('children');\n\n /** Field name for children count. Default: `'childrenCount'` */\n readonly childrenCountField = input('childrenCount');\n\n /** Field name for custom data. Default: `'data'` */\n readonly dataField = input('data');\n\n /** Whether disabled state is inherited from parent nodes. Default: `true`. */\n readonly inheritDisabled = input(true);\n\n /** Whether double-click on node content toggles expand/collapse. Default: `true`. */\n readonly expandOnDoubleClick = input(true);\n\n // ==================== Outputs ====================\n /** Emitted before a drop operation - set canceled to true to prevent drop */\n readonly onBeforeDrop = output<AXTreeViewBeforeDropEvent>();\n\n /** Emitted when a node is toggled (expanded/collapsed) */\n readonly onNodeToggle = output<AXTreeViewNodeToggleEvent>();\n\n /** Emitted when a node is selected/deselected */\n readonly onNodeSelect = output<AXTreeViewNodeSelectEvent>();\n\n /** Emitted when a node is double-clicked */\n // readonly onNodeDoubleClick = output<AXTreeViewNodeDoubleClickEvent>();\n @Output() onNodeDoubleClick = new EventEmitter<AXTreeViewNodeDoubleClickEvent>();\n\n /** Emitted when a node is double-clicked */\n readonly onNodeClick = output<AXTreeViewNodeClickEvent>();\n\n /** Emitted when selection changes - returns all currently selected nodes */\n readonly onSelectionChange = output<AXTreeViewSelectionChangeEvent>();\n\n /** Emitted when nodes are reordered within the same parent */\n readonly onOrderChange = output<AXTreeViewDropEvent>();\n\n /** Emitted when a node is moved to a different parent */\n readonly onMoveChange = output<AXTreeViewDropEvent>();\n\n /** Emitted for any item change (order or move) */\n readonly onItemsChange = output<AXTreeViewDropEvent>();\n\n // ==================== Internal State ====================\n /** Internal signal for tree nodes */\n protected readonly nodes = signal<AXTreeViewNode[]>([]);\n\n /** Internal signal for tracking loading state of individual nodes */\n protected readonly loadingNodes = signal<Set<string>>(new Set());\n\n /** Signal for tracking root/tree-level loading state (used by reloadData) */\n private readonly _isLoading = signal(false);\n\n /** Public readonly signal for tree loading state - can be used in templates */\n readonly isLoading = this._isLoading.asReadonly();\n\n /** Currently focused node ID for keyboard navigation */\n protected readonly focusedNodeId = signal<string | null>(null);\n\n /** RTL detection signal */\n protected readonly isRtl = signal(this.platformService.isRtl());\n\n /** active node id */\n protected readonly activeNodeId = signal<string | null>(null);\n\n /** Computed chevron icons that flip for RTL */\n protected readonly directionExpandedIcon = computed(() => this.expandedIcon());\n\n protected readonly directionCollapsedIcon = computed(() => {\n const isRtlDirection = this.isRtl();\n const defaultIcon = this.collapsedIcon();\n\n if (isRtlDirection && defaultIcon === 'fa-solid fa-chevron-right') {\n return 'fa-solid fa-chevron-left';\n }\n if (!isRtlDirection && defaultIcon === 'fa-solid fa-chevron-left') {\n return 'fa-solid fa-chevron-right';\n }\n return defaultIcon;\n });\n\n /** Flag to prevent infinite loops when syncing datasource */\n private isUpdatingFromDatasource = false;\n\n /** Computed to check if datasource is a function */\n private readonly isLazyDataSource = computed(() => typeof this.datasource() === 'function');\n\n /** Computed: Returns true when selection is restricted to leaf nodes only */\n protected readonly isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf');\n\n /** Computed: Returns true when selecting a parent automatically selects all its children */\n protected readonly cascadesToChildren = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'nested' || behavior === 'intermediate-nested';\n });\n\n /** Computed: Returns true when parent nodes show indeterminate state based on children selection */\n protected readonly hasIntermediateState = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'intermediate' || behavior === 'intermediate-nested';\n });\n\n /** Computed: Returns true when drag handle should be shown */\n protected readonly shouldShowDragHandle = computed(() => {\n return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';\n });\n\n /** Signal to track if double-click output has subscribers */\n private readonly hasDoubleClickSubscribers = signal(false);\n\n /**\n * Returns true if double-click output has no subscribers (should disable directive)\n * Uses a computed signal that checks if EventEmitter has observers\n * If no subscribers AND expandOnDoubleClick is false, disable the directive (return true)\n * If has subscribers OR expandOnDoubleClick is true, enable the directive (return false)\n */\n protected readonly isDoubleClickDisabled = computed(() => {\n // If expandOnDoubleClick is enabled, we need the directive to work, so don't disable it\n if (this.expandOnDoubleClick()) {\n return false;\n }\n // Otherwise, disable if no subscribers\n return !this.hasDoubleClickSubscribers();\n });\n\n /** Check EventEmitter observers and update signal */\n private checkDoubleClickSubscribers(): void {\n // Access the EventEmitter's observers property\n // EventEmitter extends Subject which has observers array\n const emitter = this.onNodeDoubleClick as any;\n const observers = emitter?.observers || [];\n const hasSubscribers = observers.length > 0;\n this.hasDoubleClickSubscribers.set(hasSubscribers);\n }\n\n // ==================== Node Property Helpers ====================\n /**\n * Get a property value from a node using the configured field name\n */\n protected getNodeProp<T = unknown>(node: AXTreeViewNode, fieldName: string, defaultValue?: T): T {\n return (node[fieldName] as T) ?? (defaultValue as T);\n }\n\n /**\n * Set a property value on a node using the configured field name\n */\n protected setNodeProp(node: AXTreeViewNode, fieldName: string, value: unknown): void {\n node[fieldName] = value;\n }\n\n /**\n * Get node ID\n */\n protected getNodeId(node: AXTreeViewNode): string {\n return this.getNodeProp<string>(node, this.idField(), '');\n }\n\n /**\n * Get node title\n */\n protected getNodeTitle(node: AXTreeViewNode): string {\n return this.getNodeProp<string>(node, this.titleField(), '');\n }\n\n /**\n * Get node tooltip\n */\n protected getNodeTooltip(node: AXTreeViewNode): string | undefined {\n return this.getNodeProp<string | undefined>(node, this.tooltipField(), undefined);\n }\n\n /**\n * Get node icon\n */\n protected getNodeIcon(node: AXTreeViewNode): string | undefined {\n return this.getNodeProp<string | undefined>(node, this.iconField(), undefined);\n }\n\n /**\n * Get node expanded state\n */\n protected getNodeExpanded(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.expandedField(), false);\n }\n\n /**\n * Set node expanded state\n */\n protected setNodeExpanded(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.expandedField(), value);\n }\n\n /**\n * Get node selected state\n */\n protected getNodeSelected(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.selectedField(), false);\n }\n\n /**\n * Set node selected state\n */\n protected setNodeSelected(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.selectedField(), value);\n }\n\n /**\n * Get node indeterminate state\n */\n protected getNodeIndeterminate(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.indeterminateField(), false);\n }\n\n /**\n * Set node indeterminate state\n */\n protected setNodeIndeterminate(node: AXTreeViewNode, value: boolean): void {\n this.setNodeProp(node, this.indeterminateField(), value);\n }\n\n /**\n * Get node's own disabled state (without inheritance)\n */\n protected getNodeDisabled(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.disabledField(), false);\n }\n\n /**\n * Check if node is effectively disabled (considering inheritance from parents)\n * When inheritDisabled is true:\n * - Returns true if node itself is disabled\n * - Returns true if any ancestor is disabled AND node doesn't have explicit `disabled: false`\n * When inheritDisabled is false:\n * - Only returns node's own disabled state\n */\n protected isNodeEffectivelyDisabled(node: AXTreeViewNode): boolean {\n // Check if node itself is disabled\n if (this.getNodeDisabled(node)) {\n return true;\n }\n\n // If not inheriting disabled state, just return false (node is not disabled)\n if (!this.inheritDisabled()) {\n return false;\n }\n\n // Check if node explicitly has disabled: false (override inheritance)\n const nodeDisabledValue = node[this.disabledField()];\n if (nodeDisabledValue === false) {\n return false;\n }\n\n // Check ancestors for disabled state\n return this.isAnyAncestorDisabled(node);\n }\n\n /**\n * Check if any ancestor of the node is disabled\n */\n private isAnyAncestorDisabled(node: AXTreeViewNode): boolean {\n const parent = this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField());\n\n if (!parent) {\n return false;\n }\n\n if (this.getNodeDisabled(parent)) {\n return true;\n }\n\n return this.isAnyAncestorDisabled(parent);\n }\n\n /**\n * Get node hidden state\n */\n protected getNodeHidden(node: AXTreeViewNode): boolean {\n return this.getNodeProp<boolean>(node, this.hiddenField(), false);\n }\n\n /**\n * Get node children array\n */\n protected getNodeChildren(node: AXTreeViewNode): AXTreeViewNode[] | undefined {\n return this.getNodeProp<AXTreeViewNode[] | undefined>(node, this.childrenField(), undefined);\n }\n\n /**\n * Set node children array\n */\n protected setNodeChildren(node: AXTreeViewNode, value: AXTreeViewNode[] | undefined): void {\n this.setNodeProp(node, this.childrenField(), value);\n }\n\n /**\n * Get node children count\n */\n protected getNodeChildrenCount(node: AXTreeViewNode): number | undefined {\n return this.getNodeProp<number | undefined>(node, this.childrenCountField(), undefined);\n }\n\n /**\n * Set node children count\n */\n protected setNodeChildrenCount(node: AXTreeViewNode, value: number | undefined): void {\n this.setNodeProp(node, this.childrenCountField(), value);\n }\n\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n readonly #datasourceEffect = effect(async () => {\n if (this.isUpdatingFromDatasource) {\n return;\n }\n\n const ds = this.datasource();\n if (Array.isArray(ds)) {\n this.nodes.set([...ds]);\n } else if (typeof ds === 'function') {\n try {\n await this.loadRootItems(ds);\n } catch (error: unknown) {\n this.handleError('Failed to load root items', error);\n }\n }\n });\n\n /** Initialize direction change listener */\n readonly #initDirectionListener = afterNextRender(() => {\n this.platformService.directionChange\n .pipe(\n map((event) => event.data === 'rtl'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((isRtl) => this.isRtl.set(isRtl));\n\n // Check double-click subscribers after view initialization\n this.checkDoubleClickSubscribers();\n\n // Set up periodic check to detect when subscribers are added/removed\n // This ensures we catch template bindings that happen after initial render\n const intervalId = setInterval(() => {\n this.checkDoubleClickSubscribers();\n }, 100);\n\n // Clean up interval on destroy\n this.destroyRef.onDestroy(() => {\n clearInterval(intervalId);\n });\n });\n\n // ==================== Public API ====================\n /**\n * Expand all nodes in the tree (with lazy loading support)\n */\n async expandAll(): Promise<void> {\n await this.treeService.setExpandedState(\n this.nodes(),\n true,\n this.isLazyDataSource(),\n (node) => this.loadNodeChildren(node),\n this.expandedField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n this.refreshNodes();\n }\n\n /**\n * Collapse all nodes in the tree\n */\n collapseAll(): void {\n this.treeService.setExpandedState(\n this.nodes(),\n false,\n this.isLazyDataSource(),\n (node) => this.loadNodeChildren(node),\n this.expandedField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n this.refreshNodes();\n }\n\n /**\n * Get count of selected nodes\n */\n getSelectedCount(): number {\n return this.treeService.countSelected(this.nodes(), this.selectedField(), this.childrenField());\n }\n\n /**\n * Check if any nodes are selected\n */\n hasSelection(): boolean {\n return this.getSelectedCount() > 0;\n }\n\n /**\n * Get all selected nodes\n */\n getSelectedNodes(): AXTreeViewNode[] {\n const selected: AXTreeViewNode[] = [];\n this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());\n return selected;\n }\n\n /**\n * Delete selected nodes from the tree\n */\n deleteSelected(): void {\n this.treeService.removeSelected(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n if (!this.isLeafOnlyMode()) {\n this.treeService.updateAllParentStates(\n this.nodes(),\n this.hasIntermediateState(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Select all nodes in the tree (respects disabled state)\n */\n selectAll(): void {\n if (this.selectMode() === 'none') {\n return;\n }\n if (this.isLeafOnlyMode()) {\n // Only select leaf nodes that are not disabled\n const selectLeafs = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (this.isLeafNode(node) && !this.isNodeEffectivelyDisabled(node)) {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n selectLeafs(children);\n }\n }\n };\n selectLeafs(this.nodes());\n } else {\n // Select all nodes that are not disabled\n const selectAllNonDisabled = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (!this.isNodeEffectivelyDisabled(node)) {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n selectAllNonDisabled(children);\n }\n }\n };\n selectAllNonDisabled(this.nodes());\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Deselect all nodes in the tree\n */\n deselectAll(): void {\n this.treeService.setAllSelection(\n this.nodes(),\n false,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.refreshNodes();\n this.emitSelectionChange();\n }\n\n /**\n * Find a node by ID in the tree\n */\n findNode(id: string): AXTreeViewNode | null {\n return this.treeService.findNodeById(this.nodes(), id, this.idField(), this.childrenField());\n }\n\n /**\n * Refresh the tree to trigger change detection\n */\n refresh(): void {\n this.refreshNodes();\n }\n\n /**\n * Reload the entire tree data from the datasource\n * For callback datasource: clears all nodes and reloads from root\n * For array datasource: refreshes the current data\n * @returns Promise that resolves when reload is complete\n */\n async reloadData(): Promise<void> {\n // Prevent concurrent reloads\n if (this._isLoading()) {\n return;\n }\n\n const ds = this.datasource();\n\n if (typeof ds === 'function') {\n this._isLoading.set(true);\n\n // Clear states in batch for better performance\n this.loadingNodes.set(new Set());\n this.nodes.set([]);\n this.focusedNodeId.set(null);\n this.activeNodeId.set(null);\n\n try {\n const result = ds();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n } catch (error: unknown) {\n this.handleError('Failed to reload data', error);\n this.nodes.set([]);\n } finally {\n this._isLoading.set(false);\n }\n } else if (Array.isArray(ds)) {\n // For array datasource, just refresh from the current data\n this.nodes.set([...ds]);\n }\n }\n\n /**\n * Check if the tree is currently loading data (root level)\n * @returns true if the tree is loading root data\n */\n getIsLoading(): boolean {\n return this._isLoading();\n }\n\n /**\n * Check if a node is currently loading\n */\n isNodeLoading(nodeId: string): boolean {\n return this.loadingNodes().has(nodeId);\n }\n\n /**\n * Get loading state for a node (internal state)\n */\n getNodeLoading(node: AXTreeViewNode): boolean {\n return this.loadingNodes().has(this.getNodeId(node));\n }\n\n /**\n * Edit/update a node's properties\n * @param nodeId - The ID of the node to edit\n * @param updates - Partial node object with properties to update\n * @returns true if node was found and updated, false otherwise\n */\n editNode(nodeId: string, updates: Partial<AXTreeViewNode>): boolean {\n const updated = this.treeService.editNode(\n this.nodes(),\n nodeId,\n updates,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n if (updated) {\n this.refreshNodes();\n return true;\n }\n return false;\n }\n\n /**\n * Add a child node to a parent node\n * @param parentId - The ID of the parent node\n * @param childNode - The child node to add\n * @param index - Optional index to insert at (default: append to end)\n * @returns true if parent was found and child was added, false otherwise\n */\n addChild(parentId: string, childNode: AXTreeViewNode, index?: number): boolean {\n const parent = this.treeService.addChild(\n this.nodes(),\n parentId,\n childNode,\n index,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n this.expandedField(),\n );\n if (parent) {\n this.refreshNodes();\n return true;\n }\n return false;\n }\n\n /**\n * Remove a node from the tree\n * @param nodeId - The ID of the node to remove\n * @returns The removed node if found, null otherwise\n */\n removeNode(nodeId: string): AXTreeViewNode | null {\n const removed = this.treeService.removeNode(\n this.nodes(),\n nodeId,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n );\n if (removed) {\n // Update parent states if needed\n if (this.hasIntermediateState()) {\n this.treeService.updateAllParentStates(\n this.nodes(),\n this.hasIntermediateState(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n this.refreshNodes();\n }\n return removed;\n }\n\n /**\n * Expand a specific node\n * @param nodeId - The ID of the node to expand\n * @returns Promise that resolves when expansion is complete (if lazy loading)\n */\n async expandNode(nodeId: string): Promise<void> {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n if (hasChildren || canLazyLoad) {\n if (canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n this.setNodeExpanded(node, true);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('expand') });\n }\n }\n\n /**\n * Collapse a specific node\n * @param nodeId - The ID of the node to collapse\n */\n collapseNode(nodeId: string): void {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n if (this.getNodeExpanded(node)) {\n this.setNodeExpanded(node, false);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: new Event('collapse') });\n }\n }\n\n /**\n * Toggle expansion state of a specific node\n * @param nodeId - The ID of the node to toggle\n * @returns Promise that resolves when toggle is complete (if lazy loading)\n */\n async toggleNodeExpansion(nodeId: string): Promise<void> {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n\n if (this.getNodeExpanded(node)) {\n this.collapseNode(nodeId);\n } else {\n await this.expandNode(nodeId);\n }\n }\n\n /**\n * Programmatically select a node\n * @param nodeId - The ID of the node to select\n * @returns true if node was found and selected, false otherwise\n */\n selectNode(nodeId: string): boolean {\n if (this.selectMode() === 'none') {\n return false;\n }\n const node = this.findNode(nodeId);\n if (!node || this.isNodeEffectivelyDisabled(node) || !this.canSelectNode(node)) {\n return false;\n }\n\n const mode = this.selectMode();\n if (mode === 'single') {\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n } else {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n true,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: false,\n });\n this.emitSelectionChange();\n return true;\n }\n\n /**\n * Programmatically deselect a node\n * @param nodeId - The ID of the node to deselect\n * @returns true if node was found and deselected, false otherwise\n */\n deselectNode(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n if (!node) {\n return false;\n }\n\n this.setNodeSelected(node, false);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n false,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: false,\n });\n this.emitSelectionChange();\n return true;\n }\n\n /**\n * Get parent node of a given node\n * @param nodeId - The ID of the node\n * @returns The parent node if found, null otherwise\n */\n getParent(nodeId: string): AXTreeViewNode | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField()) ?? null;\n }\n\n /**\n * Get children of a node\n * @param nodeId - The ID of the parent node\n * @returns Array of child nodes, or null if node not found\n */\n getChildren(nodeId: string): AXTreeViewNode[] | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.getNodeChildren(node) ?? [];\n }\n\n /**\n * Get all root nodes\n * @returns Array of root nodes\n */\n getRootNodes(): AXTreeViewNode[] {\n return [...this.nodes()];\n }\n\n /**\n * Get all nodes in a flat array\n * @returns Array of all nodes in the tree\n */\n getAllNodes(): AXTreeViewNode[] {\n return this.treeService.getAllNodes(this.nodes(), this.childrenField());\n }\n\n /**\n * Get the path to a node (array of parent IDs from root to node)\n * @param nodeId - The ID of the node\n * @returns Array of node IDs representing the path, or empty array if node not found\n */\n getNodePath(nodeId: string): string[] {\n const nodePath = this.treeService.getNodePath(this.nodes(), nodeId, this.idField(), this.childrenField());\n return nodePath.map((node) => this.getNodeId(node));\n }\n\n /**\n * Get the level/depth of a node (0 = root level)\n * @param nodeId - The ID of the node\n * @returns The level of the node, or -1 if node not found\n */\n getNodeLevel(nodeId: string): number {\n return this.treeService.getNodeLevel(this.nodes(), nodeId, this.idField(), this.childrenField());\n }\n\n /**\n * Programmatically move a node to a new parent\n * @param nodeId - The ID of the node to move\n * @param newParentId - The ID of the new parent (undefined for root level)\n * @param index - Optional index to insert at (default: append to end)\n * @returns true if move was successful, false otherwise\n */\n moveNode(nodeId: string, newParentId?: string, index?: number): boolean {\n const result = this.treeService.moveNode(\n this.nodes(),\n nodeId,\n newParentId,\n index,\n this.idField(),\n this.childrenField(),\n this.childrenCountField(),\n this.expandedField(),\n );\n\n if (result.success && result.movedNode) {\n // Emit drop events\n this.emitDropEvents(\n result.movedNode,\n result.previousParent,\n result.newParent,\n result.previousIndex,\n result.currentIndex,\n false,\n );\n this.refreshNodes();\n return true;\n }\n\n return false;\n }\n\n /**\n * Clone a node (creates a deep copy)\n * @param nodeId - The ID of the node to clone\n * @returns The cloned node, or null if node not found\n */\n cloneNode(nodeId: string): AXTreeViewNode | null {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n\n return this.treeService.cloneNode(\n node,\n this.idField(),\n this.titleField(),\n this.tooltipField(),\n this.iconField(),\n this.expandedField(),\n this.selectedField(),\n this.indeterminateField(),\n this.disabledField(),\n this.hiddenField(),\n this.childrenCountField(),\n this.dataField(),\n this.childrenField(),\n );\n }\n\n /**\n * Focus a specific node by ID\n * @param nodeId - The ID of the node to focus\n * @returns true if node was found and focused, false otherwise\n */\n focusNode(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n if (!node || this.getNodeHidden(node) === true || this.isNodeEffectivelyDisabled(node)) {\n return false;\n }\n this.focusNodeById(nodeId);\n return true;\n }\n\n /**\n * Get all expanded nodes\n * @returns Array of expanded nodes\n */\n getExpandedNodes(): AXTreeViewNode[] {\n const expanded: AXTreeViewNode[] = [];\n const traverse = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n if (this.getNodeExpanded(node)) {\n expanded.push(node);\n }\n const children = this.getNodeChildren(node);\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(this.nodes());\n return expanded;\n }\n\n /**\n * Get all collapsed nodes that have children\n * @returns Array of collapsed nodes with children\n */\n getCollapsedNodes(): AXTreeViewNode[] {\n const collapsed: AXTreeViewNode[] = [];\n const traverse = (nodes: AXTreeViewNode[]): void => {\n for (const node of nodes) {\n const children = this.getNodeChildren(node);\n const childrenCount = this.getNodeChildrenCount(node);\n if (!this.getNodeExpanded(node) && (children?.length || childrenCount)) {\n collapsed.push(node);\n }\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(this.nodes());\n return collapsed;\n }\n\n /**\n * Check if a node is expanded\n * @param nodeId - The ID of the node\n * @returns true if node is expanded, false otherwise\n */\n isNodeExpanded(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.getNodeExpanded(node) : false;\n }\n\n /**\n * Check if a node is selected\n * @param nodeId - The ID of the node\n * @returns true if node is selected, false otherwise\n */\n isNodeSelected(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.getNodeSelected(node) : false;\n }\n\n /**\n * Check if a node has children\n * @param nodeId - The ID of the node\n * @returns true if node has children, false otherwise\n */\n hasChildren(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return this.treeService.hasChildren(node ?? {}, this.childrenField());\n }\n\n /**\n * Check if a node is disabled (considering inheritance from parent nodes)\n * @param nodeId - The ID of the node\n * @returns true if node is disabled (directly or inherited), false otherwise\n */\n isDisabled(nodeId: string): boolean {\n const node = this.findNode(nodeId);\n return node ? this.isNodeEffectivelyDisabled(node) : false;\n }\n\n /**\n * Get template context for a node\n */\n getTemplateContext(node: AXTreeViewNode, level = 0): AXTreeViewNodeTemplateContext {\n const children = this.getNodeChildren(node);\n const childrenCount = this.getNodeChildrenCount(node);\n return {\n $implicit: node,\n node,\n level,\n expanded: this.getNodeExpanded(node),\n childrenCount: childrenCount ?? children?.length ?? 0,\n loading: this.getNodeLoading(node),\n disabled: this.isNodeEffectivelyDisabled(node),\n };\n }\n\n /**\n * Calculate padding-inline for a node based on its level\n */\n getNodePaddingInline(level: number): number {\n const indent = this.indentSize();\n const currentLook = this.look();\n const multiplier = currentLook === 'with-line' ? 1 / 3 : 1;\n return level * indent * multiplier;\n }\n\n /**\n * Check if node should show expand toggle\n */\n shouldShowExpandToggle(node: AXTreeViewNode): boolean {\n return (\n this.treeService.hasChildren(node, this.childrenField()) ||\n this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField())\n );\n }\n\n /**\n * Check if checkboxes should be shown (only for multiple mode)\n */\n shouldShowCheckbox(): boolean {\n return this.selectMode() === 'multiple';\n }\n\n /**\n * Check if double-click directive should be disabled for a node\n * Disabled for leaf nodes (immediate clicks) or when isDoubleClickDisabled is true\n */\n protected isDoubleClickDisabledForNode(node: AXTreeViewNode): boolean {\n return this.isDoubleClickDisabled() || this.isLeafNode(node);\n }\n\n /**\n * Check if a node is a leaf (has no children)\n * A node is a leaf if it has no loaded children AND no childrenCount (or childrenCount is 0)\n */\n isLeafNode(node: AXTreeViewNode): boolean {\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const childrenCount = this.getNodeChildrenCount(node);\n const hasChildrenCount = childrenCount && childrenCount > 0;\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n // A node is a leaf if:\n // 1. It has no loaded children\n // 2. AND it has no childrenCount (or childrenCount is 0)\n // 3. AND it cannot be lazy loaded\n return !hasChildren && !hasChildrenCount && !canLazyLoad;\n }\n\n /**\n * Check if a node can be selected (considering selectMode and isLeafOnlyMode)\n */\n canSelectNode(node: AXTreeViewNode): boolean {\n if (this.selectMode() === 'none') {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n\n /**\n * Check if checkbox should be shown for a specific node\n */\n shouldShowCheckboxForNode(node: AXTreeViewNode): boolean {\n if (!this.shouldShowCheckbox()) {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n\n /**\n * Generate unique list ID for each node\n */\n getListId(node?: AXTreeViewNode): string {\n return this.treeService.getListId(node, this.idField());\n }\n\n /**\n * Check if a node is currently focused\n */\n isNodeFocused(nodeId: string): boolean {\n return this.focusedNodeId() === nodeId;\n }\n\n /**\n * Get ARIA level for a node\n */\n getNodeAriaLevel(level: number): number {\n return level + 1;\n }\n\n /**\n * Get ARIA expanded state for a node\n */\n getNodeAriaExpanded(node: AXTreeViewNode): string | null {\n if (!this.shouldShowExpandToggle(node)) {\n return null;\n }\n return this.getNodeExpanded(node) ? 'true' : 'false';\n }\n\n /**\n * Get ARIA selected state for a node\n */\n getNodeAriaSelected(node: AXTreeViewNode): string | null {\n if (this.selectMode() === 'none') {\n return null;\n }\n const selected = this.getNodeSelected(node);\n if (this.selectMode() === 'single') {\n return selected ? 'true' : 'false';\n }\n if (this.selectMode() === 'multiple') {\n return selected ? 'true' : 'false';\n }\n return null;\n }\n\n /**\n * Emit selection change event with all selected nodes\n */\n private emitSelectionChange(): void {\n const selectedNodes = this.getSelectedNodes();\n this.onSelectionChange.emit({\n component: this,\n selectedNodes,\n });\n }\n\n // ==================== Event Handlers ====================\n\n /**\n * Handle node double click\n */\n async onNodeDoubleClickHandle(node: AXTreeViewNode, event: Event): Promise<void> {\n if (this.isNodeEffectivelyDisabled(node)) return;\n\n // If expandOnDoubleClick is enabled and node has children, toggle expansion\n if (this.expandOnDoubleClick() && this.shouldShowExpandToggle(node)) {\n await this.toggleNodeExpansion(node[this.idField()] as string);\n }\n\n this.onNodeDoubleClick.emit({\n component: this,\n node,\n nativeEvent: event,\n });\n }\n /**\n * Handle node click handle\n */\n onNodeClickHandle(node: AXTreeViewNode, event: Event): void {\n if (this.isNodeEffectivelyDisabled(node)) return;\n\n const mode = this.selectMode();\n\n this.activeNodeId.set(this.getNodeId(node));\n if (mode === 'single' && this.canSelectNode(node)) {\n this.handleSingleSelection(node, event);\n } else if (mode === 'multiple' && this.canSelectNode(node)) {\n this.handleMultipleSelection(node, event);\n }\n\n this.onNodeClick.emit({ component: this, node, nativeEvent: event });\n }\n\n /**\n * Toggle node expansion state with lazy loading support\n * Note: Disabled nodes can still be toggled (expanded/collapsed) for better UX\n */\n async toggleNode(node: AXTreeViewNode, event: Event): Promise<void> {\n if (this.isEvent(event) && typeof event.stopPropagation === 'function') {\n event.stopPropagation();\n }\n\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(\n node,\n this.isLazyDataSource(),\n this.childrenCountField(),\n this.childrenField(),\n );\n\n if (hasChildren || canLazyLoad) {\n const willExpand = !this.getNodeExpanded(node);\n\n if (willExpand && canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n\n this.setNodeExpanded(node, willExpand);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: event });\n }\n }\n\n /**\n * Toggle node selection state with indeterminate support (for multiple mode)\n */\n toggleSelection(node: AXTreeViewNode, event: AXValueChangedEvent): void {\n if (!event.isUserInteraction) return;\n if (this.selectMode() === 'none') return;\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n if (mode !== 'multiple') return;\n\n const newValue = event.value === null ? true : event.value;\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: event.isUserInteraction,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle drop events for tree nodes\n */\n onDrop(event: AXDropListDroppedEvent, parentNode?: AXTreeViewNode): void {\n const targetArray = parentNode ? (this.getNodeChildren(parentNode) ?? []) : this.nodes();\n const isReordering = event.previousContainer === event.container;\n\n if (isReordering) {\n this.handleReorder(event, targetArray, parentNode);\n } else {\n this.handleMove(event, targetArray, parentNode);\n }\n\n this.refreshNodes();\n }\n\n /**\n * Handle drop events when dropping directly onto a node (to make it a child)\n */\n onDropOntoNode(event: AXDropListDroppedEvent, targetNode: AXTreeViewNode): void {\n if (!this.canMoveToParent()) return;\n\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray) return;\n\n const movedNode = sourceArray[event.previousIndex];\n\n if (!this.treeService.isValidDropTarget(movedNode, targetNode, this.idField(), this.childrenField())) return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, targetNode, event.previousIndex, 0)) return;\n\n let targetChildren = this.getNodeChildren(targetNode);\n if (!targetChildren) {\n targetChildren = [];\n this.setNodeChildren(targetNode, targetChildren);\n }\n sourceArray.splice(event.previousIndex, 1);\n targetChildren.unshift(movedNode);\n this.setNodeExpanded(targetNode, true);\n\n this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), targetNode, event.previousIndex, 0, false);\n\n this.refreshNodes();\n }\n\n /**\n * Handle node focus event\n */\n onNodeFocus(nodeId: string): void {\n this.focusedNodeId.set(nodeId);\n }\n\n /**\n * Handle tree container focus - focus first node if none is focused\n */\n onTreeFocus(event: FocusEvent): void {\n if (event.target === event.currentTarget) {\n const flatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n if (flatList.length > 0) {\n const focusedId = this.focusedNodeId();\n if (focusedId) {\n // Check if the focused node still exists and is not hidden\n const focusedNode = this.treeService.findNodeById(\n this.nodes(),\n focusedId,\n this.idField(),\n this.childrenField(),\n );\n if (focusedNode && this.getNodeHidden(focusedNode) !== true) {\n this.focusNodeById(focusedId);\n } else {\n // Focused node no longer exists, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\n } else {\n // No node is focused, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\n }\n }\n }\n\n /**\n * Handle tree container blur\n */\n onTreeBlur(event: FocusEvent): void {\n if (event.relatedTarget && !(event.currentTarget as HTMLElement).contains(event.relatedTarget as Node)) {\n this.focusedNodeId.set(null);\n }\n }\n\n /**\n * Handle keyboard navigation\n */\n handleKeyDown(event: KeyboardEvent): void {\n const flatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n if (flatList.length === 0) return;\n\n const currentFocused = this.getFocusedNode();\n let currentIndex = currentFocused\n ? flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentFocused))\n : -1;\n\n if (currentIndex === -1 && event.target === event.currentTarget) {\n currentIndex = 0;\n }\n\n const navigationResult = this.handleNavigationKey(event, flatList, currentIndex, currentFocused);\n if (navigationResult.handled) {\n if (navigationResult.shouldPreventDefault) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (\n navigationResult.targetIndex !== null &&\n navigationResult.targetIndex >= 0 &&\n navigationResult.targetIndex < flatList.length\n ) {\n this.focusNodeById(this.getNodeId(flatList[navigationResult.targetIndex].node));\n }\n }\n }\n\n // ==================== Private Methods ====================\n /**\n * Load root items when datasource is a function\n */\n private async loadRootItems(loadFn: AXTreeViewCallback): Promise<void> {\n try {\n const result = loadFn();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n } catch (error: unknown) {\n this.handleError('Failed to load root items', error);\n this.nodes.set([]);\n }\n }\n\n /**\n * Load children for a node using lazy loading\n * Only calls callback if:\n * - children field is undefined or empty\n * - AND childrenCount > 0\n */\n private async loadNodeChildren(node: AXTreeViewNode): Promise<void> {\n const nodeId = this.getNodeId(node);\n if (!this.isLazyDataSource() || this.loadingNodes().has(nodeId)) return;\n\n // If children are already loaded, don't call callback\n const existingChildren = this.getNodeChildren(node);\n if (existingChildren && existingChildren.length > 0) {\n return;\n }\n\n // Only call callback if childrenCount > 0\n const childrenCount = this.getNodeChildrenCount(node);\n if (!childrenCount || childrenCount <= 0) {\n return;\n }\n\n const ds = this.datasource();\n if (typeof ds !== 'function') return;\n\n try {\n this.loadingNodes.update((set) => new Set(set).add(nodeId));\n this.refreshNodes();\n\n const result = ds(nodeId);\n const children = result instanceof Promise ? await result : result;\n this.setNodeChildren(node, children);\n this.setNodeChildrenCount(node, children.length);\n } catch (error: unknown) {\n this.handleError('Failed to load children', error);\n this.setNodeChildrenCount(node, 0);\n } finally {\n this.loadingNodes.update((set) => {\n const newSet = new Set(set);\n newSet.delete(nodeId);\n return newSet;\n });\n this.refreshNodes();\n }\n }\n\n /**\n * Internal method to refresh nodes signal and sync back to datasource if it's an array\n * Creates new array references for all nested children to ensure reactivity\n */\n private refreshNodes(): void {\n const currentNodes = this.nodes();\n // Create new array references for all nested children to ensure reactivity\n // This ensures Angular's change detection picks up changes even with callback datasource\n this.ensureNewArrayReferences(currentNodes);\n this.nodes.set([...currentNodes]);\n\n if (!this.isLazyDataSource() && !this.isUpdatingFromDatasource) {\n this.isUpdatingFromDatasource = true;\n this.datasource.set([...currentNodes]);\n setTimeout(() => {\n this.isUpdatingFromDatasource = false;\n }, 0);\n }\n }\n\n /**\n * Recursively ensure all children arrays have new references to trigger change detection\n * Mutates the tree structure by replacing children arrays with new array references\n */\n private ensureNewArrayReferences(nodes: AXTreeViewNode[]): void {\n for (const node of nodes) {\n const children = this.getNodeChildren(node);\n if (children && children.length > 0) {\n // Create new array reference for children\n this.setNodeChildren(node, [...children]);\n // Recursively process nested children\n this.ensureNewArrayReferences(children);\n }\n }\n }\n\n /**\n * Handle single selection mode\n */\n private handleSingleSelection(node: AXTreeViewNode, event: Event): void {\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)\n */\n private handleMultipleSelection(node: AXTreeViewNode, event: Event): void {\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Get array reference by drop list ID\n */\n private getArrayByListId(listId: string): AXTreeViewNode[] | null {\n return this.treeService.getArrayByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n\n /**\n * Find parent node by list ID\n */\n private findParentByListId(listId: string): AXTreeViewNode | undefined {\n return this.treeService.findParentByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n\n /**\n * Check if move operation is allowed based on dragBehavior\n */\n private canMoveToParent(): boolean {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'order-only';\n }\n\n /**\n * Check if reorder operation is allowed based on dragBehavior\n */\n private canReorder(): boolean {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'move';\n }\n\n /**\n * Handle reordering within the same list */\n private handleReorder(\n event: AXDropListDroppedEvent,\n targetArray: AXTreeViewNode[],\n parentNode?: AXTreeViewNode,\n ): void {\n if (!this.canReorder()) return;\n\n const movedNode = targetArray[event.previousIndex];\n moveItemInArray(targetArray, event.previousIndex, event.currentIndex);\n\n this.emitDropEvents(movedNode, parentNode, parentNode, event.previousIndex, event.currentIndex, true);\n }\n\n /**\n * Handle moving between different lists\n */\n private handleMove(event: AXDropListDroppedEvent, targetArray: AXTreeViewNode[], parentNode?: AXTreeViewNode): void {\n if (!this.canMoveToParent()) return;\n\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray) return;\n\n const movedNode = sourceArray[event.previousIndex];\n\n if (parentNode && !this.treeService.isValidDropTarget(movedNode, parentNode)) return;\n\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, parentNode, event.previousIndex, event.currentIndex)) {\n return;\n }\n\n transferArrayItem(sourceArray, targetArray, event.previousIndex, event.currentIndex);\n\n this.emitDropEvents(\n movedNode,\n this.findParentByListId(sourceListId),\n parentNode,\n event.previousIndex,\n event.currentIndex,\n false,\n );\n }\n\n /**\n * Emit beforeDrop event and return whether to continue\n */\n private emitBeforeDropEvent(\n movedNode: AXTreeViewNode,\n sourceListId: string,\n currentParent: AXTreeViewNode | undefined,\n previousIndex: number,\n currentIndex: number,\n ): boolean {\n const beforeDropEvent: AXTreeViewBeforeDropEvent = {\n component: this,\n movedNode,\n previousParent: this.findParentByListId(sourceListId),\n currentParent,\n previousIndex,\n currentIndex,\n canceled: false,\n };\n this.onBeforeDrop.emit(beforeDropEvent);\n\n return !beforeDropEvent.canceled;\n }\n\n /**\n * Emit drop events based on operation type\n */\n private emitDropEvents(\n node: AXTreeViewNode,\n previousParent: AXTreeViewNode | undefined,\n currentParent: AXTreeViewNode | undefined,\n previousIndex: number,\n currentIndex: number,\n isReorder: boolean,\n ): void {\n const dropEvent: AXTreeViewDropEvent = {\n component: this,\n node,\n previousParent,\n currentParent,\n previousIndex,\n currentIndex,\n };\n\n if (isReorder) {\n this.onOrderChange.emit(dropEvent);\n } else {\n this.onMoveChange.emit(dropEvent);\n }\n this.onItemsChange.emit(dropEvent);\n }\n\n /**\n * Get the currently focused node\n */\n private getFocusedNode(): AXTreeViewNode | null {\n const focusedId = this.focusedNodeId();\n if (!focusedId) return null;\n return this.treeService.findNodeById(this.nodes(), focusedId, this.idField(), this.childrenField());\n }\n\n /**\n * Set focus to a node by ID\n */\n private focusNodeById(nodeId: string): void {\n this.focusedNodeId.set(nodeId);\n setTimeout(() => {\n const element = document.querySelector<HTMLElement>(`[data-tree-node-id=\"${nodeId}\"]`);\n if (element) {\n element.focus();\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n\n /**\n * Handle keyboard navigation keys\n */\n private handleNavigationKey(\n event: KeyboardEvent,\n flatList: AXTreeViewFlatNode[],\n currentIndex: number,\n currentFocused: AXTreeViewNode | null,\n ): { handled: boolean; shouldPreventDefault: boolean; targetIndex: number | null } {\n let targetIndex: number | null = currentIndex;\n let shouldPreventDefault = true;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetIndex = currentIndex - 1;\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowDown':\n if (currentIndex < flatList.length - 1) {\n targetIndex = currentIndex + 1;\n } else if (currentIndex === -1) {\n targetIndex = 0;\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowLeft':\n if (currentFocused) {\n if (this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n this.toggleNode(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n } else {\n const currentItem = flatList[currentIndex];\n if (currentItem?.parent) {\n targetIndex = flatList.findIndex(\n (item) => this.getNodeId(item.node) === this.getNodeId(currentItem.parent),\n );\n } else {\n shouldPreventDefault = false;\n }\n }\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'ArrowRight':\n if (currentFocused) {\n if (!this.getNodeExpanded(currentFocused) && this.shouldShowExpandToggle(currentFocused)) {\n this.toggleNode(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n } else if (\n this.getNodeExpanded(currentFocused) &&\n this.treeService.hasChildren(currentFocused, this.childrenField())\n ) {\n const children = this.getNodeChildren(currentFocused);\n if (children && children.length > 0) {\n const firstChild = children[0];\n targetIndex = flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(firstChild));\n if (targetIndex === -1) {\n const updatedFlatList = this.treeService.buildFlatNodeList(\n this.nodes(),\n this.hiddenField(),\n this.disabledField(),\n this.expandedField(),\n this.childrenField(),\n );\n targetIndex = updatedFlatList.findIndex(\n (item) => this.getNodeId(item.node) === this.getNodeId(firstChild),\n );\n if (targetIndex >= 0 && targetIndex < updatedFlatList.length) {\n this.focusNodeById(this.getNodeId(updatedFlatList[targetIndex].node));\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n }\n } else {\n shouldPreventDefault = false;\n }\n } else {\n shouldPreventDefault = false;\n }\n } else {\n shouldPreventDefault = false;\n }\n break;\n\n case 'Home':\n targetIndex = 0;\n break;\n\n case 'End':\n targetIndex = flatList.length - 1;\n break;\n\n case ' ':\n case 'Space':\n if (currentFocused && this.selectMode() !== 'none' && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleSpaceKeySelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n shouldPreventDefault = false;\n break;\n\n case 'Enter':\n if (currentFocused && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleEnterKeySelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n shouldPreventDefault = false;\n break;\n\n default:\n if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {\n if (currentFocused && this.selectMode() === 'multiple' && this.canSelectNode(currentFocused)) {\n event.preventDefault();\n this.handleCtrlEnterSelection(currentFocused, event);\n return { handled: true, shouldPreventDefault: true, targetIndex: null };\n }\n }\n handled = false;\n shouldPreventDefault = false;\n break;\n }\n\n return { handled, shouldPreventDefault, targetIndex };\n }\n\n /**\n * Handle Space key selection\n * In single mode: replaces selection (deselects all, selects this node)\n * In multiple mode: toggles selection\n */\n private handleSpaceKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n\n if (mode === 'single') {\n // Single mode: replace selection\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n } else {\n // Multiple mode: toggle selection\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle Enter key selection\n * In single mode: replaces selection (deselects all, selects this node)\n * In multiple mode: replaces selection (deselects all, selects this node and respects selectionBehavior)\n */\n private handleEnterKeySelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const mode = this.selectMode();\n\n // Enter key always replaces selection (deselects all first)\n this.treeService.deselectAllNodes(\n this.nodes(),\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n\n if (mode === 'multiple') {\n const children = this.getNodeChildren(node);\n // Respect selectionBehavior: cascade to children if enabled\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n true,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n // Respect selectionBehavior: update parent states if intermediate mode\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Handle Ctrl/Cmd + Enter key selection\n */\n private handleCtrlEnterSelection(node: AXTreeViewNode, event: KeyboardEvent): void {\n if (!this.canSelectNode(node)) return;\n\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(\n children,\n newValue,\n this.selectedField(),\n this.indeterminateField(),\n this.childrenField(),\n );\n }\n\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(\n this.nodes(),\n node,\n this.hasIntermediateState(),\n this.idField(),\n this.childrenField(),\n this.selectedField(),\n this.indeterminateField(),\n );\n }\n\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n nativeEvent: event,\n isUserInteraction: true,\n });\n this.emitSelectionChange();\n }\n\n /**\n * Type guard to check if value is an Event\n */\n private isEvent(value: unknown): value is Event {\n return value instanceof Event;\n }\n\n /**\n * Handle errors consistently\n */\n private handleError(message: string, error: unknown): void {\n if (error instanceof Error) {\n console.error(`${message}:`, error.message);\n } else {\n console.error(`${message}:`, error);\n }\n }\n}\n","<!-- Root loading skeleton -->\n@if (isLoading()) {\n <div class=\"ax-tree-view-drop-list\">\n @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n <div class=\"ax-tree-view-node\">\n <div class=\"ax-tree-view-node-content\">\n <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Root drop list -->\n<div\n axFocusTrap\n [axDropList]=\"dragBehavior() !== 'none'\"\n [sortingDisabled]=\"false\"\n [id]=\"getListId()\"\n [attr.data-node-id]=\"null\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event)\"\n class=\"ax-tree-view-drop-list\"\n [class.ax-tree-view-card]=\"look() === 'card'\"\n [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n [class.ax-tree-view-loading]=\"isLoading()\"\n role=\"group\"\n>\n @for (node of nodes(); track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(0)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n ⋮⋮\n </span>\n }\n <ax-button\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n @if (nodeTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n <div\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"getListId(parent)\"\n [attr.data-node-id]=\"getNodeId(parent)\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event, parent)\"\n class=\"ax-tree-view-drop-list\"\n role=\"group\"\n >\n @for (node of children; track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(level)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n ⋮⋮\n </span>\n }\n <ax-button\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n\n @if (nodeTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { AXTreeViewComponent } from './tree-view.component';\n\n@NgModule({\n imports: [AXTreeViewComponent],\n})\nexport class AXTreeViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|