@acorex/components 21.0.0-next.46 → 21.0.0-next.47

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":["../tmp-esm2022/tree-view/lib/tree-view.service.js","../tmp-esm2022/tree-view/lib/tree-view.component.js","../tmp-esm2022/tree-view/lib/tree-view.module.js","../tmp-esm2022/tree-view/acorex-components-tree-view.js"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as i0 from \"@angular/core\";\n/**\n * Service for tree node operations\n * Handles all business logic for tree node manipulation\n */\nexport class AXTreeViewService {\n // ==================== Constants ====================\n static { this.ROOT_LIST_ID = 'ax-tree-view-root-list'; }\n static { this.NODE_DROP_PREFIX = 'ax-tree-view-node-drop-'; }\n static { this.LIST_PREFIX = 'ax-tree-view-list-'; }\n // ==================== Node Finding & Traversal ====================\n /**\n * Find a node by ID in the tree\n */\n findNodeById(nodes, id, idField = 'id') {\n for (const node of nodes) {\n if (node[idField] === id)\n return node;\n const children = node['children'];\n if (children) {\n const found = this.findNodeById(children, id, idField);\n if (found)\n return found;\n }\n }\n return null;\n }\n /**\n * Find parent node of a given node\n */\n findParentNode(nodes, targetNode, idField = 'id', childrenField = 'children') {\n const targetId = targetNode[idField];\n for (const node of nodes) {\n const children = node[childrenField];\n if (children?.some((child) => child[idField] === targetId)) {\n return node;\n }\n if (children) {\n const found = this.findParentNode(children, targetNode, idField, childrenField);\n if (found)\n return found;\n }\n }\n return undefined;\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(movedNode, targetNode, idField = 'id', childrenField = 'children') {\n const movedId = movedNode[idField];\n const targetId = targetNode[idField];\n if (movedId === targetId || this.isNodeDescendantOf(targetNode, movedNode, idField, childrenField)) {\n return false;\n }\n return true;\n }\n /**\n * Check if targetNode is a descendant of ancestorNode\n */\n isNodeDescendantOf(targetNode, ancestorNode, idField = 'id', childrenField = 'children') {\n const targetId = targetNode[idField];\n const ancestorId = ancestorNode[idField];\n if (targetId === ancestorId) {\n return true;\n }\n const children = ancestorNode[childrenField];\n if (!children || children.length === 0) {\n return false;\n }\n for (const child of children) {\n const childId = child[idField];\n if (childId === targetId) {\n return true;\n }\n if (this.isNodeDescendantOf(targetNode, child, idField, childrenField)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Build a flat list of all visible focusable nodes\n */\n buildFlatNodeList(nodes, hiddenField = 'hidden', disabledField = 'disabled', expandedField = 'expanded', childrenField = 'children') {\n const flatList = [];\n const traverse = (nodeList, level, parent) => {\n for (const node of nodeList) {\n const hidden = node[hiddenField];\n const disabled = node[disabledField];\n if (hidden !== true && !disabled) {\n flatList.push({ node, level, parent });\n const expanded = node[expandedField];\n const children = node[childrenField];\n if (expanded && children) {\n traverse(children, level + 1, node);\n }\n }\n }\n };\n traverse(nodes, 0);\n return flatList;\n }\n // ==================== Node State Checks ====================\n /**\n * Check if node has children\n */\n hasChildren(node, childrenField = 'children') {\n const children = node[childrenField];\n return Boolean(children?.length);\n }\n /**\n * Check if node can be lazy loaded\n */\n canLazyLoad(node, isLazyDataSource, childrenCountField = 'childrenCount', childrenField = 'children') {\n const childrenCount = node[childrenCountField];\n return isLazyDataSource && Boolean(childrenCount && childrenCount > 0 && !this.hasChildren(node, childrenField));\n }\n // ==================== Selection Management ====================\n /**\n * Recursively select/deselect all children\n */\n selectAllChildren(children, selected, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const child of children) {\n child[selectedField] = selected;\n child[indeterminateField] = false;\n const childChildren = child[childrenField];\n if (childChildren) {\n this.selectAllChildren(childChildren, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Get selection state of children\n */\n getChildrenSelectionState(children, selectedField = 'selected', indeterminateField = 'indeterminate') {\n let selectedCount = 0;\n let indeterminateCount = 0;\n for (const child of children) {\n const selected = child[selectedField];\n const indeterminate = child[indeterminateField];\n if (selected && !indeterminate) {\n selectedCount++;\n }\n if (indeterminate) {\n indeterminateCount++;\n }\n }\n return {\n allSelected: selectedCount === children.length,\n someSelected: selectedCount > 0 || indeterminateCount > 0,\n };\n }\n /**\n * Update parent node states based on children selection (with intermediate state support)\n */\n updateParentStates(nodes, changedNode, intermediateState, idField = 'id', childrenField = 'children', selectedField = 'selected', indeterminateField = 'indeterminate') {\n const parent = this.findParentNode(nodes, changedNode, idField, childrenField);\n const parentChildren = parent?.[childrenField];\n if (!parent || !parentChildren)\n return;\n const { allSelected, someSelected } = this.getChildrenSelectionState(parentChildren, selectedField, indeterminateField);\n if (allSelected) {\n parent[selectedField] = true;\n parent[indeterminateField] = false;\n }\n else if (someSelected) {\n if (intermediateState) {\n parent[selectedField] = true;\n parent[indeterminateField] = true;\n }\n else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n }\n else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n this.updateParentStates(nodes, parent, intermediateState, idField, childrenField, selectedField, indeterminateField);\n }\n /**\n * Recursively deselect all nodes\n */\n deselectAllNodes(nodes, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const node of nodes) {\n node[selectedField] = false;\n node[indeterminateField] = false;\n const children = node[childrenField];\n if (children) {\n this.deselectAllNodes(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Recursively set selection state for all nodes\n */\n setAllSelection(nodes, selected, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const node of nodes) {\n node[selectedField] = selected;\n node[indeterminateField] = false;\n const children = node[childrenField];\n if (children) {\n this.setAllSelection(children, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Recursively count selected nodes\n */\n countSelected(nodes, selectedField = 'selected', childrenField = 'children') {\n let count = 0;\n for (const node of nodes) {\n if (node[selectedField])\n count++;\n const children = node[childrenField];\n if (children) {\n count += this.countSelected(children, selectedField, childrenField);\n }\n }\n return count;\n }\n /**\n * Recursively collect selected nodes\n */\n collectSelected(nodes, result, selectedField = 'selected', childrenField = 'children') {\n for (const node of nodes) {\n if (node[selectedField])\n result.push(node);\n const children = node[childrenField];\n if (children) {\n this.collectSelected(children, result, selectedField, childrenField);\n }\n }\n }\n /**\n * Recursively remove selected nodes\n */\n removeSelected(nodes, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n const selected = node[selectedField];\n const indeterminate = node[indeterminateField];\n if (selected && !indeterminate) {\n nodes.splice(i, 1);\n }\n else {\n const children = node[childrenField];\n if (children) {\n this.removeSelected(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n }\n /**\n * Recursively update all parent states in the tree (used after deletion)\n */\n updateAllParentStates(nodes, intermediateState, childrenField = 'children', selectedField = 'selected', indeterminateField = 'indeterminate') {\n for (const node of nodes) {\n const children = node[childrenField];\n if (children && children.length > 0) {\n this.updateAllParentStates(children, intermediateState, childrenField, selectedField, indeterminateField);\n const { allSelected, someSelected } = this.getChildrenSelectionState(children, selectedField, indeterminateField);\n if (allSelected) {\n node[selectedField] = true;\n node[indeterminateField] = false;\n }\n else if (someSelected) {\n if (intermediateState) {\n node[selectedField] = true;\n node[indeterminateField] = true;\n }\n else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n }\n }\n // ==================== Expansion Management ====================\n /**\n * Recursively set expanded state (with lazy loading)\n */\n async setExpandedState(nodes, expanded, isLazyDataSource, loadNodeChildren, expandedField = 'expanded', childrenField = 'children', childrenCountField = 'childrenCount') {\n for (const node of nodes) {\n const hasChildren = this.hasChildren(node, childrenField);\n const canLazyLoad = this.canLazyLoad(node, isLazyDataSource, childrenCountField, childrenField);\n if (hasChildren || canLazyLoad) {\n if (expanded && canLazyLoad) {\n await loadNodeChildren(node);\n }\n node[expandedField] = expanded;\n const children = node[childrenField];\n if (children) {\n await this.setExpandedState(children, expanded, isLazyDataSource, loadNodeChildren, expandedField, childrenField, childrenCountField);\n }\n }\n }\n }\n // ==================== Drag & Drop Helpers ====================\n /**\n * Get array reference by drop list ID\n */\n getArrayByListId(nodes, listId, idField = 'id', childrenField = 'children') {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return nodes;\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);\n return node ? [node] : null;\n }\n const nodeId = listId.replace(AXTreeViewService.LIST_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField);\n const children = node?.[childrenField];\n return children ?? null;\n }\n /**\n * Find parent node by list ID\n */\n findParentByListId(nodes, listId, idField = 'id') {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return undefined;\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) ?? undefined;\n }\n /**\n * Generate unique list ID for each node\n */\n getListId(node, idField = 'id') {\n if (!node)\n return AXTreeViewService.ROOT_LIST_ID;\n const nodeId = node[idField];\n return `${AXTreeViewService.LIST_PREFIX}${nodeId}`;\n }\n /**\n * Get root list ID constant\n */\n getRootListId() {\n return AXTreeViewService.ROOT_LIST_ID;\n }\n /**\n * Get node drop prefix constant\n */\n getNodeDropPrefix() {\n return AXTreeViewService.NODE_DROP_PREFIX;\n }\n /**\n * Get list prefix constant\n */\n getListPrefix() {\n return AXTreeViewService.LIST_PREFIX;\n }\n // ==================== Node Utilities ====================\n /**\n * Get all nodes in a flat array\n */\n getAllNodes(nodes, childrenField = 'children') {\n const allNodes = [];\n const traverse = (nodeList) => {\n for (const node of nodeList) {\n allNodes.push(node);\n const children = node[childrenField];\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(nodes);\n return allNodes;\n }\n /**\n * Get the path to a node (array of parent nodes from root to node)\n */\n getNodePath(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const path = [];\n const node = this.findNodeById(nodes, nodeId, idField);\n if (!node) {\n return path;\n }\n let current = node;\n while (current) {\n path.unshift(current);\n const parent = this.findParentNode(nodes, current, idField, childrenField);\n current = parent ?? null;\n }\n return path;\n }\n /**\n * Get the level/depth of a node (0 = root level)\n */\n getNodeLevel(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const path = this.getNodePath(nodes, nodeId, idField, childrenField);\n return path.length > 0 ? path.length - 1 : -1;\n }\n /**\n * Get sibling nodes of a given node\n */\n getSiblings(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const node = this.findNodeById(nodes, nodeId, idField);\n if (!node) {\n return [];\n }\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const siblingsArray = parent?.[childrenField] ?? nodes;\n return siblingsArray.filter((n) => n[idField] !== nodeId);\n }\n /**\n * Clone a node (creates a deep copy)\n */\n cloneNode(node, idField = 'id', titleField = 'title', tooltipField = 'tooltip', iconField = 'icon', expandedField = 'expanded', selectedField = 'selected', indeterminateField = 'indeterminate', disabledField = 'disabled', hiddenField = 'hidden', childrenCountField = 'childrenCount', dataField = 'data', childrenField = 'children') {\n const cloned = {\n [idField]: `${node[idField]}-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 const children = node[childrenField];\n if (children && children.length > 0) {\n cloned[childrenField] = children.map((child) => this.cloneNode(child, idField, titleField, tooltipField, iconField, expandedField, selectedField, indeterminateField, disabledField, hiddenField, childrenCountField, dataField, childrenField));\n cloned[childrenCountField] = cloned[childrenField].length;\n }\n return cloned;\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(nodes, nodeId, newParentId, index, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount', expandedField = 'expanded') {\n const node = this.findNodeById(nodes, nodeId, idField);\n if (!node) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n // Find current parent\n const currentParent = this.findParentNode(nodes, node, idField, childrenField);\n const currentParentChildren = currentParent\n ? currentParent[childrenField]\n : undefined;\n const currentArray = currentParentChildren ?? nodes;\n // Find and remove from current location\n const currentIndex = currentArray.findIndex((n) => n[idField] === nodeId);\n if (currentIndex === -1) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n const movedNode = currentArray.splice(currentIndex, 1)[0];\n // Find new parent\n let targetArray;\n let newParent;\n if (newParentId) {\n newParent = this.findNodeById(nodes, newParentId, idField);\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 // 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 let newParentChildren = newParent[childrenField];\n if (!newParentChildren) {\n newParentChildren = [];\n newParent[childrenField] = newParentChildren;\n }\n targetArray = newParentChildren;\n }\n else {\n targetArray = nodes;\n }\n // Calculate new index before inserting\n const newIndex = index !== undefined && index >= 0 && index <= targetArray.length ? index : targetArray.length;\n // Insert at new location\n if (index !== undefined && index >= 0 && index <= targetArray.length) {\n targetArray.splice(index, 0, movedNode);\n }\n else {\n targetArray.push(movedNode);\n }\n // Update childrenCount\n if (currentParent) {\n const updatedChildren = currentParent[childrenField];\n currentParent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n if (newParent) {\n const updatedChildren = newParent[childrenField];\n newParent[childrenCountField] = updatedChildren?.length ?? 0;\n newParent[expandedField] = true; // Auto-expand new parent\n }\n return {\n success: true,\n movedNode,\n previousParent: currentParent,\n newParent,\n previousIndex: currentIndex,\n currentIndex: newIndex,\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(nodes, nodeId, updates, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount') {\n const node = this.findNodeById(nodes, nodeId, idField);\n if (!node) {\n return null;\n }\n // Update node properties\n Object.assign(node, updates);\n // If children array is provided, ensure it exists and update childrenCount\n if (updates[childrenField] !== undefined) {\n const children = updates[childrenField];\n node[childrenField] = children;\n node[childrenCountField] = children?.length;\n }\n return node;\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(nodes, parentId, childNode, index, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount', expandedField = 'expanded') {\n const parent = this.findNodeById(nodes, parentId, idField);\n if (!parent) {\n return null;\n }\n // Ensure children array exists\n let children = parent[childrenField];\n if (!children) {\n children = [];\n parent[childrenField] = children;\n }\n // Insert or append child\n if (index !== undefined && index >= 0 && index <= children.length) {\n children.splice(index, 0, childNode);\n }\n else {\n children.push(childNode);\n }\n // Update childrenCount\n parent[childrenCountField] = children.length;\n // Auto-expand parent if it was collapsed\n if (!parent[expandedField]) {\n parent[expandedField] = true;\n }\n return parent;\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(nodes, nodeId, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount') {\n const node = this.findNodeById(nodes, nodeId, idField);\n if (!node) {\n return null;\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] : undefined;\n const targetArray = parentChildren ?? nodes;\n // Find and remove the node\n const index = targetArray.findIndex((n) => n[idField] === nodeId);\n if (index !== -1) {\n const removed = targetArray.splice(index, 1)[0];\n // Update parent's childrenCount if it exists\n if (parent) {\n const updatedChildren = parent[childrenField];\n parent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n return removed;\n }\n return null;\n }\n /**\n * Validate node structure (check for required fields and circular references)\n */\n validateNode(node, visitedIds = new Set(), idField = 'id', titleField = 'title', childrenField = 'children', childrenCountField = 'childrenCount') {\n const errors = [];\n const nodeId = node[idField];\n const nodeTitle = node[titleField];\n if (!nodeId) {\n errors.push(`Node must have an ${idField}`);\n }\n if (!nodeTitle) {\n errors.push(`Node must have a ${titleField}`);\n }\n if (nodeId && visitedIds.has(nodeId)) {\n errors.push(`Circular reference detected: node ${nodeId} appears multiple times in the tree`);\n }\n const children = node[childrenField];\n if (children) {\n const newVisited = new Set(visitedIds);\n if (nodeId) {\n newVisited.add(nodeId);\n }\n for (const child of children) {\n const childValidation = this.validateNode(child, newVisited, idField, titleField, childrenField, childrenCountField);\n if (!childValidation.valid) {\n errors.push(...childValidation.errors.map((e) => `Child of ${nodeId}: ${e}`));\n }\n }\n const childrenCount = node[childrenCountField];\n if (childrenCount !== undefined && childrenCount !== children.length) {\n errors.push(`Node ${nodeId}: ${childrenCountField} (${childrenCount}) does not match ${childrenField} array length (${children.length})`);\n }\n }\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL3RyZWUtdmlldy9zcmMvbGliL3RyZWUtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDOzs7R0FHRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsc0RBQXNEO2FBQzlCLGlCQUFZLEdBQUcsd0JBQXdCLEFBQTNCLENBQTRCO2FBQ3hDLHFCQUFnQixHQUFHLHlCQUF5QixBQUE1QixDQUE2QjthQUM3QyxnQkFBVyxHQUFHLG9CQUFvQixBQUF2QixDQUF3QjtJQUUzRCxxRUFBcUU7SUFDckU7O09BRUc7SUFDSCxZQUFZLENBQUMsS0FBdUIsRUFBRSxFQUFVLEVBQUUsT0FBTyxHQUFHLElBQUk7UUFDOUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFLLElBQUksQ0FBQyxPQUFPLENBQVksS0FBSyxFQUFFO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQWlDLENBQUM7WUFDbEUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUNaLEtBQXVCLEVBQ3ZCLFVBQTBCLEVBQzFCLE9BQU8sR0FBRyxJQUFJLEVBQ2QsYUFBYSxHQUFHLFVBQVU7UUFFMUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxD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QUFhLGtCQUFrQixRQUFRLENBQUMsTUFBTSxHQUFHLENBQzdILENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFCLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQzs4R0E5NEJVLGlCQUFpQjtrSEFBakIsaUJBQWlCOzsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhUcmVlVmlld0NoaWxkcmVuU2VsZWN0aW9uU3RhdGUsIEFYVHJlZVZpZXdGbGF0Tm9kZSwgQVhUcmVlVmlld05vZGUgfSBmcm9tICcuL3RyZWUtdmlldy50eXBlcyc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgdHJlZSBub2RlIG9wZXJhdGlvbnNcbiAqIEhhbmRsZXMgYWxsIGJ1c2luZXNzIGxvZ2ljIGZvciB0cmVlIG5vZGUgbWFuaXB1bGF0aW9uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBWFRyZWVWaWV3U2VydmljZSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09IENvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBST09UX0xJU1RfSUQgPSAnYXgtdHJlZS12aWV3LXJvb3QtbGlzdCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5PREVfRFJPUF9QUkVGSVggPSAnYXgtdHJlZS12aWV3LW5vZGUtZHJvcC0nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMSVNUX1BSRUZJWCA9ICdheC10cmVlLXZpZXctbGlzdC0nO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IE5vZGUgRmluZGluZyAmIFRyYXZlcnNhbCA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogRmluZCBhIG5vZGUgYnkgSUQgaW4gdGhlIHRyZWVcbiAgICovXG4gIGZpbmROb2RlQnlJZChub2RlczogQVhUcmVlVmlld05vZGVbXSwgaWQ6IHN0cmluZywgaWRGaWVsZCA9ICdpZCcpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKChub2RlW2lkRmllbGRdIGFzIHN0cmluZykgPT09IGlkKSByZXR1cm4gbm9kZTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVsnY2hpbGRyZW4nXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTm9kZUJ5SWQoY2hpbGRyZW4sIGlkLCBpZEZpZWxkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgcGFyZW50IG5vZGUgb2YgYSBnaXZlbiBub2RlXG4gICAqL1xuICBmaW5kUGFyZW50Tm9kZShcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICB0YXJnZXROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRhcmdldElkID0gdGFyZ2V0Tm9kZVtpZEZpZWxkXSBhcyBzdHJpbmc7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZHJlbj8uc29tZSgoY2hpbGQpID0+IChjaGlsZFtpZEZpZWxkXSBhcyBzdHJpbmcpID09PSB0YXJnZXRJZCkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKGNoaWxkcmVuLCB0YXJnZXROb2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGFyZ2V0Tm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgYW5jZXN0b3JOb2RlIChvciB0aGUgc2FtZSBub2RlKVxuICAgKiBQcmV2ZW50cyBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGNoZWNraW5nIGlmIHRhcmdldCBleGlzdHMgaW4gYW5jZXN0b3IncyBjaGlsZHJlbiB0cmVlXG4gICAqL1xuICBpc1ZhbGlkRHJvcFRhcmdldChcbiAgICBtb3ZlZE5vZGU6IEFYVHJlZVZpZXdOb2RlLFxuICAgIHRhcmdldE5vZGU6IEFYVHJlZVZpZXdOb2RlLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBtb3ZlZElkID0gbW92ZWROb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBjb25zdCB0YXJnZXRJZCA9IHRhcmdldE5vZGVbaWRGaWVsZF0gYXMgc3RyaW5nO1xuICAgIGlmIChtb3ZlZElkID09PSB0YXJnZXRJZCB8fCB0aGlzLmlzTm9kZURlc2NlbmRhbnRPZih0YXJnZXROb2RlLCBtb3ZlZE5vZGUsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcmdldE5vZGUgaXMgYSBkZXNjZW5kYW50IG9mIGFuY2VzdG9yTm9kZVxuICAgKi9cbiAgcHJpdmF0ZSBpc05vZGVEZXNjZW5kYW50T2YoXG4gICAgdGFyZ2V0Tm9kZTogQVhUcmVlVmlld05vZGUsXG4gICAgYW5jZXN0b3JOb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSB0YXJnZXROb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBjb25zdCBhbmNlc3RvcklkID0gYW5jZXN0b3JOb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBpZiAodGFyZ2V0SWQgPT09IGFuY2VzdG9ySWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gYW5jZXN0b3JOb2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZElkID0gY2hpbGRbaWRGaWVsZF0gYXMgc3RyaW5nO1xuICAgICAgaWYgKGNoaWxkSWQgPT09IHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNOb2RlRGVzY2VuZGFudE9mKHRhcmdldE5vZGUsIGNoaWxkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBmbGF0IGxpc3Qgb2YgYWxsIHZpc2libGUgZm9jdXNhYmxlIG5vZGVzXG4gICAqL1xuICBidWlsZEZsYXROb2RlTGlzdChcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBoaWRkZW5GaWVsZCA9ICdoaWRkZW4nLFxuICAgIGRpc2FibGVkRmllbGQgPSAnZGlzYWJsZWQnLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiBBWFRyZWVWaWV3RmxhdE5vZGVbXSB7XG4gICAgY29uc3QgZmxhdExpc3Q6IEFYVHJlZVZpZXdGbGF0Tm9kZVtdID0gW107XG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZUxpc3Q6IEFYVHJlZVZpZXdOb2RlW10sIGxldmVsOiBudW1iZXIsIHBhcmVudD86IEFYVHJlZVZpZXdOb2RlKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZUxpc3QpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gbm9kZVtoaWRkZW5GaWVsZF0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBub2RlW2Rpc2FibGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChoaWRkZW4gIT09IHRydWUgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgZmxhdExpc3QucHVzaCh7IG5vZGUsIGxldmVsLCBwYXJlbnQgfSk7XG4gICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBub2RlW2V4cGFuZGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGV4cGFuZGVkICYmIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRyYXZlcnNlKG5vZGVzLCAwKTtcbiAgICByZXR1cm4gZmxhdExpc3Q7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBOb2RlIFN0YXRlIENoZWNrcyA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogQ2hlY2sgaWYgbm9kZSBoYXMgY2hpbGRyZW5cbiAgICovXG4gIGhhc0NoaWxkcmVuKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkcmVuPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5vZGUgY2FuIGJlIGxhenkgbG9hZGVkXG4gICAqL1xuICBjYW5MYXp5TG9hZChcbiAgICBub2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpc0xhenlEYXRhU291cmNlOiBib29sZWFuLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hpbGRyZW5Db3VudCA9IG5vZGVbY2hpbGRyZW5Db3VudEZpZWxkXSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzTGF6eURhdGFTb3VyY2UgJiYgQm9vbGVhbihjaGlsZHJlbkNvdW50ICYmIGNoaWxkcmVuQ291bnQgPiAwICYmICF0aGlzLmhhc0NoaWxkcmVuKG5vZGUsIGNoaWxkcmVuRmllbGQpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbiBNYW5hZ2VtZW50ID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBzZWxlY3QvZGVzZWxlY3QgYWxsIGNoaWxkcmVuXG4gICAqL1xuICBzZWxlY3RBbGxDaGlsZHJlbihcbiAgICBjaGlsZHJlbjogQVhUcmVlVmlld05vZGVbXSxcbiAgICBzZWxlY3RlZDogYm9vbGVhbixcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkW3NlbGVjdGVkRmllbGRdID0gc2VsZWN0ZWQ7XG4gICAgICBjaGlsZFtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICBjb25zdCBjaGlsZENoaWxkcmVuID0gY2hpbGRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZENoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hpbGRyZW4oY2hpbGRDaGlsZHJlbiwgc2VsZWN0ZWQsIHNlbGVjdGVkRmllbGQsIGluZGV0ZXJtaW5hdGVGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3Rpb24gc3RhdGUgb2YgY2hpbGRyZW5cbiAgICovXG4gIGdldENoaWxkcmVuU2VsZWN0aW9uU3RhdGUoXG4gICAgY2hpbGRyZW46IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICApOiBBWFRyZWVWaWV3Q2hpbGRyZW5TZWxlY3Rpb25TdGF0ZSB7XG4gICAgbGV0IHNlbGVjdGVkQ291bnQgPSAwO1xuICAgIGxldCBpbmRldGVybWluYXRlQ291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjaGlsZFtzZWxlY3RlZEZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5kZXRlcm1pbmF0ZSA9IGNoaWxkW2luZGV0ZXJtaW5hdGVGaWVsZF0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiAhaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBzZWxlY3RlZENvdW50Kys7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBpbmRldGVybWluYXRlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsU2VsZWN0ZWQ6IHNlbGVjdGVkQ291bnQgPT09IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHNvbWVTZWxlY3RlZDogc2VsZWN0ZWRDb3VudCA+IDAgfHwgaW5kZXRlcm1pbmF0ZUNvdW50ID4gMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwYXJlbnQgbm9kZSBzdGF0ZXMgYmFzZWQgb24gY2hpbGRyZW4gc2VsZWN0aW9uICh3aXRoIGludGVybWVkaWF0ZSBzdGF0ZSBzdXBwb3J0KVxuICAgKi9cbiAgdXBkYXRlUGFyZW50U3RhdGVzKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIGNoYW5nZWROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpbnRlcm1lZGlhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZmluZFBhcmVudE5vZGUobm9kZXMsIGNoYW5nZWROb2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBwYXJlbnRDaGlsZHJlbiA9IHBhcmVudD8uW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudENoaWxkcmVuKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGFsbFNlbGVjdGVkLCBzb21lU2VsZWN0ZWQgfSA9IHRoaXMuZ2V0Q2hpbGRyZW5TZWxlY3Rpb25TdGF0ZShcbiAgICAgIHBhcmVudENoaWxkcmVuLFxuICAgICAgc2VsZWN0ZWRGaWVsZCxcbiAgICAgIGluZGV0ZXJtaW5hdGVGaWVsZCxcbiAgICApO1xuXG4gICAgaWYgKGFsbFNlbGVjdGVkKSB7XG4gICAgICBwYXJlbnRbc2VsZWN0ZWRGaWVsZF0gPSB0cnVlO1xuICAgICAgcGFyZW50W2luZGV0ZXJtaW5hdGVGaWVsZF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHNvbWVTZWxlY3RlZCkge1xuICAgICAgaWYgKGludGVybWVkaWF0ZVN0YXRlKSB7XG4gICAgICAgIHBhcmVudFtzZWxlY3RlZEZpZWxkXSA9IHRydWU7XG4gICAgICAgIHBhcmVudFtpbmRldGVybWluYXRlRmllbGRdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudFtzZWxlY3RlZEZpZWxkXSA9IGZhbHNlO1xuICAgICAgICBwYXJlbnRbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRbc2VsZWN0ZWRGaWVsZF0gPSBmYWxzZTtcbiAgICAgIHBhcmVudFtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICBub2RlcyxcbiAgICAgIHBhcmVudCxcbiAgICAgIGludGVybWVkaWF0ZVN0YXRlLFxuICAgICAgaWRGaWVsZCxcbiAgICAgIGNoaWxkcmVuRmllbGQsXG4gICAgICBzZWxlY3RlZEZpZWxkLFxuICAgICAgaW5kZXRlcm1pbmF0ZUZpZWxkLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZGVzZWxlY3QgYWxsIG5vZGVzXG4gICAqL1xuICBkZXNlbGVjdEFsbE5vZGVzKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGluZGV0ZXJtaW5hdGVGaWVsZCA9ICdpbmRldGVybWluYXRlJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gZmFsc2U7XG4gICAgICBub2RlW2luZGV0ZXJtaW5hdGVGaWVsZF0gPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuZGVzZWxlY3RBbGxOb2RlcyhjaGlsZHJlbiwgc2VsZWN0ZWRGaWVsZCwgaW5kZXRlcm1pbmF0ZUZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgc2V0IHNlbGVjdGlvbiBzdGF0ZSBmb3IgYWxsIG5vZGVzXG4gICAqL1xuICBzZXRBbGxTZWxlY3Rpb24oXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIG5vZGVbc2VsZWN0ZWRGaWVsZF0gPSBzZWxlY3RlZDtcbiAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5zZXRBbGxTZWxlY3Rpb24oY2hpbGRyZW4sIHNlbGVjdGVkLCBzZWxlY3RlZEZpZWxkLCBpbmRldGVybWluYXRlRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb3VudCBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgY291bnRTZWxlY3RlZChub2RlczogQVhUcmVlVmlld05vZGVbXSwgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVbc2VsZWN0ZWRGaWVsZF0gYXMgYm9vbGVhbikgY291bnQrKztcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvdW50ICs9IHRoaXMuY291bnRTZWxlY3RlZChjaGlsZHJlbiwgc2VsZWN0ZWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb2xsZWN0IHNlbGVjdGVkIG5vZGVzXG4gICAqL1xuICBjb2xsZWN0U2VsZWN0ZWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgcmVzdWx0OiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmIChub2RlW3NlbGVjdGVkRmllbGRdIGFzIGJvb2xlYW4pIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0U2VsZWN0ZWQoY2hpbGRyZW4sIHJlc3VsdCwgc2VsZWN0ZWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlbW92ZSBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgcmVtb3ZlU2VsZWN0ZWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gbm9kZVtzZWxlY3RlZEZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5kZXRlcm1pbmF0ZSA9IG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHNlbGVjdGVkICYmICFpbmRldGVybWluYXRlKSB7XG4gICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKGNoaWxkcmVuLCBzZWxlY3RlZEZpZWxkLCBpbmRldGVybWluYXRlRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHVwZGF0ZSBhbGwgcGFyZW50IHN0YXRlcyBpbiB0aGUgdHJlZSAodXNlZCBhZnRlciBkZWxldGlvbilcbiAgICovXG4gIHVwZGF0ZUFsbFBhcmVudFN0YXRlcyhcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBpbnRlcm1lZGlhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbFBhcmVudFN0YXRlcyhjaGlsZHJlbiwgaW50ZXJtZWRpYXRlU3RhdGUsIGNoaWxkcmVuRmllbGQsIHNlbGVjdGVkRmllbGQsIGluZGV0ZXJtaW5hdGVGaWVsZCk7XG5cbiAgICAgICAgY29uc3QgeyBhbGxTZWxlY3RlZCwgc29tZVNlbGVjdGVkIH0gPSB0aGlzLmdldENoaWxkcmVuU2VsZWN0aW9uU3RhdGUoXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgc2VsZWN0ZWRGaWVsZCxcbiAgICAgICAgICBpbmRldGVybWluYXRlRmllbGQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgbm9kZVtzZWxlY3RlZEZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgbm9kZVtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc29tZVNlbGVjdGVkKSB7XG4gICAgICAgICAgaWYgKGludGVybWVkaWF0ZVN0YXRlKSB7XG4gICAgICAgICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVbc2VsZWN0ZWRGaWVsZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gZmFsc2U7XG4gICAgICAgICAgbm9kZVtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBFeHBhbnNpb24gTWFuYWdlbWVudCA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgc2V0IGV4cGFuZGVkIHN0YXRlICh3aXRoIGxhenkgbG9hZGluZylcbiAgICovXG4gIGFzeW5jIHNldEV4cGFuZGVkU3RhdGUoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgZXhwYW5kZWQ6IGJvb2xlYW4sXG4gICAgaXNMYXp5RGF0YVNvdXJjZTogYm9vbGVhbixcbiAgICBsb2FkTm9kZUNoaWxkcmVuOiAobm9kZTogQVhUcmVlVmlld05vZGUpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZXhwYW5kZWRGaWVsZCA9ICdleHBhbmRlZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gdGhpcy5oYXNDaGlsZHJlbihub2RlLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy5jYW5MYXp5TG9hZChub2RlLCBpc0xhenlEYXRhU291cmNlLCBjaGlsZHJlbkNvdW50RmllbGQsIGNoaWxkcmVuRmllbGQpO1xuXG4gICAgICBpZiAoaGFzQ2hpbGRyZW4gfHwgY2FuTGF6eUxvYWQpIHtcbiAgICAgICAgaWYgKGV4cGFuZGVkICYmIGNhbkxhenlMb2FkKSB7XG4gICAgICAgICAgYXdhaXQgbG9hZE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlW2V4cGFuZGVkRmllbGRdID0gZXhwYW5kZWQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEV4cGFuZGVkU3RhdGUoXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGV4cGFuZGVkLFxuICAgICAgICAgICAgaXNMYXp5RGF0YVNvdXJjZSxcbiAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4sXG4gICAgICAgICAgICBleHBhbmRlZEZpZWxkLFxuICAgICAgICAgICAgY2hpbGRyZW5GaWVsZCxcbiAgICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRHJhZyAmIERyb3AgSGVscGVycyA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogR2V0IGFycmF5IHJlZmVyZW5jZSBieSBkcm9wIGxpc3QgSURcbiAgICovXG4gIGdldEFycmF5QnlMaXN0SWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgbGlzdElkOiBzdHJpbmcsXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IEFYVHJlZVZpZXdOb2RlW10gfCBudWxsIHtcbiAgICBpZiAobGlzdElkID09PSBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQpIHtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBpZiAobGlzdElkLnN0YXJ0c1dpdGgoQVhUcmVlVmlld1NlcnZpY2UuTk9ERV9EUk9QX1BSRUZJWCkpIHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IGxpc3RJZC5yZXBsYWNlKEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVgsICcnKTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkKTtcbiAgICAgIHJldHVybiBub2RlID8gW25vZGVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlSWQgPSBsaXN0SWQucmVwbGFjZShBWFRyZWVWaWV3U2VydmljZS5MSVNUX1BSRUZJWCwgJycpO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGU/LltjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBjaGlsZHJlbiA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgcGFyZW50IG5vZGUgYnkgbGlzdCBJRFxuICAgKi9cbiAgZmluZFBhcmVudEJ5TGlzdElkKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLCBsaXN0SWQ6IHN0cmluZywgaWRGaWVsZCA9ICdpZCcpOiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGxpc3RJZCA9PT0gQVhUcmVlVmlld1NlcnZpY2UuUk9PVF9MSVNUX0lEKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGxpc3RJZC5zdGFydHNXaXRoKEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVgpXG4gICAgICA/IEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVhcbiAgICAgIDogQVhUcmVlVmlld1NlcnZpY2UuTElTVF9QUkVGSVg7XG4gICAgY29uc3Qgbm9kZUlkID0gbGlzdElkLnJlcGxhY2UocHJlZml4LCAnJyk7XG4gICAgcmV0dXJuIHRoaXMuZmluZE5vZGVCeUlkKG5vZGVzLCBub2RlSWQsIGlkRmllbGQpID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgbGlzdCBJRCBmb3IgZWFjaCBub2RlXG4gICAqL1xuICBnZXRMaXN0SWQobm9kZTogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQsIGlkRmllbGQgPSAnaWQnKTogc3RyaW5nIHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQ7XG4gICAgY29uc3Qgbm9kZUlkID0gbm9kZVtpZEZpZWxkXSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIGAke0FYVHJlZVZpZXdTZXJ2aWNlLkxJU1RfUFJFRklYfSR7bm9kZUlkfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvb3QgbGlzdCBJRCBjb25zdGFudFxuICAgKi9cbiAgZ2V0Um9vdExpc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgZHJvcCBwcmVmaXggY29uc3RhbnRcbiAgICovXG4gIGdldE5vZGVEcm9wUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3QgcHJlZml4IGNvbnN0YW50XG4gICAqL1xuICBnZXRMaXN0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFYVHJlZVZpZXdTZXJ2aWNlLkxJU1RfUFJFRklYO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTm9kZSBVdGlsaXRpZXMgPT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEdldCBhbGwgbm9kZXMgaW4gYSBmbGF0IGFycmF5XG4gICAqL1xuICBnZXRBbGxOb2Rlcyhub2RlczogQVhUcmVlVmlld05vZGVbXSwgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicpOiBBWFRyZWVWaWV3Tm9kZVtdIHtcbiAgICBjb25zdCBhbGxOb2RlczogQVhUcmVlVmlld05vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVMaXN0OiBBWFRyZWVWaWV3Tm9kZVtdKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZUxpc3QpIHtcbiAgICAgICAgYWxsTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgIHRyYXZlcnNlKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdHJhdmVyc2Uobm9kZXMpO1xuICAgIHJldHVybiBhbGxOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhdGggdG8gYSBub2RlIChhcnJheSBvZiBwYXJlbnQgbm9kZXMgZnJvbSByb290IHRvIG5vZGUpXG4gICAqL1xuICBnZXROb2RlUGF0aChub2RlczogQVhUcmVlVmlld05vZGVbXSwgbm9kZUlkOiBzdHJpbmcsIGlkRmllbGQgPSAnaWQnLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIGNvbnN0IHBhdGg6IEFYVHJlZVZpZXdOb2RlW10gPSBbXTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudDogQVhUcmVlVmlld05vZGUgfCBudWxsID0gbm9kZTtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgcGF0aC51bnNoaWZ0KGN1cnJlbnQpO1xuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50Tm9kZShub2RlcywgY3VycmVudCwgaWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICBjdXJyZW50ID0gcGFyZW50ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsZXZlbC9kZXB0aCBvZiBhIG5vZGUgKDAgPSByb290IGxldmVsKVxuICAgKi9cbiAgZ2V0Tm9kZUxldmVsKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLCBub2RlSWQ6IHN0cmluZywgaWRGaWVsZCA9ICdpZCcsIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXROb2RlUGF0aChub2Rlcywgbm9kZUlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gcGF0aC5sZW5ndGggLSAxIDogLTE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpYmxpbmcgbm9kZXMgb2YgYSBnaXZlbiBub2RlXG4gICAqL1xuICBnZXRTaWJsaW5ncyhub2RlczogQVhUcmVlVmlld05vZGVbXSwgbm9kZUlkOiBzdHJpbmcsIGlkRmllbGQgPSAnaWQnLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBzaWJsaW5nc0FycmF5ID0gKHBhcmVudD8uW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQpID8/IG5vZGVzO1xuXG4gICAgcmV0dXJuIHNpYmxpbmdzQXJyYXkuZmlsdGVyKChuKSA9PiAobltpZEZpZWxkXSBhcyBzdHJpbmcpICE9PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb25lIGEgbm9kZSAoY3JlYXRlcyBhIGRlZXAgY29weSlcbiAgICovXG4gIGNsb25lTm9kZShcbiAgICBub2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICB0aXRsZUZpZWxkID0gJ3RpdGxlJyxcbiAgICB0b29sdGlwRmllbGQgPSAndG9vbHRpcCcsXG4gICAgaWNvbkZpZWxkID0gJ2ljb24nLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGluZGV0ZXJtaW5hdGVGaWVsZCA9ICdpbmRldGVybWluYXRlJyxcbiAgICBkaXNhYmxlZEZpZWxkID0gJ2Rpc2FibGVkJyxcbiAgICBoaWRkZW5GaWVsZCA9ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBkYXRhRmllbGQgPSAnZGF0YScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IEFYVHJlZVZpZXdOb2RlIHtcbiAgICBjb25zdCBjbG9uZWQ6IEFYVHJlZVZpZXdOb2RlID0ge1xuICAgICAgW2lkRmllbGRdOiBgJHtub2RlW2lkRmllbGRdIGFzIHN0cmluZ30tY2xvbmUtJHtEYXRlLm5vdygpfWAsXG4gICAgICBbdGl0bGVGaWVsZF06IG5vZGVbdGl0bGVGaWVsZF0sXG4gICAgICBbdG9vbHRpcEZpZWxkXTogbm9kZVt0b29sdGlwRmllbGRdLFxuICAgICAgW2ljb25GaWVsZF06IG5vZGVbaWNvbkZpZWxkXSxcbiAgICAgIFtleHBhbmRlZEZpZWxkXTogbm9kZVtleHBhbmRlZEZpZWxkXSxcbiAgICAgIFtzZWxlY3RlZEZpZWxkXTogZmFsc2UsIC8vIENsb25lZCBub2RlcyBhcmUgbm90IHNlbGVjdGVkIGJ5IGRlZmF1bHRcbiAgICAgIFtpbmRldGVybWluYXRlRmllbGRdOiBmYWxzZSxcbiAgICAgIFtkaXNhYmxlZEZpZWxkXTogbm9kZVtkaXNhYmxlZEZpZWxkXSxcbiAgICAgIFtoaWRkZW5GaWVsZF06IG5vZGVbaGlkZGVuRmllbGRdLFxuICAgICAgW2NoaWxkcmVuQ291bnRGaWVsZF06IG5vZGVbY2hpbGRyZW5Db3VudEZpZWxkXSxcbiAgICAgIFtkYXRhRmllbGRdOiBub2RlW2RhdGFGaWVsZF0gPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vZGVbZGF0YUZpZWxkXSkpIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY2xvbmVkW2NoaWxkcmVuRmllbGRdID0gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT5cbiAgICAgICAgdGhpcy5jbG9uZU5vZGUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgaWRGaWVsZCxcbiAgICAgICAgICB0aXRsZUZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBGaWVsZCxcbiAgICAgICAgICBpY29uRmllbGQsXG4gICAgICAgICAgZXhwYW5kZWRGaWVsZCxcbiAgICAgICAgICBzZWxlY3RlZEZpZWxkLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGVGaWVsZCxcbiAgICAgICAgICBkaXNhYmxlZEZpZWxkLFxuICAgICAgICAgIGhpZGRlbkZpZWxkLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgICBkYXRhRmllbGQsXG4gICAgICAgICAgY2hpbGRyZW5GaWVsZCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBjbG9uZWRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IChjbG9uZWRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBOb2RlIE1hbmlwdWxhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogTW92ZSBhIG5vZGUgdG8gYSBuZXcgcGFyZW50IGluIHRoZSB0cmVlXG4gICAqIEBwYXJhbSBub2RlcyAtIFJvb3Qgbm9kZXMgYXJyYXlcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBtb3ZlXG4gICAqIEBwYXJhbSBuZXdQYXJlbnRJZCAtIFRoZSBJRCBvZiB0aGUgbmV3IHBhcmVudCAodW5kZWZpbmVkIGZvciByb290IGxldmVsKVxuICAgKiBAcGFyYW0gaW5kZXggLSBPcHRpb25hbCBpbmRleCB0byBpbnNlcnQgYXQgKGRlZmF1bHQ6IGFwcGVuZCB0byBlbmQpXG4gICAqIEBwYXJhbSBpZEZpZWxkIC0gRmllbGQgbmFtZSBmb3Igbm9kZSBJRFxuICAgKiBAcGFyYW0gY2hpbGRyZW5GaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGFycmF5XG4gICAqIEBwYXJhbSBjaGlsZHJlbkNvdW50RmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBjb3VudFxuICAgKiBAcGFyYW0gZXhwYW5kZWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGV4cGFuZGVkIHN0YXRlXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLCBtb3ZlZCBub2RlLCBwcmV2aW91cyBwYXJlbnQsIG5ldyBwYXJlbnQsIGFuZCBpbmRpY2VzXG4gICAqL1xuICBtb3ZlTm9kZShcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICApOiB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtb3ZlZE5vZGU/OiBBWFRyZWVWaWV3Tm9kZTtcbiAgICBwcmV2aW91c1BhcmVudD86IEFYVHJlZVZpZXdOb2RlO1xuICAgIG5ld1BhcmVudD86IEFYVHJlZVZpZXdOb2RlO1xuICAgIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgICBjdXJyZW50SW5kZXg6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGVCeUlkKG5vZGVzLCBub2RlSWQsIGlkRmllbGQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHByZXZpb3VzSW5kZXg6IC0xLCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjdXJyZW50IHBhcmVudFxuICAgIGNvbnN0IGN1cnJlbnRQYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBjdXJyZW50UGFyZW50Q2hpbGRyZW4gPSBjdXJyZW50UGFyZW50XG4gICAgICA/IChjdXJyZW50UGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjdXJyZW50QXJyYXkgPSBjdXJyZW50UGFyZW50Q2hpbGRyZW4gPz8gbm9kZXM7XG5cbiAgICAvLyBGaW5kIGFuZCByZW1vdmUgZnJvbSBjdXJyZW50IGxvY2F0aW9uXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEFycmF5LmZpbmRJbmRleCgobikgPT4gKG5baWRGaWVsZF0gYXMgc3RyaW5nKSA9PT0gbm9kZUlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHByZXZpb3VzSW5kZXg6IC0xLCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgfVxuXG4gICAgY29uc3QgbW92ZWROb2RlID0gY3VycmVudEFycmF5LnNwbGljZShjdXJyZW50SW5kZXgsIDEpWzBdO1xuXG4gICAgLy8gRmluZCBuZXcgcGFyZW50XG4gICAgbGV0IHRhcmdldEFycmF5OiBBWFRyZWVWaWV3Tm9kZVtdO1xuICAgIGxldCBuZXdQYXJlbnQ6IEFYVHJlZVZpZXdOb2RlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1BhcmVudElkKSB7XG4gICAgICBuZXdQYXJlbnQgPSB0aGlzLmZpbmROb2RlQnlJZChub2RlcywgbmV3UGFyZW50SWQsIGlkRmllbGQpO1xuICAgICAgaWYgKCFuZXdQYXJlbnQpIHtcbiAgICAgICAgLy8gUmVzdG9yZSBub2RlIGlmIG5ldyBwYXJlbnQgbm90IGZvdW5kXG4gICAgICAgIGN1cnJlbnRBcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBtb3ZlZE5vZGUpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcHJldmlvdXNJbmRleDogY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGRyb3AgdGFyZ2V0XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZERyb3BUYXJnZXQobW92ZWROb2RlLCBuZXdQYXJlbnQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgbm9kZSBpZiBpbnZhbGlkIGRyb3AgdGFyZ2V0XG4gICAgICAgIGN1cnJlbnRBcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBtb3ZlZE5vZGUpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcHJldmlvdXNJbmRleDogY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdQYXJlbnRDaGlsZHJlbiA9IG5ld1BhcmVudFtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFuZXdQYXJlbnRDaGlsZHJlbikge1xuICAgICAgICBuZXdQYXJlbnRDaGlsZHJlbiA9IFtdO1xuICAgICAgICBuZXdQYXJlbnRbY2hpbGRyZW5GaWVsZF0gPSBuZXdQYXJlbnRDaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHRhcmdldEFycmF5ID0gbmV3UGFyZW50Q2hpbGRyZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEFycmF5ID0gbm9kZXM7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBpbmRleCBiZWZvcmUgaW5zZXJ0aW5nXG4gICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IDAgJiYgaW5kZXggPD0gdGFyZ2V0QXJyYXkubGVuZ3RoID8gaW5kZXggOiB0YXJnZXRBcnJheS5sZW5ndGg7XG5cbiAgICAvLyBJbnNlcnQgYXQgbmV3IGxvY2F0aW9uXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8PSB0YXJnZXRBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZShpbmRleCwgMCwgbW92ZWROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChtb3ZlZE5vZGUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZHJlbkNvdW50XG4gICAgaWYgKGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZHJlbiA9IGN1cnJlbnRQYXJlbnRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGN1cnJlbnRQYXJlbnRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IHVwZGF0ZWRDaGlsZHJlbj8ubGVuZ3RoID8/IDA7XG4gICAgfVxuICAgIGlmIChuZXdQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZHJlbiA9IG5ld1BhcmVudFtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgbmV3UGFyZW50W2NoaWxkcmVuQ291bnRGaWVsZF0gPSB1cGRhdGVkQ2hpbGRyZW4/Lmxlbmd0aCA/PyAwO1xuICAgICAgbmV3UGFyZW50W2V4cGFuZGVkRmllbGRdID0gdHJ1ZTsgLy8gQXV0by1leHBhbmQgbmV3IHBhcmVudFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbW92ZWROb2RlLFxuICAgICAgcHJldmlvdXNQYXJlbnQ6IGN1cnJlbnRQYXJlbnQsXG4gICAgICBuZXdQYXJlbnQsXG4gICAgICBwcmV2aW91c0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICBjdXJyZW50SW5kZXg6IG5ld0luZGV4LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRWRpdC91cGRhdGUgYSBub2RlJ3MgcHJvcGVydGllc1xuICAgKiBAcGFyYW0gbm9kZXMgLSBSb290IG5vZGVzIGFycmF5XG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gZWRpdFxuICAgKiBAcGFyYW0gdXBkYXRlcyAtIFBhcnRpYWwgbm9kZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gaWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIG5vZGUgSURcbiAgICogQHBhcmFtIGNoaWxkcmVuRmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBhcnJheVxuICAgKiBAcGFyYW0gY2hpbGRyZW5Db3VudEZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gY291bnRcbiAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbm9kZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGVkaXROb2RlKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QVhUcmVlVmlld05vZGU+LFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbm9kZSBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmFzc2lnbihub2RlLCB1cGRhdGVzKTtcblxuICAgIC8vIElmIGNoaWxkcmVuIGFycmF5IGlzIHByb3ZpZGVkLCBlbnN1cmUgaXQgZXhpc3RzIGFuZCB1cGRhdGUgY2hpbGRyZW5Db3VudFxuICAgIGlmICh1cGRhdGVzW2NoaWxkcmVuRmllbGRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdXBkYXRlc1tjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgbm9kZVtjaGlsZHJlbkZpZWxkXSA9IGNoaWxkcmVuO1xuICAgICAgbm9kZVtjaGlsZHJlbkNvdW50RmllbGRdID0gY2hpbGRyZW4/Lmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjaGlsZCBub2RlIHRvIGEgcGFyZW50IG5vZGVcbiAgICogQHBhcmFtIG5vZGVzIC0gUm9vdCBub2RlcyBhcnJheVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgSUQgb2YgdGhlIHBhcmVudCBub2RlXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgLSBUaGUgY2hpbGQgbm9kZSB0byBhZGRcbiAgICogQHBhcmFtIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IGF0IChkZWZhdWx0OiBhcHBlbmQgdG8gZW5kKVxuICAgKiBAcGFyYW0gaWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIG5vZGUgSURcbiAgICogQHBhcmFtIGNoaWxkcmVuRmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBhcnJheVxuICAgKiBAcGFyYW0gY2hpbGRyZW5Db3VudEZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gY291bnRcbiAgICogQHBhcmFtIGV4cGFuZGVkRmllbGQgLSBGaWVsZCBuYW1lIGZvciBleHBhbmRlZCBzdGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IG5vZGUgaWYgZm91bmQgYW5kIGNoaWxkIHdhcyBhZGRlZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGFkZENoaWxkKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgY2hpbGROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBleHBhbmRlZEZpZWxkID0gJ2V4cGFuZGVkJyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmROb2RlQnlJZChub2RlcywgcGFyZW50SWQsIGlkRmllbGQpO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgY2hpbGRyZW4gYXJyYXkgZXhpc3RzXG4gICAgbGV0IGNoaWxkcmVuID0gcGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAgIHBhcmVudFtjaGlsZHJlbkZpZWxkXSA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBvciBhcHBlbmQgY2hpbGRcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSAwICYmIGluZGV4IDw9IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNoaWxkcmVuQ291bnRcbiAgICBwYXJlbnRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgIC8vIEF1dG8tZXhwYW5kIHBhcmVudCBpZiBpdCB3YXMgY29sbGFwc2VkXG4gICAgaWYgKCEocGFyZW50W2V4cGFuZGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpKSB7XG4gICAgICBwYXJlbnRbZXhwYW5kZWRGaWVsZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSB0cmVlXG4gICAqIEBwYXJhbSBub2RlcyAtIFJvb3Qgbm9kZXMgYXJyYXlcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byByZW1vdmVcbiAgICogQHBhcmFtIGlkRmllbGQgLSBGaWVsZCBuYW1lIGZvciBub2RlIElEXG4gICAqIEBwYXJhbSBjaGlsZHJlbkZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gYXJyYXlcbiAgICogQHBhcmFtIGNoaWxkcmVuQ291bnRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGNvdW50XG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIG5vZGUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICByZW1vdmVOb2RlKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHBhcmVudCB0byByZW1vdmUgZnJvbSBpdHMgY2hpbGRyZW4gYXJyYXlcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBwYXJlbnRDaGlsZHJlbiA9IHBhcmVudCA/IChwYXJlbnRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBwYXJlbnRDaGlsZHJlbiA/PyBub2RlcztcblxuICAgIC8vIEZpbmQgYW5kIHJlbW92ZSB0aGUgbm9kZVxuICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0QXJyYXkuZmluZEluZGV4KChuKSA9PiAobltpZEZpZWxkXSBhcyBzdHJpbmcpID09PSBub2RlSWQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0YXJnZXRBcnJheS5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuXG4gICAgICAvLyBVcGRhdGUgcGFyZW50J3MgY2hpbGRyZW5Db3VudCBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkcmVuID0gcGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIHBhcmVudFtjaGlsZHJlbkNvdW50RmllbGRdID0gdXBkYXRlZENoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgbm9kZSBzdHJ1Y3R1cmUgKGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgYW5kIGNpcmN1bGFyIHJlZmVyZW5jZXMpXG4gICAqL1xuICB2YWxpZGF0ZU5vZGUoXG4gICAgbm9kZTogQVhUcmVlVmlld05vZGUsXG4gICAgdmlzaXRlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCksXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgdGl0bGVGaWVsZCA9ICd0aXRsZScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICApOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBub2RlSWQgPSBub2RlW2lkRmllbGRdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlVGl0bGUgPSBub2RlW3RpdGxlRmllbGRdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICBlcnJvcnMucHVzaChgTm9kZSBtdXN0IGhhdmUgYW4gJHtpZEZpZWxkfWApO1xuICAgIH1cblxuICAgIGlmICghbm9kZVRpdGxlKSB7XG4gICAgICBlcnJvcnMucHVzaChgTm9kZSBtdXN0IGhhdmUgYSAke3RpdGxlRmllbGR9YCk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVJZCAmJiB2aXNpdGVkSWRzLmhhcyhub2RlSWQpKSB7XG4gICAgICBlcnJvcnMucHVzaChgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiBub2RlICR7bm9kZUlkfSBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZSB0cmVlYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBuZXdWaXNpdGVkID0gbmV3IFNldCh2aXNpdGVkSWRzKTtcbiAgICAgIGlmIChub2RlSWQpIHtcbiAgICAgICAgbmV3VmlzaXRlZC5hZGQobm9kZUlkKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZFZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlTm9kZShcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBuZXdWaXNpdGVkLFxuICAgICAgICAgIGlkRmllbGQsXG4gICAgICAgICAgdGl0bGVGaWVsZCxcbiAgICAgICAgICBjaGlsZHJlbkZpZWxkLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjaGlsZFZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCguLi5jaGlsZFZhbGlkYXRpb24uZXJyb3JzLm1hcCgoZSkgPT4gYENoaWxkIG9mICR7bm9kZUlkfTogJHtlfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gbm9kZVtjaGlsZHJlbkNvdW50RmllbGRdIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZHJlbkNvdW50ICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW5Db3VudCAhPT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIGBOb2RlICR7bm9kZUlkfTogJHtjaGlsZHJlbkNvdW50RmllbGR9ICgke2NoaWxkcmVuQ291bnR9KSBkb2VzIG5vdCBtYXRjaCAke2NoaWxkcmVuRmllbGR9IGFycmF5IGxlbmd0aCAoJHtjaGlsZHJlbi5sZW5ndGh9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==","import { AXDragDirective, AXDragHandleDirective, AXDropListDirective, moveItemInArray, transferArrayItem, } 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 { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, ViewEncapsulation, } 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 * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nimport * as i2 from \"@angular/forms\";\nexport class AXTreeViewComponent {\n constructor() {\n // ==================== Dependencies ====================\n this.treeService = inject(AXTreeViewService);\n this.platformService = inject(AXPlatform);\n this.destroyRef = inject(DestroyRef);\n // ==================== Inputs ====================\n /** Tree data source - can be static array or lazy loading function */\n this.datasource = model.required(...(ngDevMode ? [{ debugName: \"datasource\" }] : []));\n /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */\n this.selectMode = input('single', ...(ngDevMode ? [{ debugName: \"selectMode\" }] : []));\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 this.selectionBehavior = input('intermediate', ...(ngDevMode ? [{ debugName: \"selectionBehavior\" }] : []));\n /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */\n this.dragArea = input('handler', ...(ngDevMode ? [{ debugName: \"dragArea\" }] : []));\n /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */\n this.dragBehavior = input('none', ...(ngDevMode ? [{ debugName: \"dragBehavior\" }] : []));\n /** Whether to show icons. Default: `true` */\n this.showIcons = input(true, ...(ngDevMode ? [{ debugName: \"showIcons\" }] : []));\n /** Whether to show children count badge. Default: `true` */\n this.showChildrenBadge = input(true, ...(ngDevMode ? [{ debugName: \"showChildrenBadge\" }] : []));\n /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */\n this.expandedIcon = input('fa-solid fa-chevron-down', ...(ngDevMode ? [{ debugName: \"expandedIcon\" }] : []));\n /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */\n this.collapsedIcon = input('fa-solid fa-chevron-right', ...(ngDevMode ? [{ debugName: \"collapsedIcon\" }] : []));\n /** Indent size in pixels for each level. Default: `16` */\n this.indentSize = input(16, ...(ngDevMode ? [{ debugName: \"indentSize\" }] : []));\n /** Visual style variant. Default: `'default'` */\n this.look = input('default', ...(ngDevMode ? [{ debugName: \"look\" }] : []));\n /** Custom template for tree items. Default: `undefined` */\n this.nodeTemplate = input(...(ngDevMode ? [undefined, { debugName: \"nodeTemplate\" }] : []));\n /** Field name for node ID. Default: `'id'` */\n this.idField = input('id', ...(ngDevMode ? [{ debugName: \"idField\" }] : []));\n /** Field name for node title. Default: `'title'` */\n this.titleField = input('title', ...(ngDevMode ? [{ debugName: \"titleField\" }] : []));\n /** Field name for node tooltip. Default: `'tooltip'` */\n this.tooltipField = input('tooltip', ...(ngDevMode ? [{ debugName: \"tooltipField\" }] : []));\n /** Field name for node icon. Default: `'icon'` */\n this.iconField = input('icon', ...(ngDevMode ? [{ debugName: \"iconField\" }] : []));\n /** Field name for expanded state. Default: `'expanded'` */\n this.expandedField = input('expanded', ...(ngDevMode ? [{ debugName: \"expandedField\" }] : []));\n /** Field name for selected state. Default: `'selected'` */\n this.selectedField = input('selected', ...(ngDevMode ? [{ debugName: \"selectedField\" }] : []));\n /** Field name for indeterminate state. Default: `'indeterminate'` */\n this.indeterminateField = input('indeterminate', ...(ngDevMode ? [{ debugName: \"indeterminateField\" }] : []));\n /** Field name for disabled state. Default: `'disabled'` */\n this.disabledField = input('disabled', ...(ngDevMode ? [{ debugName: \"disabledField\" }] : []));\n /** Field name for hidden state. Default: `'hidden'` */\n this.hiddenField = input('hidden', ...(ngDevMode ? [{ debugName: \"hiddenField\" }] : []));\n /** Field name for children array. Default: `'children'` */\n this.childrenField = input('children', ...(ngDevMode ? [{ debugName: \"childrenField\" }] : []));\n /** Field name for children count. Default: `'childrenCount'` */\n this.childrenCountField = input('childrenCount', ...(ngDevMode ? [{ debugName: \"childrenCountField\" }] : []));\n /** Field name for custom data. Default: `'data'` */\n this.dataField = input('data', ...(ngDevMode ? [{ debugName: \"dataField\" }] : []));\n // ==================== Outputs ====================\n /** Emitted before a drop operation - set canceled to true to prevent drop */\n this.onBeforeDrop = output();\n /** Emitted when a node is toggled (expanded/collapsed) */\n this.onNodeToggle = output();\n /** Emitted when a node is selected/deselected */\n this.onNodeSelect = output();\n /** Emitted when a node is double-clicked */\n this.onNodeDoubleClick = output();\n /** Emitted when a node is double-clicked */\n this.onNodeClick = output();\n /** Emitted when selection changes - returns all currently selected nodes */\n this.onSelectionChange = output();\n /** Emitted when nodes are reordered within the same parent */\n this.onOrderChange = output();\n /** Emitted when a node is moved to a different parent */\n this.onMoveChange = output();\n /** Emitted for any item change (order or move) */\n this.onItemsChange = output();\n // ==================== Internal State ====================\n /** Internal signal for tree nodes */\n this.nodes = signal([], ...(ngDevMode ? [{ debugName: \"nodes\" }] : []));\n /** Internal signal for tracking loading state */\n this.loadingNodes = signal(new Set(), ...(ngDevMode ? [{ debugName: \"loadingNodes\" }] : []));\n /** Currently focused node ID for keyboard navigation */\n this.focusedNodeId = signal(null, ...(ngDevMode ? [{ debugName: \"focusedNodeId\" }] : []));\n /** RTL detection signal */\n this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: \"isRtl\" }] : []));\n /** active node id */\n this.activeNodeId = signal(null, ...(ngDevMode ? [{ debugName: \"activeNodeId\" }] : []));\n /** Computed chevron icons that flip for RTL */\n this.directionExpandedIcon = computed(() => this.expandedIcon(), ...(ngDevMode ? [{ debugName: \"directionExpandedIcon\" }] : []));\n this.directionCollapsedIcon = computed(() => {\n const isRtlDirection = this.isRtl();\n const defaultIcon = this.collapsedIcon();\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 }, ...(ngDevMode ? [{ debugName: \"directionCollapsedIcon\" }] : []));\n /** Flag to prevent infinite loops when syncing datasource */\n this.isUpdatingFromDatasource = false;\n /** Computed to check if datasource is a function */\n this.isLazyDataSource = computed(() => typeof this.datasource() === 'function', ...(ngDevMode ? [{ debugName: \"isLazyDataSource\" }] : []));\n /** Computed: Returns true when selection is restricted to leaf nodes only */\n this.isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf', ...(ngDevMode ? [{ debugName: \"isLeafOnlyMode\" }] : []));\n /** Computed: Returns true when selecting a parent automatically selects all its children */\n this.cascadesToChildren = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'nested' || behavior === 'intermediate-nested';\n }, ...(ngDevMode ? [{ debugName: \"cascadesToChildren\" }] : []));\n /** Computed: Returns true when parent nodes show indeterminate state based on children selection */\n this.hasIntermediateState = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'intermediate' || behavior === 'intermediate-nested';\n }, ...(ngDevMode ? [{ debugName: \"hasIntermediateState\" }] : []));\n /** Computed: Returns true when drag handle should be shown */\n this.shouldShowDragHandle = computed(() => {\n return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';\n }, ...(ngDevMode ? [{ debugName: \"shouldShowDragHandle\" }] : []));\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n this.#datasourceEffect = effect(async () => {\n if (this.isUpdatingFromDatasource) {\n return;\n }\n const ds = this.datasource();\n if (Array.isArray(ds)) {\n this.nodes.set([...ds]);\n }\n else if (typeof ds === 'function') {\n try {\n await this.loadRootItems(ds);\n }\n catch (error) {\n this.handleError('Failed to load root items', error);\n }\n }\n }, ...(ngDevMode ? [{ debugName: \"#datasourceEffect\" }] : []));\n /** Initialize direction change listener */\n this.#initDirectionListener = afterNextRender(() => {\n this.platformService.directionChange\n .pipe(map((event) => event.data === 'rtl'), takeUntilDestroyed(this.destroyRef))\n .subscribe((isRtl) => this.isRtl.set(isRtl));\n });\n }\n // ==================== Node Property Helpers ====================\n /**\n * Get a property value from a node using the configured field name\n */\n getNodeProp(node, fieldName, defaultValue) {\n return node[fieldName] ?? defaultValue;\n }\n /**\n * Set a property value on a node using the configured field name\n */\n setNodeProp(node, fieldName, value) {\n node[fieldName] = value;\n }\n /**\n * Get node ID\n */\n getNodeId(node) {\n return this.getNodeProp(node, this.idField(), '');\n }\n /**\n * Get node title\n */\n getNodeTitle(node) {\n return this.getNodeProp(node, this.titleField(), '');\n }\n /**\n * Get node tooltip\n */\n getNodeTooltip(node) {\n return this.getNodeProp(node, this.tooltipField(), undefined);\n }\n /**\n * Get node icon\n */\n getNodeIcon(node) {\n return this.getNodeProp(node, this.iconField(), undefined);\n }\n /**\n * Get node expanded state\n */\n getNodeExpanded(node) {\n return this.getNodeProp(node, this.expandedField(), false);\n }\n /**\n * Set node expanded state\n */\n setNodeExpanded(node, value) {\n this.setNodeProp(node, this.expandedField(), value);\n }\n /**\n * Get node selected state\n */\n getNodeSelected(node) {\n return this.getNodeProp(node, this.selectedField(), false);\n }\n /**\n * Set node selected state\n */\n setNodeSelected(node, value) {\n this.setNodeProp(node, this.selectedField(), value);\n }\n /**\n * Get node indeterminate state\n */\n getNodeIndeterminate(node) {\n return this.getNodeProp(node, this.indeterminateField(), false);\n }\n /**\n * Set node indeterminate state\n */\n setNodeIndeterminate(node, value) {\n this.setNodeProp(node, this.indeterminateField(), value);\n }\n /**\n * Get node disabled state\n */\n getNodeDisabled(node) {\n return this.getNodeProp(node, this.disabledField(), false);\n }\n /**\n * Get node hidden state\n */\n getNodeHidden(node) {\n return this.getNodeProp(node, this.hiddenField(), false);\n }\n /**\n * Get node children array\n */\n getNodeChildren(node) {\n return this.getNodeProp(node, this.childrenField(), undefined);\n }\n /**\n * Set node children array\n */\n setNodeChildren(node, value) {\n this.setNodeProp(node, this.childrenField(), value);\n }\n /**\n * Get node children count\n */\n getNodeChildrenCount(node) {\n return this.getNodeProp(node, this.childrenCountField(), undefined);\n }\n /**\n * Set node children count\n */\n setNodeChildrenCount(node, value) {\n this.setNodeProp(node, this.childrenCountField(), value);\n }\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n #datasourceEffect;\n /** Initialize direction change listener */\n #initDirectionListener;\n // ==================== Public API ====================\n /**\n * Expand all nodes in the tree (with lazy loading support)\n */\n async expandAll() {\n await this.treeService.setExpandedState(this.nodes(), true, this.isLazyDataSource(), (node) => this.loadNodeChildren(node), this.expandedField(), this.childrenField(), this.childrenCountField());\n this.refreshNodes();\n }\n /**\n * Collapse all nodes in the tree\n */\n collapseAll() {\n this.treeService.setExpandedState(this.nodes(), false, this.isLazyDataSource(), (node) => this.loadNodeChildren(node), this.expandedField(), this.childrenField(), this.childrenCountField());\n this.refreshNodes();\n }\n /**\n * Get count of selected nodes\n */\n getSelectedCount() {\n return this.treeService.countSelected(this.nodes(), this.selectedField(), this.childrenField());\n }\n /**\n * Check if any nodes are selected\n */\n hasSelection() {\n return this.getSelectedCount() > 0;\n }\n /**\n * Get all selected nodes\n */\n getSelectedNodes() {\n const selected = [];\n this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());\n return selected;\n }\n /**\n * Delete selected nodes from the tree\n */\n deleteSelected() {\n this.treeService.removeSelected(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n if (!this.isLeafOnlyMode()) {\n this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n /**\n * Select all nodes in the tree\n */\n selectAll() {\n if (this.selectMode() === 'none') {\n return;\n }\n if (this.isLeafOnlyMode()) {\n // Only select leaf nodes\n const selectLeafs = (nodes) => {\n for (const node of nodes) {\n if (this.isLeafNode(node) && !this.getNodeDisabled(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 }\n else {\n this.treeService.setAllSelection(this.nodes(), true, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n /**\n * Deselect all nodes in the tree\n */\n deselectAll() {\n this.treeService.setAllSelection(this.nodes(), false, this.selectedField(), this.indeterminateField(), this.childrenField());\n this.refreshNodes();\n this.emitSelectionChange();\n }\n /**\n * Find a node by ID in the tree\n */\n findNode(id) {\n return this.treeService.findNodeById(this.nodes(), id, this.idField());\n }\n /**\n * Refresh the tree to trigger change detection\n */\n refresh() {\n this.refreshNodes();\n }\n /**\n * Check if a node is currently loading\n */\n isNodeLoading(nodeId) {\n return this.loadingNodes().has(nodeId);\n }\n /**\n * Get loading state for a node (internal state)\n */\n getNodeLoading(node) {\n return this.loadingNodes().has(this.getNodeId(node));\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, updates) {\n const updated = this.treeService.editNode(this.nodes(), nodeId, updates, this.idField(), this.childrenField(), this.childrenCountField());\n if (updated) {\n this.refreshNodes();\n return true;\n }\n return false;\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, childNode, index) {\n const parent = this.treeService.addChild(this.nodes(), parentId, childNode, index, this.idField(), this.childrenField(), this.childrenCountField(), this.expandedField());\n if (parent) {\n this.refreshNodes();\n return true;\n }\n return false;\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) {\n const removed = this.treeService.removeNode(this.nodes(), nodeId, this.idField(), this.childrenField(), this.childrenCountField());\n if (removed) {\n // Update parent states if needed\n if (this.hasIntermediateState()) {\n this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n }\n return removed;\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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\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 * Collapse a specific node\n * @param nodeId - The ID of the node to collapse\n */\n collapseNode(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n if (this.getNodeExpanded(node)) {\n this.collapseNode(nodeId);\n }\n else {\n await this.expandNode(nodeId);\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) {\n if (this.selectMode() === 'none') {\n return false;\n }\n const node = this.findNode(nodeId);\n if (!node || this.getNodeDisabled(node) || !this.canSelectNode(node)) {\n return false;\n }\n const mode = this.selectMode();\n if (mode === 'single') {\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n else {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, true, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return false;\n }\n this.setNodeSelected(node, false);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, false, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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) {\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.getNodeChildren(node) ?? [];\n }\n /**\n * Get all root nodes\n * @returns Array of root nodes\n */\n getRootNodes() {\n return [...this.nodes()];\n }\n /**\n * Get all nodes in a flat array\n * @returns Array of all nodes in the tree\n */\n getAllNodes() {\n return this.treeService.getAllNodes(this.nodes(), this.childrenField());\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) {\n const nodePath = this.treeService.getNodePath(this.nodes(), nodeId, this.idField(), this.childrenField());\n return nodePath.map((node) => this.getNodeId(node));\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) {\n return this.treeService.getNodeLevel(this.nodes(), nodeId, this.idField(), this.childrenField());\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, newParentId, index) {\n const result = this.treeService.moveNode(this.nodes(), nodeId, newParentId, index, this.idField(), this.childrenField(), this.childrenCountField(), this.expandedField());\n if (result.success && result.movedNode) {\n // Emit drop events\n this.emitDropEvents(result.movedNode, result.previousParent, result.newParent, result.previousIndex, result.currentIndex, false);\n this.refreshNodes();\n return true;\n }\n return false;\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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.treeService.cloneNode(node, this.idField(), this.titleField(), this.tooltipField(), this.iconField(), this.expandedField(), this.selectedField(), this.indeterminateField(), this.disabledField(), this.hiddenField(), this.childrenCountField(), this.dataField(), this.childrenField());\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) {\n const node = this.findNode(nodeId);\n if (!node || this.getNodeHidden(node) === true || this.getNodeDisabled(node)) {\n return false;\n }\n this.focusNodeById(nodeId);\n return true;\n }\n /**\n * Get all expanded nodes\n * @returns Array of expanded nodes\n */\n getExpandedNodes() {\n const expanded = [];\n const traverse = (nodes) => {\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 * Get all collapsed nodes that have children\n * @returns Array of collapsed nodes with children\n */\n getCollapsedNodes() {\n const collapsed = [];\n const traverse = (nodes) => {\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 * 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) {\n const node = this.findNode(nodeId);\n return node ? this.getNodeExpanded(node) : false;\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) {\n const node = this.findNode(nodeId);\n return node ? this.getNodeSelected(node) : false;\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) {\n const node = this.findNode(nodeId);\n return this.treeService.hasChildren(node ?? {}, this.childrenField());\n }\n /**\n * Get template context for a node\n */\n getTemplateContext(node, level = 0) {\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 };\n }\n /**\n * Calculate padding-inline for a node based on its level\n */\n getNodePaddingInline(level) {\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 * Check if node should show expand toggle\n */\n shouldShowExpandToggle(node) {\n return (this.treeService.hasChildren(node, this.childrenField()) ||\n this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField()));\n }\n /**\n * Check if checkboxes should be shown (only for multiple mode)\n */\n shouldShowCheckbox() {\n return this.selectMode() === 'multiple';\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) {\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(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\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 * Check if a node can be selected (considering selectMode and isLeafOnlyMode)\n */\n canSelectNode(node) {\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 * Check if checkbox should be shown for a specific node\n */\n shouldShowCheckboxForNode(node) {\n if (!this.shouldShowCheckbox()) {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n /**\n * Generate unique list ID for each node\n */\n getListId(node) {\n return this.treeService.getListId(node, this.idField());\n }\n /**\n * Check if a node is currently focused\n */\n isNodeFocused(nodeId) {\n return this.focusedNodeId() === nodeId;\n }\n /**\n * Get ARIA level for a node\n */\n getNodeAriaLevel(level) {\n return level + 1;\n }\n /**\n * Get ARIA expanded state for a node\n */\n getNodeAriaExpanded(node) {\n if (!this.shouldShowExpandToggle(node)) {\n return null;\n }\n return this.getNodeExpanded(node) ? 'true' : 'false';\n }\n /**\n * Get ARIA selected state for a node\n */\n getNodeAriaSelected(node) {\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 * Emit selection change event with all selected nodes\n */\n emitSelectionChange() {\n const selectedNodes = this.getSelectedNodes();\n this.onSelectionChange.emit({\n component: this,\n selectedNodes,\n });\n }\n // ==================== Event Handlers ====================\n /**\n * Handle node double click\n */\n onNodeDoubleClickHandle(node, event) {\n if (this.getNodeDisabled(node))\n return;\n this.onNodeDoubleClick.emit({\n component: this,\n node,\n nativeEvent: event,\n });\n }\n /**\n * Handle node click handle\n */\n onNodeClickHandle(node, event) {\n if (this.getNodeDisabled(node))\n return;\n const mode = this.selectMode();\n this.activeNodeId.set(this.getNodeId(node));\n if (mode === 'single') {\n this.handleSingleSelection(node, event);\n }\n this.onNodeClick.emit({ component: this, node, nativeEvent: event });\n }\n /**\n * Toggle node expansion state with lazy loading support\n */\n async toggleNode(node, event) {\n if (this.getNodeDisabled(node))\n return;\n if (this.isEvent(event) && typeof event.stopPropagation === 'function') {\n event.stopPropagation();\n }\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\n if (hasChildren || canLazyLoad) {\n const willExpand = !this.getNodeExpanded(node);\n if (willExpand && canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n this.setNodeExpanded(node, willExpand);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: event });\n }\n }\n /**\n * Toggle node selection state with indeterminate support (for multiple mode)\n */\n toggleSelection(node, event) {\n if (!event.isUserInteraction)\n return;\n if (this.selectMode() === 'none')\n return;\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n if (mode !== 'multiple')\n return;\n const newValue = event.value === null ? true : event.value;\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: event.isUserInteraction,\n });\n this.emitSelectionChange();\n }\n /**\n * Handle drop events for tree nodes\n */\n onDrop(event, parentNode) {\n const targetArray = parentNode ? (this.getNodeChildren(parentNode) ?? []) : this.nodes();\n const isReordering = event.previousContainer === event.container;\n if (isReordering) {\n this.handleReorder(event, targetArray, parentNode);\n }\n else {\n this.handleMove(event, targetArray, parentNode);\n }\n this.refreshNodes();\n }\n /**\n * Handle drop events when dropping directly onto a node (to make it a child)\n */\n onDropOntoNode(event, targetNode) {\n if (!this.canMoveToParent())\n return;\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray)\n return;\n const movedNode = sourceArray[event.previousIndex];\n if (!this.treeService.isValidDropTarget(movedNode, targetNode, this.idField(), this.childrenField()))\n return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, targetNode, event.previousIndex, 0))\n return;\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 this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), targetNode, event.previousIndex, 0, false);\n this.refreshNodes();\n }\n /**\n * Handle node focus event\n */\n onNodeFocus(nodeId) {\n this.focusedNodeId.set(nodeId);\n }\n /**\n * Handle tree container focus - focus first node if none is focused\n */\n onTreeFocus(event) {\n if (event.target === event.currentTarget) {\n const flatList = this.treeService.buildFlatNodeList(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\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(this.nodes(), focusedId, this.idField());\n if (focusedNode && this.getNodeHidden(focusedNode) !== true) {\n this.focusNodeById(focusedId);\n }\n else {\n // Focused node no longer exists, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\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 * Handle tree container blur\n */\n onTreeBlur(event) {\n if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget)) {\n this.focusedNodeId.set(null);\n }\n }\n /**\n * Handle keyboard navigation\n */\n handleKeyDown(event) {\n const flatList = this.treeService.buildFlatNodeList(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\n if (flatList.length === 0)\n return;\n const currentFocused = this.getFocusedNode();\n let currentIndex = currentFocused\n ? flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentFocused))\n : -1;\n if (currentIndex === -1 && event.target === event.currentTarget) {\n currentIndex = 0;\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 (navigationResult.targetIndex !== null &&\n navigationResult.targetIndex >= 0 &&\n navigationResult.targetIndex < flatList.length) {\n this.focusNodeById(this.getNodeId(flatList[navigationResult.targetIndex].node));\n }\n }\n }\n // ==================== Private Methods ====================\n /**\n * Load root items when datasource is a function\n */\n async loadRootItems(loadFn) {\n try {\n const result = loadFn();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n }\n catch (error) {\n this.handleError('Failed to load root items', error);\n this.nodes.set([]);\n }\n }\n /**\n * Load children for a node using lazy loading\n */\n async loadNodeChildren(node) {\n const nodeId = this.getNodeId(node);\n if (!this.isLazyDataSource() || this.loadingNodes().has(nodeId))\n return;\n if (this.treeService.hasChildren(node, this.childrenField())) {\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')\n return;\n try {\n this.loadingNodes.update((set) => new Set(set).add(nodeId));\n this.refreshNodes();\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 }\n catch (error) {\n this.handleError('Failed to load children', error);\n this.setNodeChildrenCount(node, 0);\n }\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 * 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 refreshNodes() {\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 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 * 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 ensureNewArrayReferences(nodes) {\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 * Handle single selection mode\n */\n handleSingleSelection(node, event) {\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\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 * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)\n */\n handleMultipleSelection(node, event) {\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Get array reference by drop list ID\n */\n getArrayByListId(listId) {\n return this.treeService.getArrayByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n /**\n * Find parent node by list ID\n */\n findParentByListId(listId) {\n return this.treeService.findParentByListId(this.nodes(), listId, this.idField());\n }\n /**\n * Check if move operation is allowed based on dragBehavior\n */\n canMoveToParent() {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'order-only';\n }\n /**\n * Check if reorder operation is allowed based on dragBehavior\n */\n canReorder() {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'move';\n }\n /**\n * Handle reordering within the same list */\n handleReorder(event, targetArray, parentNode) {\n if (!this.canReorder())\n return;\n const movedNode = targetArray[event.previousIndex];\n moveItemInArray(targetArray, event.previousIndex, event.currentIndex);\n this.emitDropEvents(movedNode, parentNode, parentNode, event.previousIndex, event.currentIndex, true);\n }\n /**\n * Handle moving between different lists\n */\n handleMove(event, targetArray, parentNode) {\n if (!this.canMoveToParent())\n return;\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray)\n return;\n const movedNode = sourceArray[event.previousIndex];\n if (parentNode && !this.treeService.isValidDropTarget(movedNode, parentNode))\n return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, parentNode, event.previousIndex, event.currentIndex)) {\n return;\n }\n transferArrayItem(sourceArray, targetArray, event.previousIndex, event.currentIndex);\n this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), parentNode, event.previousIndex, event.currentIndex, false);\n }\n /**\n * Emit beforeDrop event and return whether to continue\n */\n emitBeforeDropEvent(movedNode, sourceListId, currentParent, previousIndex, currentIndex) {\n const beforeDropEvent = {\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 return !beforeDropEvent.canceled;\n }\n /**\n * Emit drop events based on operation type\n */\n emitDropEvents(node, previousParent, currentParent, previousIndex, currentIndex, isReorder) {\n const dropEvent = {\n component: this,\n node,\n previousParent,\n currentParent,\n previousIndex,\n currentIndex,\n };\n if (isReorder) {\n this.onOrderChange.emit(dropEvent);\n }\n else {\n this.onMoveChange.emit(dropEvent);\n }\n this.onItemsChange.emit(dropEvent);\n }\n /**\n * Get the currently focused node\n */\n getFocusedNode() {\n const focusedId = this.focusedNodeId();\n if (!focusedId)\n return null;\n return this.treeService.findNodeById(this.nodes(), focusedId, this.idField());\n }\n /**\n * Set focus to a node by ID\n */\n focusNodeById(nodeId) {\n this.focusedNodeId.set(nodeId);\n setTimeout(() => {\n const element = document.querySelector(`[data-tree-node-id=\"${nodeId}\"]`);\n if (element) {\n element.focus();\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n /**\n * Handle keyboard navigation keys\n */\n handleNavigationKey(event, flatList, currentIndex, currentFocused) {\n let targetIndex = currentIndex;\n let shouldPreventDefault = true;\n let handled = true;\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetIndex = currentIndex - 1;\n }\n else {\n shouldPreventDefault = false;\n }\n break;\n case 'ArrowDown':\n if (currentIndex < flatList.length - 1) {\n targetIndex = currentIndex + 1;\n }\n else if (currentIndex === -1) {\n targetIndex = 0;\n }\n else {\n shouldPreventDefault = false;\n }\n break;\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 }\n else {\n const currentItem = flatList[currentIndex];\n if (currentItem?.parent) {\n targetIndex = flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentItem.parent));\n }\n else {\n shouldPreventDefault = false;\n }\n }\n }\n else {\n shouldPreventDefault = false;\n }\n break;\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 }\n else if (this.getNodeExpanded(currentFocused) &&\n this.treeService.hasChildren(currentFocused, this.childrenField())) {\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(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\n targetIndex = updatedFlatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(firstChild));\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 }\n else {\n shouldPreventDefault = false;\n }\n }\n else {\n shouldPreventDefault = false;\n }\n }\n else {\n shouldPreventDefault = false;\n }\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = flatList.length - 1;\n break;\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 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 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 return { handled, shouldPreventDefault, targetIndex };\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 handleSpaceKeySelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n if (mode === 'single') {\n // Single mode: replace selection\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n else {\n // Multiple mode: toggle selection\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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 handleEnterKeySelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n // Enter key always replaces selection (deselects all first)\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\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(children, true, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n // Respect selectionBehavior: update parent states if intermediate mode\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Handle Ctrl/Cmd + Enter key selection\n */\n handleCtrlEnterSelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Type guard to check if value is an Event\n */\n isEvent(value) {\n return value instanceof Event;\n }\n /**\n * Handle errors consistently\n */\n handleError(message, error) {\n if (error instanceof Error) {\n console.error(`${message}:`, error.message);\n }\n else {\n console.error(`${message}:`, error);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.9\", type: AXTreeViewComponent, isStandalone: true, selector: \"ax-tree-view\", inputs: { datasource: { classPropertyName: \"datasource\", publicName: \"datasource\", isSignal: true, isRequired: true, transformFunction: null }, selectMode: { classPropertyName: \"selectMode\", publicName: \"selectMode\", isSignal: true, isRequired: false, transformFunction: null }, selectionBehavior: { classPropertyName: \"selectionBehavior\", publicName: \"selectionBehavior\", isSignal: true, isRequired: false, transformFunction: null }, dragArea: { classPropertyName: \"dragArea\", publicName: \"dragArea\", isSignal: true, isRequired: false, transformFunction: null }, dragBehavior: { classPropertyName: \"dragBehavior\", publicName: \"dragBehavior\", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: \"showIcons\", publicName: \"showIcons\", isSignal: true, isRequired: false, transformFunction: null }, showChildrenBadge: { classPropertyName: \"showChildrenBadge\", publicName: \"showChildrenBadge\", isSignal: true, isRequired: false, transformFunction: null }, expandedIcon: { classPropertyName: \"expandedIcon\", publicName: \"expandedIcon\", isSignal: true, isRequired: false, transformFunction: null }, collapsedIcon: { classPropertyName: \"collapsedIcon\", publicName: \"collapsedIcon\", isSignal: true, isRequired: false, transformFunction: null }, indentSize: { classPropertyName: \"indentSize\", publicName: \"indentSize\", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: \"look\", publicName: \"look\", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: \"nodeTemplate\", publicName: \"nodeTemplate\", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: \"idField\", publicName: \"idField\", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: \"titleField\", publicName: \"titleField\", isSignal: true, isRequired: false, transformFunction: null }, tooltipField: { classPropertyName: \"tooltipField\", publicName: \"tooltipField\", isSignal: true, isRequired: false, transformFunction: null }, iconField: { classPropertyName: \"iconField\", publicName: \"iconField\", isSignal: true, isRequired: false, transformFunction: null }, expandedField: { classPropertyName: \"expandedField\", publicName: \"expandedField\", isSignal: true, isRequired: false, transformFunction: null }, selectedField: { classPropertyName: \"selectedField\", publicName: \"selectedField\", isSignal: true, isRequired: false, transformFunction: null }, indeterminateField: { classPropertyName: \"indeterminateField\", publicName: \"indeterminateField\", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: \"disabledField\", publicName: \"disabledField\", isSignal: true, isRequired: false, transformFunction: null }, hiddenField: { classPropertyName: \"hiddenField\", publicName: \"hiddenField\", isSignal: true, isRequired: false, transformFunction: null }, childrenField: { classPropertyName: \"childrenField\", publicName: \"childrenField\", isSignal: true, isRequired: false, transformFunction: null }, childrenCountField: { classPropertyName: \"childrenCountField\", publicName: \"childrenCountField\", isSignal: true, isRequired: false, transformFunction: null }, dataField: { classPropertyName: \"dataField\", publicName: \"dataField\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: \"datasourceChange\", onBeforeDrop: \"onBeforeDrop\", onNodeToggle: \"onNodeToggle\", onNodeSelect: \"onNodeSelect\", onNodeDoubleClick: \"onNodeDoubleClick\", onNodeClick: \"onNodeClick\", onSelectionChange: \"onSelectionChange\", onOrderChange: \"onOrderChange\", onMoveChange: \"onMoveChange\", onItemsChange: \"onItemsChange\" }, host: { attributes: { \"role\": \"tree\", \"tabindex\": \"0\" }, listeners: { \"keydown\": \"handleKeyDown($event)\", \"focus\": \"onTreeFocus($event)\", \"blur\": \"onTreeBlur($event)\" }, properties: { \"class.ax-tree-view-default\": \"look() === 'default'\", \"class.ax-tree-view-card\": \"look() === 'card'\", \"class.ax-tree-view-with-line\": \"look() === 'with-line'\", \"class.ax-tree-view-rtl\": \"isRtl\", \"style.--ax-tree-view-indent-size\": \"indentSize() + 'px'\", \"style.--ax-tree-view-line-offset\": \"(indentSize() / 2) + 'px'\", \"attr.aria-label\": \"\\\"Tree navigation\\\"\" }, classAttribute: \"ax-tree-view\" }, providers: [AXTreeViewService], ngImport: i0, template: \"<!-- 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 role=\\\"group\\\"\\n>\\n @for (node of nodes(); track getNodeId(node)) {\\n @if (getNodeHidden(node) !== true) {\\n <div\\n [axDrag]=\\\"dragBehavior() !== 'none'\\\"\\n [dragDisabled]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(node)\\\"\\n [class.ax-tree-view-node-loading]=\\\"getNodeLoading(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]=\\\"getNodeDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\\\"\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"onNodeDoubleClickHandle(node, $event)\\\"\\n (focus)=\\\"onNodeFocus(getNodeId(node))\\\"\\n [tabindex]=\\\"isNodeFocused(getNodeId(node)) ? 0 : -1\\\"\\n >\\n @if (shouldShowDragHandle()) {\\n <span class=\\\"ax-tree-view-drag-handle\\\" axDragHandle title=\\\"Drag to reorder\\\"> \\u22EE\\u22EE </span>\\n }\\n <ax-button\\n class=\\\"ax-tree-view-expand-toggle ax-sm\\\"\\n (onClick)=\\\"toggleNode(node, $any($event))\\\"\\n [class.ax-tree-view-has-children]=\\\"shouldShowExpandToggle(node)\\\"\\n [class.ax-tree-view-expanded]=\\\"getNodeExpanded(node)\\\"\\n [disabled]=\\\"getNodeDisabled(node) || 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 (\\n showChildrenBadge() &&\\n (getNodeChildrenCount(node) || (getNodeChildren(node) && getNodeChildren(node)!.length > 0))\\n ) {\\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) && getNodeChildren(node)!.length > 0) {\\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]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(node) ? 'true' : null\\\"\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 class=\\\"ax-tree-view-drag-handle\\\" axDragHandle title=\\\"Drag to reorder\\\"> \\u22EE\\u22EE </span>\\n }\\n <ax-button\\n class=\\\"ax-tree-view-expand-toggle ax-sm\\\"\\n (onClick)=\\\"toggleNode(node, $any($event))\\\"\\n [class.ax-tree-view-has-children]=\\\"shouldShowExpandToggle(node)\\\"\\n [class.ax-tree-view-expanded]=\\\"getNodeExpanded(node)\\\"\\n [disabled]=\\\"getNodeDisabled(node) || 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 (\\n showChildrenBadge() &&\\n (getNodeChildrenCount(node) || (getNodeChildren(node) && getNodeChildren(node)!.length > 0))\\n ) {\\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) && getNodeChildren(node)!.length > 0) {\\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\", styles: [\".ax-tree-view{display:block;width:100%;--ax-comp-tree-view-indent-size: 12px;--ax-comp-tree-view-node-hover-bg: rgba(var(--ax-sys-color-on-lightest-surface), .04);--ax-comp-tree-view-node-selected-bg: rgba(var(--ax-sys-color-primary-500), .12);--ax-comp-tree-view-node-active-bg: rgba(var(--ax-sys-color-on-lighter-surface), .04);--ax-comp-tree-view-node-border-radius: 6px;--ax-comp-tree-view-node-margin: .25rem;--ax-comp-tree-view-line-color: rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity: .9;--ax-comp-tree-view-drag-placeholder-bg: rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg: rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline: rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding: 0;--ax-comp-tree-view-content-gap: .5rem;--ax-comp-tree-view-drop-list-min-height: 2rem;--ax-comp-tree-view-drag-handle-padding: .25rem;--ax-comp-tree-view-badge-padding: .25rem;--ax-comp-tree-view-expand-toggle-padding: .25rem;--ax-comp-tree-view-outline-offset: 2px;--ax-comp-tree-view-outline-offset-negative: -2px}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{position:relative;margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move}.ax-tree-view-node.ax-tree-view-node-active{background:var(--ax-comp-tree-view-node-active-bg)}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed currentColor!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{display:flex;align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{background:none;border:none;cursor:pointer;padding:var(--ax-comp-tree-view-expand-toggle-padding);min-width:1.5rem;height:1.5rem}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{font-size:1.125rem;flex-shrink:0}.ax-tree-view-node-label{flex:1;font-size:.875rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{position:relative;padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\\\"\\\";position:absolute;inset-inline-start:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));top:0;height:calc(100% - .875rem);width:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\\\"\\\";position:absolute;inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2)));top:60%;width:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));height:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"ngmodule\", type: FormsModule }, { kind: \"directive\", type: i2.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i2.NgModel, selector: \"[ngModel]:not([formControlName]):not([formControl])\", inputs: [\"name\", \"disabled\", \"ngModel\", \"ngModelOptions\"], outputs: [\"ngModelChange\"], exportAs: [\"ngModel\"] }, { kind: \"directive\", type: AXDragDirective, selector: \"[axDrag]\", inputs: [\"axDrag\", \"dragData\", \"dragDisabled\", \"dragTransition\", \"dragElementClone\", \"dropZoneGroup\", \"dragStartDelay\", \"dragResetOnDblClick\", \"dragLockAxis\", \"dragClonedTemplate\", \"dragCursor\", \"dragBoundary\", \"dragTransitionDuration\"], outputs: [\"dragPositionChanged\"] }, { kind: \"directive\", type: AXDragHandleDirective, selector: \"[axDragHandle]\" }, { kind: \"directive\", type: AXDropListDirective, selector: \"[axDropList]\", inputs: [\"axDropList\", \"sortingDisabled\", \"dropListGroup\", \"dropListOrientation\"], outputs: [\"dropListDropped\"], exportAs: [\"axDropList\"] }, { kind: \"directive\", type: AXFocusTrapDirective, selector: \"[axFocusTrap]\" }, { kind: \"component\", type: AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"component\", type: AXCheckBoxComponent, selector: \"ax-check-box\", inputs: [\"disabled\", \"tabIndex\", \"readonly\", \"color\", \"value\", \"name\", \"id\", \"isLoading\", \"indeterminate\"], outputs: [\"onBlur\", \"onFocus\", \"valueChange\", \"onValueChanged\"] }, { kind: \"component\", type: AXBadgeComponent, selector: \"ax-badge\", inputs: [\"color\", \"look\", \"text\"] }, { kind: \"component\", type: AXDecoratorIconComponent, selector: \"ax-icon\", inputs: [\"icon\"] }, { kind: \"directive\", type: AXTooltipDirective, selector: \"[axTooltip]\", inputs: [\"axTooltipDisabled\", \"axTooltip\", \"axTooltipContext\", \"axTooltipPlacement\", \"axTooltipOffsetX\", \"axTooltipOffsetY\", \"axTooltipOpenAfter\", \"axTooltipCloseAfter\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-tree-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXTreeViewService], imports: [\n CommonModule,\n FormsModule,\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXFocusTrapDirective,\n NgTemplateOutlet,\n AXButtonComponent,\n AXCheckBoxComponent,\n AXBadgeComponent,\n AXDecoratorIconComponent,\n AXTooltipDirective,\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 }, template: \"<!-- 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 role=\\\"group\\\"\\n>\\n @for (node of nodes(); track getNodeId(node)) {\\n @if (getNodeHidden(node) !== true) {\\n <div\\n [axDrag]=\\\"dragBehavior() !== 'none'\\\"\\n [dragDisabled]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(node)\\\"\\n [class.ax-tree-view-node-loading]=\\\"getNodeLoading(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]=\\\"getNodeDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\\\"\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"onNodeDoubleClickHandle(node, $event)\\\"\\n (focus)=\\\"onNodeFocus(getNodeId(node))\\\"\\n [tabindex]=\\\"isNodeFocused(getNodeId(node)) ? 0 : -1\\\"\\n >\\n @if (shouldShowDragHandle()) {\\n <span class=\\\"ax-tree-view-drag-handle\\\" axDragHandle title=\\\"Drag to reorder\\\"> \\u22EE\\u22EE </span>\\n }\\n <ax-button\\n class=\\\"ax-tree-view-expand-toggle ax-sm\\\"\\n (onClick)=\\\"toggleNode(node, $any($event))\\\"\\n [class.ax-tree-view-has-children]=\\\"shouldShowExpandToggle(node)\\\"\\n [class.ax-tree-view-expanded]=\\\"getNodeExpanded(node)\\\"\\n [disabled]=\\\"getNodeDisabled(node) || 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 (\\n showChildrenBadge() &&\\n (getNodeChildrenCount(node) || (getNodeChildren(node) && getNodeChildren(node)!.length > 0))\\n ) {\\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) && getNodeChildren(node)!.length > 0) {\\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]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(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]=\\\"getNodeDisabled(node) ? 'true' : null\\\"\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 class=\\\"ax-tree-view-drag-handle\\\" axDragHandle title=\\\"Drag to reorder\\\"> \\u22EE\\u22EE </span>\\n }\\n <ax-button\\n class=\\\"ax-tree-view-expand-toggle ax-sm\\\"\\n (onClick)=\\\"toggleNode(node, $any($event))\\\"\\n [class.ax-tree-view-has-children]=\\\"shouldShowExpandToggle(node)\\\"\\n [class.ax-tree-view-expanded]=\\\"getNodeExpanded(node)\\\"\\n [disabled]=\\\"getNodeDisabled(node) || 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 (\\n showChildrenBadge() &&\\n (getNodeChildrenCount(node) || (getNodeChildren(node) && getNodeChildren(node)!.length > 0))\\n ) {\\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) && getNodeChildren(node)!.length > 0) {\\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\", styles: [\".ax-tree-view{display:block;width:100%;--ax-comp-tree-view-indent-size: 12px;--ax-comp-tree-view-node-hover-bg: rgba(var(--ax-sys-color-on-lightest-surface), .04);--ax-comp-tree-view-node-selected-bg: rgba(var(--ax-sys-color-primary-500), .12);--ax-comp-tree-view-node-active-bg: rgba(var(--ax-sys-color-on-lighter-surface), .04);--ax-comp-tree-view-node-border-radius: 6px;--ax-comp-tree-view-node-margin: .25rem;--ax-comp-tree-view-line-color: rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity: .9;--ax-comp-tree-view-drag-placeholder-bg: rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg: rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline: rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding: 0;--ax-comp-tree-view-content-gap: .5rem;--ax-comp-tree-view-drop-list-min-height: 2rem;--ax-comp-tree-view-drag-handle-padding: .25rem;--ax-comp-tree-view-badge-padding: .25rem;--ax-comp-tree-view-expand-toggle-padding: .25rem;--ax-comp-tree-view-outline-offset: 2px;--ax-comp-tree-view-outline-offset-negative: -2px}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{position:relative;margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move}.ax-tree-view-node.ax-tree-view-node-active{background:var(--ax-comp-tree-view-node-active-bg)}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed currentColor!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{display:flex;align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{background:none;border:none;cursor:pointer;padding:var(--ax-comp-tree-view-expand-toggle-padding);min-width:1.5rem;height:1.5rem}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{font-size:1.125rem;flex-shrink:0}.ax-tree-view-node-label{flex:1;font-size:.875rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{position:relative;padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\\\"\\\";position:absolute;inset-inline-start:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));top:0;height:calc(100% - .875rem);width:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\\\"\\\";position:absolute;inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2)));top:60%;width:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));height:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}\\n\"] }]\n }], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: \"datasource\", required: true }] }, { type: i0.Output, args: [\"datasourceChange\"] }], selectMode: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectMode\", required: false }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectionBehavior\", required: false }] }], dragArea: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dragArea\", required: false }] }], dragBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dragBehavior\", required: false }] }], showIcons: [{ type: i0.Input, args: [{ isSignal: true, alias: \"showIcons\", required: false }] }], showChildrenBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: \"showChildrenBadge\", required: false }] }], expandedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: \"expandedIcon\", required: false }] }], collapsedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: \"collapsedIcon\", required: false }] }], indentSize: [{ type: i0.Input, args: [{ isSignal: true, alias: \"indentSize\", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: \"look\", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: \"nodeTemplate\", required: false }] }], idField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"idField\", required: false }] }], titleField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"titleField\", required: false }] }], tooltipField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"tooltipField\", required: false }] }], iconField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"iconField\", required: false }] }], expandedField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"expandedField\", required: false }] }], selectedField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectedField\", required: false }] }], indeterminateField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"indeterminateField\", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"disabledField\", required: false }] }], hiddenField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"hiddenField\", required: false }] }], childrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"childrenField\", required: false }] }], childrenCountField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"childrenCountField\", required: false }] }], dataField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dataField\", required: false }] }], onBeforeDrop: [{ type: i0.Output, args: [\"onBeforeDrop\"] }], onNodeToggle: [{ type: i0.Output, args: [\"onNodeToggle\"] }], onNodeSelect: [{ type: i0.Output, args: [\"onNodeSelect\"] }], onNodeDoubleClick: [{ type: i0.Output, args: [\"onNodeDoubleClick\"] }], onNodeClick: [{ type: i0.Output, args: [\"onNodeClick\"] }], onSelectionChange: [{ type: i0.Output, args: [\"onSelectionChange\"] }], onOrderChange: [{ type: i0.Output, args: [\"onOrderChange\"] }], onMoveChange: [{ type: i0.Output, args: [\"onMoveChange\"] }], onItemsChange: [{ type: i0.Output, args: [\"onItemsChange\"] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUVuQixlQUFlLEVBQ2YsaUJBQWlCLEdBQ2xCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixF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QVc7d0JBQ1gsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3FCQUNuQixRQUNLO3dCQUNKLEtBQUssRUFBRSxjQUFjO3dCQUNyQixJQUFJLEVBQUUsTUFBTTt3QkFDWixRQUFRLEVBQUUsR0FBRzt3QkFDYiw4QkFBOEIsRUFBRSxzQkFBc0I7d0JBQ3RELDJCQUEyQixFQUFFLG1CQUFtQjt3QkFDaEQsZ0NBQWdDLEVBQUUsd0JBQXdCO3dCQUMxRCwwQkFBMEIsRUFBRSxPQUFPO3dCQUNuQyxvQ0FBb0MsRUFBRSxxQkFBcUI7d0JBQzNELG9DQUFvQyxFQUFFLDJCQUEyQjt3QkFDakUsbUJBQW1CLEVBQUUsbUJBQW1CO3dCQUN4QyxXQUFXLEVBQUUsdUJBQXVCO3dCQUNwQyxTQUFTLEVBQUUscUJBQXFCO3dCQUNoQyxRQUFRLEVBQUUsb0JBQW9CO3FCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYVmFsdWVDaGFuZ2VkRXZlbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHtcbiAgQVhEcmFnRGlyZWN0aXZlLFxuICBBWERyYWdIYW5kbGVEaXJlY3RpdmUsXG4gIEFYRHJvcExpc3REaXJlY3RpdmUsXG4gIEFYRHJvcExpc3REcm9wcGVkRXZlbnQsXG4gIG1vdmVJdGVtSW5BcnJheSxcbiAgdHJhbnNmZXJBcnJheUl0ZW0sXG59IGZyb20gJ0BhY29yZXgvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBBWEZvY3VzVHJhcERpcmVjdGl2ZSB9IGZyb20gJ0BhY29yZXgvY2RrL2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgQVhCYWRnZUNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9iYWRnZSc7XG5pbXBvcnQgeyBBWEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQVhDaGVja0JveENvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9jaGVjay1ib3gnO1xuaW1wb3J0IHsgQVhEZWNvcmF0b3JJY29uQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgQVhUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3Rvb2x0aXAnO1xuaW1wb3J0IHsgQVhQbGF0Zm9ybSB9IGZyb20gJ0BhY29yZXgvY29yZS9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRGVzdHJveVJlZixcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFYVHJlZVZpZXdTZXJ2aWNlIH0gZnJvbSAnLi90cmVlLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge1xuICBBWFRyZWVWaWV3QmVmb3JlRHJvcEV2ZW50LFxuICBBWFRyZWVWaWV3Q2FsbGJhY2ssXG4gIEFYVHJlZVZpZXdEYXRhU291cmNlLFxuICBBWFRyZWVWaWV3RHJhZ0FyZWEsXG4gIEFYVHJlZVZpZXdEcmFnQmVoYXZpb3IsXG4gIEFYVHJlZVZpZXdEcm9wRXZlbnQsXG4gIEFYVHJlZVZpZXdGbGF0Tm9kZSxcbiAgQVhUcmVlVmlld05vZGUsXG4gIEFYVHJlZVZpZXdOb2RlQ2xpY2tFdmVudCxcbiAgQVhUcmVlVmlld05vZGVEb3VibGVDbGlja0V2ZW50LFxuICBBWFRyZWVWaWV3Tm9kZVNlbGVjdEV2ZW50LFxuICBBWFRyZWVWaWV3SXRlbVRlbXBsYXRlQ29udGV4dCBhcyBBWFRyZWVWaWV3Tm9kZVRlbXBsYXRlQ29udGV4dCxcbiAgQVhUcmVlVmlld05vZGVUb2dnbGVFdmVudCxcbiAgQVhUcmVlVmlld1NlbGVjdGlvbkJlaGF2aW9yLFxuICBBWFRyZWVWaWV3U2VsZWN0aW9uQ2hhbmdlRXZlbnQsXG4gIEFYVHJlZVZpZXdTZWxlY3RNb2RlLFxuICBBWFRyZWVWaWV3Vmlld0xvb2ssXG59IGZyb20gJy4vdHJlZS12aWV3LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtdHJlZS12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RyZWUtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbQVhUcmVlVmlld1NlcnZpY2VdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFYRHJhZ0RpcmVjdGl2ZSxcbiAgICBBWERyYWdIYW5kbGVEaXJlY3RpdmUsXG4gICAgQVhEcm9wTGlzdERpcmVjdGl2ZSxcbiAgICBBWEZvY3VzVHJhcERpcmVjdGl2ZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEFYQnV0dG9uQ29tcG9uZW50LFxuICAgIEFYQ2hlY2tCb3hDb21wb25lbnQsXG4gICAgQVhCYWRnZUNvbXBvbmVudCxcbiAgICBBWERlY29yYXRvckljb25Db21wb25lbnQsXG4gICAgQVhUb29sdGlwRGlyZWN0aXZlLFxuICBdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdheC10cmVlLXZpZXcnLFxuICAgIHJvbGU6ICd0cmVlJyxcbiAgICB0YWJpbmRleDogJzAnLFxuICAgICdbY2xhc3MuYXgtdHJlZS12aWV3LWRlZmF1bHRdJzogXCJsb29rKCkgPT09ICdkZWZhdWx0J1wiLFxuICAgICdbY2xhc3MuYXgtdHJlZS12aWV3LWNhcmRdJzogXCJsb29rKCkgPT09ICdjYXJkJ1wiLFxuICAgICdbY2xhc3MuYXgtdHJlZS12aWV3LXdpdGgtbGluZV0nOiBcImxvb2soKSA9PT0gJ3dpdGgtbGluZSdcIixcbiAgICAnW2NsYXNzLmF4LXRyZWUtdmlldy1ydGxdJzogJ2lzUnRsJyxcbiAgICAnW3N0eWxlLi0tYXgtdHJlZS12aWV3LWluZGVudC1zaXplXSc6IFwiaW5kZW50U2l6ZSgpICsgJ3B4J1wiLFxuICAgICdbc3R5bGUuLS1heC10cmVlLXZpZXctbGluZS1vZmZzZXRdJzogXCIoaW5kZW50U2l6ZSgpIC8gMikgKyAncHgnXCIsXG4gICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ1wiVHJlZSBuYXZpZ2F0aW9uXCInLFxuICAgICcoa2V5ZG93biknOiAnaGFuZGxlS2V5RG93bigkZXZlbnQpJyxcbiAgICAnKGZvY3VzKSc6ICdvblRyZWVGb2N1cygkZXZlbnQpJyxcbiAgICAnKGJsdXIpJzogJ29uVHJlZUJsdXIoJGV2ZW50KScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJlZVZpZXdDb21wb25lbnQge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBEZXBlbmRlbmNpZXMgPT09PT09PT09PT09PT09PT09PT1cbiAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZSA9IGluamVjdChBWFRyZWVWaWV3U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1TZXJ2aWNlID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gSW5wdXRzID09PT09PT09PT09PT09PT09PT09XG4gIC8qKiBUcmVlIGRhdGEgc291cmNlIC0gY2FuIGJlIHN0YXRpYyBhcnJheSBvciBsYXp5IGxvYWRpbmcgZnVuY3Rpb24gKi9cbiAgcmVhZG9ubHkgZGF0YXNvdXJjZSA9IG1vZGVsLnJlcXVpcmVkPEFYVHJlZVZpZXdEYXRhU291cmNlPigpO1xuXG4gIC8qKiBTZWxlY3Rpb24gbW9kZTogJ3NpbmdsZScgKGNsaWNrIHRvIHNlbGVjdCkgb3IgJ211bHRpcGxlJyAoY2hlY2tib3ggc2VsZWN0aW9uKS4gRGVmYXVsdDogYCdzaW5nbGUnYC4gSW4gbXVsdGlwbGUgbW9kZSwgY2hlY2tib3hlcyBhcmUgYXV0b21hdGljYWxseSBzaG93bi4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0TW9kZSA9IGlucHV0PEFYVHJlZVZpZXdTZWxlY3RNb2RlPignc2luZ2xlJyk7XG5cbiAgLyoqIFNlbGVjdGlvbiBiZWhhdmlvcjogJ2FsbCcgKHNlbGVjdCBhbnl0aGluZywgbm8gc3BlY2lhbCBiZWhhdmlvciksICdpbnRlcm1lZGlhdGUnIChwYXJlbnQgaW5kZXRlcm1pbmF0ZSBzdGF0ZSB3aGVuIGNoaWxkcmVuIHNlbGVjdGVkKSwgJ2xlYWYnIChvbmx5IGxlYWYgbm9kZXMgc2VsZWN0YWJsZSksICduZXN0ZWQnIChzZWxlY3RpbmcgcGFyZW50IHNlbGVjdHMgYWxsIGNoaWxkcmVuKS4gRGVmYXVsdDogYCdpbnRlcm1lZGlhdGUnYCAqL1xuICByZWFkb25seSBzZWxlY3Rpb25CZWhhdmlvciA9IGlucHV0PEFYVHJlZVZpZXdTZWxlY3Rpb25CZWhhdmlvcj4oJ2ludGVybWVkaWF0ZScpO1xuXG4gIC8qKiBEcmFnIGFyZWE6ICdoYW5kbGVyJyAoZHJhZyBoYW5kbGUpLCAnaXRlbScgKGVudGlyZSBpdGVtKS4gRGVmYXVsdDogYCdoYW5kbGVyJ2AgKi9cbiAgcmVhZG9ubHkgZHJhZ0FyZWEgPSBpbnB1dDxBWFRyZWVWaWV3RHJhZ0FyZWE+KCdoYW5kbGVyJyk7XG5cbiAgLyoqIERyYWcgYmVoYXZpb3I6ICdub25lJyAoZGlzYWJsZWQpLCAnb3JkZXItb25seScgKHJlb3JkZXIgb25seSksICdtb3ZlJyAobW92ZSBiZXR3ZWVuIHBhcmVudHMpLCAnYm90aCcgKGFsbG93IGJvdGgpLiBEZWZhdWx0OiBgJ25vbmUnYCAqL1xuICByZWFkb25seSBkcmFnQmVoYXZpb3IgPSBpbnB1dDxBWFRyZWVWaWV3RHJhZ0JlaGF2aW9yPignbm9uZScpO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgaWNvbnMuIERlZmF1bHQ6IGB0cnVlYCAqL1xuICByZWFkb25seSBzaG93SWNvbnMgPSBpbnB1dCh0cnVlKTtcblxuICAvKiogV2hldGhlciB0byBzaG93IGNoaWxkcmVuIGNvdW50IGJhZGdlLiBEZWZhdWx0OiBgdHJ1ZWAgKi9cbiAgcmVhZG9ubHkgc2hvd0NoaWxkcmVuQmFkZ2UgPSBpbnB1dCh0cnVlKTtcblxuICAvKiogQ3VzdG9tIGljb24gZm9yIGV4cGFuZGVkIG5vZGVzLiBEZWZhdWx0OiBgJ2ZhLXNvbGlkIGZhLWNoZXZyb24tZG93bidgICovXG4gIHJlYWRvbmx5IGV4cGFuZGVkSWNvbiA9IGlucHV0KCdmYS1zb2xpZCBmYS1jaGV2cm9uLWRvd24nKTtcblxuICAvKiogQ3VzdG9tIGljb24gZm9yIGNvbGxhcHNlZCBub2Rlcy4gRGVmYXVsdDogYCdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0J2AgKi9cbiAgcmVhZG9ubHkgY29sbGFwc2VkSWNvbiA9IGlucHV0KCdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0Jyk7XG5cbiAgLyoqIEluZGVudCBzaXplIGluIHBpeGVscyBmb3IgZWFjaCBsZXZlbC4gRGVmYXVsdDogYDE2YCAqL1xuICByZWFkb25seSBpbmRlbnRTaXplID0gaW5wdXQoMTYpO1xuXG4gIC8qKiBWaXN1YWwgc3R5bGUgdmFyaWFudC4gRGVmYXVsdDogYCdkZWZhdWx0J2AgKi9cbiAgcmVhZG9ubHkgbG9vayA9IGlucHV0PEFYVHJlZVZpZXdWaWV3TG9vaz4oJ2RlZmF1bHQnKTtcblxuICAvKiogQ3VzdG9tIHRlbXBsYXRlIGZvciB0cmVlIGl0ZW1zLiBEZWZhdWx0OiBgdW5kZWZpbmVkYCAqL1xuICByZWFkb25seSBub2RlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxBWFRyZWVWaWV3Tm9kZVRlbXBsYXRlQ29udGV4dD4+KCk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIG5vZGUgSUQuIERlZmF1bHQ6IGAnaWQnYCAqL1xuICByZWFkb25seSBpZEZpZWxkID0gaW5wdXQoJ2lkJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIG5vZGUgdGl0bGUuIERlZmF1bHQ6IGAndGl0bGUnYCAqL1xuICByZWFkb25seSB0aXRsZUZpZWxkID0gaW5wdXQoJ3RpdGxlJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIG5vZGUgdG9vbHRpcC4gRGVmYXVsdDogYCd0b29sdGlwJ2AgKi9cbiAgcmVhZG9ubHkgdG9vbHRpcEZpZWxkID0gaW5wdXQoJ3Rvb2x0aXAnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3Igbm9kZSBpY29uLiBEZWZhdWx0OiBgJ2ljb24nYCAqL1xuICByZWFkb25seSBpY29uRmllbGQgPSBpbnB1dCgnaWNvbicpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBleHBhbmRlZCBzdGF0ZS4gRGVmYXVsdDogYCdleHBhbmRlZCdgICovXG4gIHJlYWRvbmx5IGV4cGFuZGVkRmllbGQgPSBpbnB1dCgnZXhwYW5kZWQnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3Igc2VsZWN0ZWQgc3RhdGUuIERlZmF1bHQ6IGAnc2VsZWN0ZWQnYCAqL1xuICByZWFkb25seSBzZWxlY3RlZEZpZWxkID0gaW5wdXQoJ3NlbGVjdGVkJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGluZGV0ZXJtaW5hdGUgc3RhdGUuIERlZmF1bHQ6IGAnaW5kZXRlcm1pbmF0ZSdgICovXG4gIHJlYWRvbmx5IGluZGV0ZXJtaW5hdGVGaWVsZCA9IGlucHV0KCdpbmRldGVybWluYXRlJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGRpc2FibGVkIHN0YXRlLiBEZWZhdWx0OiBgJ2Rpc2FibGVkJ2AgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWRGaWVsZCA9IGlucHV0KCdkaXNhYmxlZCcpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBoaWRkZW4gc3RhdGUuIERlZmF1bHQ6IGAnaGlkZGVuJ2AgKi9cbiAgcmVhZG9ubHkgaGlkZGVuRmllbGQgPSBpbnB1dCgnaGlkZGVuJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGFycmF5LiBEZWZhdWx0OiBgJ2NoaWxkcmVuJ2AgKi9cbiAgcmVhZG9ubHkgY2hpbGRyZW5GaWVsZCA9IGlucHV0KCdjaGlsZHJlbicpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBjb3VudC4gRGVmYXVsdDogYCdjaGlsZHJlbkNvdW50J2AgKi9cbiAgcmVhZG9ubHkgY2hpbGRyZW5Db3VudEZpZWxkID0gaW5wdXQoJ2NoaWxkcmVuQ291bnQnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3IgY3VzdG9tIGRhdGEuIERlZmF1bHQ6IGAnZGF0YSdgICovXG4gIHJlYWRvbmx5IGRhdGFGaWVsZCA9IGlucHV0KCdkYXRhJyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gT3V0cHV0cyA9PT09PT09PT09PT09PT09PT09PVxuICAvKiogRW1pdHRlZCBiZWZvcmUgYSBkcm9wIG9wZXJhdGlvbiAtIHNldCBjYW5jZWxlZCB0byB0cnVlIHRvIHByZXZlbnQgZHJvcCAqL1xuICByZWFkb25seSBvbkJlZm9yZURyb3AgPSBvdXRwdXQ8QVhUcmVlVmlld0JlZm9yZURyb3BFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgbm9kZSBpcyB0b2dnbGVkIChleHBhbmRlZC9jb2xsYXBzZWQpICovXG4gIHJlYWRvbmx5IG9uTm9kZVRvZ2dsZSA9IG91dHB1dDxBWFRyZWVWaWV3Tm9kZVRvZ2dsZUV2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWQgKi9cbiAgcmVhZG9ubHkgb25Ob2RlU2VsZWN0ID0gb3V0cHV0PEFYVHJlZVZpZXdOb2RlU2VsZWN0RXZlbnQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgZG91YmxlLWNsaWNrZWQgKi9cbiAgcmVhZG9ubHkgb25Ob2RlRG91YmxlQ2xpY2sgPSBvdXRwdXQ8QVhUcmVlVmlld05vZGVEb3VibGVDbGlja0V2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIGRvdWJsZS1jbGlja2VkICovXG4gIHJlYWRvbmx5IG9uTm9kZUNsaWNrID0gb3V0cHV0PEFYVHJlZVZpZXdOb2RlQ2xpY2tFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIC0gcmV0dXJucyBhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzICovXG4gIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PEFYVHJlZVZpZXdTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIG5vZGVzIGFyZSByZW9yZGVyZWQgd2l0aGluIHRoZSBzYW1lIHBhcmVudCAqL1xuICByZWFkb25seSBvbk9yZGVyQ2hhbmdlID0gb3V0cHV0PEFYVHJlZVZpZXdEcm9wRXZlbnQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFyZW50ICovXG4gIHJlYWRvbmx5IG9uTW92ZUNoYW5nZSA9IG91dHB1dDxBWFRyZWVWaWV3RHJvcEV2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIGZvciBhbnkgaXRlbSBjaGFuZ2UgKG9yZGVyIG9yIG1vdmUpICovXG4gIHJlYWRvbmx5IG9uSXRlbXNDaGFuZ2UgPSBvdXRwdXQ8QVhUcmVlVmlld0Ryb3BFdmVudD4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnRlcm5hbCBTdGF0ZSA9PT09PT09PT09PT09PT09PT09PVxuICAvKiogSW50ZXJuYWwgc2lnbmFsIGZvciB0cmVlIG5vZGVzICovXG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlcyA9IHNpZ25hbDxBWFRyZWVWaWV3Tm9kZVtdPihbXSk7XG5cbiAgLyoqIEludGVybmFsIHNpZ25hbCBmb3IgdHJhY2tpbmcgbG9hZGluZyBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGluZ05vZGVzID0gc2lnbmFsPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXG4gIC8qKiBDdXJyZW50bHkgZm9jdXNlZCBub2RlIElEIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCByZWFkb25seSBmb2N1c2VkTm9kZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBSVEwgZGV0ZWN0aW9uIHNpZ25hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNSdGwgPSBzaWduYWwodGhpcy5wbGF0Zm9ybVNlcnZpY2UuaXNSdGwoKSk7XG5cbiAgLyoqIGFjdGl2ZSBub2RlIGlkICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVOb2RlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIENvbXB1dGVkIGNoZXZyb24gaWNvbnMgdGhhdCBmbGlwIGZvciBSVEwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpcmVjdGlvbkV4cGFuZGVkSWNvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZXhwYW5kZWRJY29uKCkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkaXJlY3Rpb25Db2xsYXBzZWRJY29uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGlzUnRsRGlyZWN0aW9uID0gdGhpcy5pc1J0bCgpO1xuICAgIGNvbnN0IGRlZmF1bHRJY29uID0gdGhpcy5jb2xsYXBzZWRJY29uKCk7XG5cbiAgICBpZiAoaXNSdGxEaXJlY3Rpb24gJiYgZGVmYXVsdEljb24gPT09ICdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0Jykge1xuICAgICAgcmV0dXJuICdmYS1zb2xpZCBmYS1jaGV2cm9uLWxlZnQnO1xuICAgIH1cbiAgICBpZiAoIWlzUnRsRGlyZWN0aW9uICYmIGRlZmF1bHRJY29uID09PSAnZmEtc29saWQgZmEtY2hldnJvbi1sZWZ0Jykge1xuICAgICAgcmV0dXJuICdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRJY29uO1xuICB9KTtcblxuICAvKiogRmxhZyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZW4gc3luY2luZyBkYXRhc291cmNlICovXG4gIHByaXZhdGUgaXNVcGRhdGluZ0Zyb21EYXRhc291cmNlID0gZmFsc2U7XG5cbiAgLyoqIENvbXB1dGVkIHRvIGNoZWNrIGlmIGRhdGFzb3VyY2UgaXMgYSBmdW5jdGlvbiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGlzTGF6eURhdGFTb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB0eXBlb2YgdGhpcy5kYXRhc291cmNlKCkgPT09ICdmdW5jdGlvbicpO1xuXG4gIC8qKiBDb21wdXRlZDogUmV0dXJucyB0cnVlIHdoZW4gc2VsZWN0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gbGVhZiBub2RlcyBvbmx5ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0xlYWZPbmx5TW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uQmVoYXZpb3IoKSA9PT0gJ2xlYWYnKTtcblxuICAvKiogQ29tcHV0ZWQ6IFJldHVybnMgdHJ1ZSB3aGVuIHNlbGVjdGluZyBhIHBhcmVudCBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgYWxsIGl0cyBjaGlsZHJlbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FzY2FkZXNUb0NoaWxkcmVuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJlaGF2aW9yID0gdGhpcy5zZWxlY3Rpb25CZWhhdmlvcigpO1xuICAgIHJldHVybiBiZWhhdmlvciA9PT0gJ25lc3RlZCcgfHwgYmVoYXZpb3IgPT09ICdpbnRlcm1lZGlhdGUtbmVzdGVkJztcbiAgfSk7XG5cbiAgLyoqIENvbXB1dGVkOiBSZXR1cm5zIHRydWUgd2hlbiBwYXJlbnQgbm9kZXMgc2hvdyBpbmRldGVybWluYXRlIHN0YXRlIGJhc2VkIG9uIGNoaWxkcmVuIHNlbGVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW50ZXJtZWRpYXRlU3RhdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmVoYXZpb3IgPSB0aGlzLnNlbGVjdGlvbkJlaGF2aW9yKCk7XG4gICAgcmV0dXJuIGJlaGF2aW9yID09PSAnaW50ZXJtZWRpYXRlJyB8fCBiZWhhdmlvciA9PT0gJ2ludGVybWVkaWF0ZS1uZXN0ZWQnO1xuICB9KTtcblxuICAvKiogQ29tcHV0ZWQ6IFJldHVybnMgdHJ1ZSB3aGVuIGRyYWcgaGFuZGxlIHNob3VsZCBiZSBzaG93biAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkU2hvd0RyYWdIYW5kbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0FyZWEoKSA9PT0gJ2hhbmRsZXInICYmIHRoaXMuZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJztcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTm9kZSBQcm9wZXJ0eSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBHZXQgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGEgbm9kZSB1c2luZyB0aGUgY29uZmlndXJlZCBmaWVsZCBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZVByb3A8VCA9IHVua25vd24+KG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBmaWVsZE5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQge1xuICAgIHJldHVybiAobm9kZVtmaWVsZE5hbWVdIGFzIFQpID8/IChkZWZhdWx0VmFsdWUgYXMgVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcHJvcGVydHkgdmFsdWUgb24gYSBub2RlIHVzaW5nIHRoZSBjb25maWd1cmVkIGZpZWxkIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBzZXROb2RlUHJvcChub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgbm9kZVtmaWVsZE5hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlSWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGVQcm9wPHN0cmluZz4obm9kZSwgdGhpcy5pZEZpZWxkKCksICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSB0aXRsZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVUaXRsZShub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nPihub2RlLCB0aGlzLnRpdGxlRmllbGQoKSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIHRvb2x0aXBcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlVG9vbHRpcChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLnRvb2x0aXBGaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGljb25cbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlSWNvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLmljb25GaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGV4cGFuZGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZUV4cGFuZGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8Ym9vbGVhbj4obm9kZSwgdGhpcy5leHBhbmRlZEZpZWxkKCksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbm9kZSBleHBhbmRlZCBzdGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldE5vZGVFeHBhbmRlZChub2RlOiBBWFRyZWVWaWV3Tm9kZSwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldE5vZGVQcm9wKG5vZGUsIHRoaXMuZXhwYW5kZWRGaWVsZCgpLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgc2VsZWN0ZWQgc3RhdGVcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlU2VsZWN0ZWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxib29sZWFuPihub2RlLCB0aGlzLnNlbGVjdGVkRmllbGQoKSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBub2RlIHNlbGVjdGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0Tm9kZVNlbGVjdGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5zZWxlY3RlZEZpZWxkKCksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBpbmRldGVybWluYXRlIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxib29sZWFuPihub2RlLCB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG5vZGUgaW5kZXRlcm1pbmF0ZSBzdGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldE5vZGVJbmRldGVybWluYXRlKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGRpc2FibGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZURpc2FibGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8Ym9vbGVhbj4obm9kZSwgdGhpcy5kaXNhYmxlZEZpZWxkKCksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBoaWRkZW4gc3RhdGVcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlSGlkZGVuKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8Ym9vbGVhbj4obm9kZSwgdGhpcy5oaWRkZW5GaWVsZCgpLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgY2hpbGRyZW4gYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlQ2hpbGRyZW4obm9kZTogQVhUcmVlVmlld05vZGUpOiBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLmNoaWxkcmVuRmllbGQoKSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbm9kZSBjaGlsZHJlbiBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldE5vZGVDaGlsZHJlbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgdmFsdWU6IEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnNldE5vZGVQcm9wKG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgY2hpbGRyZW4gY291bnRcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlQ2hpbGRyZW5Db3VudChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8bnVtYmVyIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBub2RlIGNoaWxkcmVuIGNvdW50XG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0Tm9kZUNoaWxkcmVuQ291bnQobm9kZTogQVhUcmVlVmlld05vZGUsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnNldE5vZGVQcm9wKG5vZGUsIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksIHZhbHVlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEVmZmVjdHMgPT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIEVmZmVjdCB0byBoYW5kbGUgZGF0YXNvdXJjZSBjaGFuZ2VzICovXG4gIHJlYWRvbmx5ICNkYXRhc291cmNlRWZmZWN0ID0gZWZmZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAodGhpcy5pc1VwZGF0aW5nRnJvbURhdGFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkcyA9IHRoaXMuZGF0YXNvdXJjZSgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRzKSkge1xuICAgICAgdGhpcy5ub2Rlcy5zZXQoWy4uLmRzXSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFJvb3RJdGVtcyhkcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKCdGYWlsZWQgdG8gbG9hZCByb290IGl0ZW1zJywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLyoqIEluaXRpYWxpemUgZGlyZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciAqL1xuICByZWFkb25seSAjaW5pdERpcmVjdGlvbkxpc3RlbmVyID0gYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICB0aGlzLnBsYXRmb3JtU2VydmljZS5kaXJlY3Rpb25DaGFuZ2VcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGV2ZW50KSA9PiBldmVudC5kYXRhID09PSAncnRsJyksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoaXNSdGwpID0+IHRoaXMuaXNSdGwuc2V0KGlzUnRsKSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFB1YmxpYyBBUEkgPT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEV4cGFuZCBhbGwgbm9kZXMgaW4gdGhlIHRyZWUgKHdpdGggbGF6eSBsb2FkaW5nIHN1cHBvcnQpXG4gICAqL1xuICBhc3luYyBleHBhbmRBbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cmVlU2VydmljZS5zZXRFeHBhbmRlZFN0YXRlKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuaXNMYXp5RGF0YVNvdXJjZSgpLFxuICAgICAgKG5vZGUpID0+IHRoaXMubG9hZE5vZGVDaGlsZHJlbihub2RlKSxcbiAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLFxuICAgICk7XG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZSBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcbiAgICovXG4gIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMudHJlZVNlcnZpY2Uuc2V0RXhwYW5kZWRTdGF0ZShcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhpcy5pc0xhenlEYXRhU291cmNlKCksXG4gICAgICAobm9kZSkgPT4gdGhpcy5sb2FkTm9kZUNoaWxkcmVuKG5vZGUpLFxuICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgKTtcbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb3VudCBvZiBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmNvdW50U2VsZWN0ZWQodGhpcy5ub2RlcygpLCB0aGlzLnNlbGVjdGVkRmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBub2RlcyBhcmUgc2VsZWN0ZWRcbiAgICovXG4gIGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZENvdW50KCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgc2VsZWN0ZWQgbm9kZXNcbiAgICovXG4gIGdldFNlbGVjdGVkTm9kZXMoKTogQVhUcmVlVmlld05vZGVbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQ6IEFYVHJlZVZpZXdOb2RlW10gPSBbXTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxlY3RTZWxlY3RlZCh0aGlzLm5vZGVzKCksIHNlbGVjdGVkLCB0aGlzLnNlbGVjdGVkRmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgc2VsZWN0ZWQgbm9kZXMgZnJvbSB0aGUgdHJlZVxuICAgKi9cbiAgZGVsZXRlU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy50cmVlU2VydmljZS5yZW1vdmVTZWxlY3RlZChcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICk7XG4gICAgaWYgKCF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlQWxsUGFyZW50U3RhdGVzKFxuICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgIHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYWxsIG5vZGVzIGluIHRoZSB0cmVlXG4gICAqL1xuICBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbm9uZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgbGVhZiBub2Rlc1xuICAgICAgY29uc3Qgc2VsZWN0TGVhZnMgPSAobm9kZXM6IEFYVHJlZVZpZXdOb2RlW10pOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNMZWFmTm9kZShub2RlKSAmJiAhdGhpcy5nZXROb2RlRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBzZWxlY3RMZWFmcyhjaGlsZHJlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2VsZWN0TGVhZnModGhpcy5ub2RlcygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZXRBbGxTZWxlY3Rpb24oXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcbiAgICovXG4gIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMudHJlZVNlcnZpY2Uuc2V0QWxsU2VsZWN0aW9uKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgZmFsc2UsXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIG5vZGUgYnkgSUQgaW4gdGhlIHRyZWVcbiAgICovXG4gIGZpbmROb2RlKGlkOiBzdHJpbmcpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmZpbmROb2RlQnlJZCh0aGlzLm5vZGVzKCksIGlkLCB0aGlzLmlkRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgdHJlZSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgaXMgY3VycmVudGx5IGxvYWRpbmdcbiAgICovXG4gIGlzTm9kZUxvYWRpbmcobm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nTm9kZXMoKS5oYXMobm9kZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9hZGluZyBzdGF0ZSBmb3IgYSBub2RlIChpbnRlcm5hbCBzdGF0ZSlcbiAgICovXG4gIGdldE5vZGVMb2FkaW5nKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ05vZGVzKCkuaGFzKHRoaXMuZ2V0Tm9kZUlkKG5vZGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0L3VwZGF0ZSBhIG5vZGUncyBwcm9wZXJ0aWVzXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gZWRpdFxuICAgKiBAcGFyYW0gdXBkYXRlcyAtIFBhcnRpYWwgbm9kZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGVkaXROb2RlKG5vZGVJZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPEFYVHJlZVZpZXdOb2RlPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLnRyZWVTZXJ2aWNlLmVkaXROb2RlKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgbm9kZUlkLFxuICAgICAgdXBkYXRlcyxcbiAgICAgIHRoaXMuaWRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLFxuICAgICk7XG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNoaWxkIG5vZGUgdG8gYSBwYXJlbnQgbm9kZVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgSUQgb2YgdGhlIHBhcmVudCBub2RlXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgLSBUaGUgY2hpbGQgbm9kZSB0byBhZGRcbiAgICogQHBhcmFtIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IGF0IChkZWZhdWx0OiBhcHBlbmQgdG8gZW5kKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhcmVudCB3YXMgZm91bmQgYW5kIGNoaWxkIHdhcyBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBhZGRDaGlsZChwYXJlbnRJZDogc3RyaW5nLCBjaGlsZE5vZGU6IEFYVHJlZVZpZXdOb2RlLCBpbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHJlZVNlcnZpY2UuYWRkQ2hpbGQoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGNoaWxkTm9kZSxcbiAgICAgIGluZGV4LFxuICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmV4cGFuZGVkRmllbGQoKSxcbiAgICApO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgdHJlZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBUaGUgcmVtb3ZlZCBub2RlIGlmIGZvdW5kLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgcmVtb3ZlTm9kZShub2RlSWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMudHJlZVNlcnZpY2UucmVtb3ZlTm9kZShcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIG5vZGVJZCxcbiAgICAgIHRoaXMuaWRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIC8vIFVwZGF0ZSBwYXJlbnQgc3RhdGVzIGlmIG5lZWRlZFxuICAgICAgaWYgKHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSkge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZUFsbFBhcmVudFN0YXRlcyhcbiAgICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgYSBzcGVjaWZpYyBub2RlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gZXhwYW5kXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV4cGFuc2lvbiBpcyBjb21wbGV0ZSAoaWYgbGF6eSBsb2FkaW5nKVxuICAgKi9cbiAgYXN5bmMgZXhwYW5kTm9kZShub2RlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSB0aGlzLnRyZWVTZXJ2aWNlLmhhc0NoaWxkcmVuKG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgICBjb25zdCBjYW5MYXp5TG9hZCA9IHRoaXMudHJlZVNlcnZpY2UuY2FuTGF6eUxvYWQoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5pc0xhenlEYXRhU291cmNlKCksXG4gICAgICB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbiB8fCBjYW5MYXp5TG9hZCkge1xuICAgICAgaWYgKGNhbkxhenlMb2FkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG5vZGUsIHRydWUpO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHRoaXMub25Ob2RlVG9nZ2xlLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBuZXcgRXZlbnQoJ2V4cGFuZCcpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZSBhIHNwZWNpZmljIG5vZGVcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBjb2xsYXBzZVxuICAgKi9cbiAgY29sbGFwc2VOb2RlKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXROb2RlRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgIHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG5vZGUsIGZhbHNlKTtcbiAgICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgICB0aGlzLm9uTm9kZVRvZ2dsZS5lbWl0KHsgY29tcG9uZW50OiB0aGlzLCBub2RlLCBuYXRpdmVFdmVudDogbmV3IEV2ZW50KCdjb2xsYXBzZScpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZXhwYW5zaW9uIHN0YXRlIG9mIGEgc3BlY2lmaWMgbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIHRvZ2dsZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0b2dnbGUgaXMgY29tcGxldGUgKGlmIGxhenkgbG9hZGluZylcbiAgICovXG4gIGFzeW5jIHRvZ2dsZU5vZGVFeHBhbnNpb24obm9kZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdldE5vZGVFeHBhbmRlZChub2RlKSkge1xuICAgICAgdGhpcy5jb2xsYXBzZU5vZGUobm9kZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5leHBhbmROb2RlKG5vZGVJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IGEgbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgd2FzIGZvdW5kIGFuZCBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBzZWxlY3ROb2RlKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgdGhpcy5nZXROb2RlRGlzYWJsZWQobm9kZSkgfHwgIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGUgPSB0aGlzLnNlbGVjdE1vZGUoKTtcbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuZGVzZWxlY3RBbGxOb2RlcyhcbiAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZVBhcmVudFN0YXRlcyhcbiAgICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCksXG4gICAgICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IGRlc2VsZWN0IGEgbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIGRlc2VsZWN0XG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSB3YXMgZm91bmQgYW5kIGRlc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgZGVzZWxlY3ROb2RlKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCBmYWxzZSk7XG4gICAgdGhpcy5zZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlLCBmYWxzZSk7XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2Uuc2VsZWN0QWxsQ2hpbGRyZW4oXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlUGFyZW50U3RhdGVzKFxuICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSxcbiAgICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLm9uTm9kZVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogZmFsc2UsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmVudCBub2RlIG9mIGEgZ2l2ZW4gbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlXG4gICAqIEByZXR1cm5zIFRoZSBwYXJlbnQgbm9kZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGdldFBhcmVudChub2RlSWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlIHwgbnVsbCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5maW5kUGFyZW50Tm9kZSh0aGlzLm5vZGVzKCksIG5vZGUsIHRoaXMuaWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hpbGRyZW4gb2YgYSBub2RlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIHBhcmVudCBub2RlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNoaWxkIG5vZGVzLCBvciBudWxsIGlmIG5vZGUgbm90IGZvdW5kXG4gICAqL1xuICBnZXRDaGlsZHJlbihub2RlSWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlW10gfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJvb3Qgbm9kZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygcm9vdCBub2Rlc1xuICAgKi9cbiAgZ2V0Um9vdE5vZGVzKCk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5ub2RlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIG5vZGVzIGluIGEgZmxhdCBhcnJheVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcbiAgICovXG4gIGdldEFsbE5vZGVzKCk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmdldEFsbE5vZGVzKHRoaXMubm9kZXMoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB0byBhIG5vZGUgKGFycmF5IG9mIHBhcmVudCBJRHMgZnJvbSByb290IHRvIG5vZGUpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9kZSBJRHMgcmVwcmVzZW50aW5nIHRoZSBwYXRoLCBvciBlbXB0eSBhcnJheSBpZiBub2RlIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0Tm9kZVBhdGgobm9kZUlkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9kZVBhdGggPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVQYXRoKHRoaXMubm9kZXMoKSwgbm9kZUlkLCB0aGlzLmlkRmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIHJldHVybiBub2RlUGF0aC5tYXAoKG5vZGUpID0+IHRoaXMuZ2V0Tm9kZUlkKG5vZGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxldmVsL2RlcHRoIG9mIGEgbm9kZSAoMCA9IHJvb3QgbGV2ZWwpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgVGhlIGxldmVsIG9mIHRoZSBub2RlLCBvciAtMSBpZiBub2RlIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0Tm9kZUxldmVsKG5vZGVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5nZXROb2RlTGV2ZWwodGhpcy5ub2RlcygpLCBub2RlSWQsIHRoaXMuaWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBtb3ZlIGEgbm9kZSB0byBhIG5ldyBwYXJlbnRcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBtb3ZlXG4gICAqIEBwYXJhbSBuZXdQYXJlbnRJZCAtIFRoZSBJRCBvZiB0aGUgbmV3IHBhcmVudCAodW5kZWZpbmVkIGZvciByb290IGxldmVsKVxuICAgKiBAcGFyYW0gaW5kZXggLSBPcHRpb25hbCBpbmRleCB0byBpbnNlcnQgYXQgKGRlZmF1bHQ6IGFwcGVuZCB0byBlbmQpXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbW92ZSB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBtb3ZlTm9kZShub2RlSWQ6IHN0cmluZywgbmV3UGFyZW50SWQ/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cmVlU2VydmljZS5tb3ZlTm9kZShcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIG5vZGVJZCxcbiAgICAgIG5ld1BhcmVudElkLFxuICAgICAgaW5kZXgsXG4gICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSxcbiAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICk7XG5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0Lm1vdmVkTm9kZSkge1xuICAgICAgLy8gRW1pdCBkcm9wIGV2ZW50c1xuICAgICAgdGhpcy5lbWl0RHJvcEV2ZW50cyhcbiAgICAgICAgcmVzdWx0Lm1vdmVkTm9kZSxcbiAgICAgICAgcmVzdWx0LnByZXZpb3VzUGFyZW50LFxuICAgICAgICByZXN1bHQubmV3UGFyZW50LFxuICAgICAgICByZXN1bHQucHJldmlvdXNJbmRleCxcbiAgICAgICAgcmVzdWx0LmN1cnJlbnRJbmRleCxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSBhIG5vZGUgKGNyZWF0ZXMgYSBkZWVwIGNvcHkpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gY2xvbmVcbiAgICogQHJldHVybnMgVGhlIGNsb25lZCBub2RlLCBvciBudWxsIGlmIG5vZGUgbm90IGZvdW5kXG4gICAqL1xuICBjbG9uZU5vZGUobm9kZUlkOiBzdHJpbmcpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5jbG9uZU5vZGUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICB0aGlzLnRpdGxlRmllbGQoKSxcbiAgICAgIHRoaXMudG9vbHRpcEZpZWxkKCksXG4gICAgICB0aGlzLmljb25GaWVsZCgpLFxuICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaGlkZGVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmRhdGFGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyBhIHNwZWNpZmljIG5vZGUgYnkgSURcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBmb2N1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgd2FzIGZvdW5kIGFuZCBmb2N1c2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGZvY3VzTm9kZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlIHx8IHRoaXMuZ2V0Tm9kZUhpZGRlbihub2RlKSA9PT0gdHJ1ZSB8fCB0aGlzLmdldE5vZGVEaXNhYmxlZChub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzTm9kZUJ5SWQobm9kZUlkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGV4cGFuZGVkIG5vZGVzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGV4cGFuZGVkIG5vZGVzXG4gICAqL1xuICBnZXRFeHBhbmRlZE5vZGVzKCk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIGNvbnN0IGV4cGFuZGVkOiBBWFRyZWVWaWV3Tm9kZVtdID0gW107XG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXM6IEFYVHJlZVZpZXdOb2RlW10pOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICBpZiAodGhpcy5nZXROb2RlRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgICAgICBleHBhbmRlZC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgIHRyYXZlcnNlKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdHJhdmVyc2UodGhpcy5ub2RlcygpKTtcbiAgICByZXR1cm4gZXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjb2xsYXBzZWQgbm9kZXMgdGhhdCBoYXZlIGNoaWxkcmVuXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbGxhcHNlZCBub2RlcyB3aXRoIGNoaWxkcmVuXG4gICAqL1xuICBnZXRDb2xsYXBzZWROb2RlcygpOiBBWFRyZWVWaWV3Tm9kZVtdIHtcbiAgICBjb25zdCBjb2xsYXBzZWQ6IEFYVHJlZVZpZXdOb2RlW10gPSBbXTtcbiAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlczogQVhUcmVlVmlld05vZGVbXSk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpICYmIChjaGlsZHJlbj8ubGVuZ3RoIHx8IGNoaWxkcmVuQ291bnQpKSB7XG4gICAgICAgICAgY29sbGFwc2VkLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgdHJhdmVyc2UoY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0cmF2ZXJzZSh0aGlzLm5vZGVzKCkpO1xuICAgIHJldHVybiBjb2xsYXBzZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGlzIGV4cGFuZGVkXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGV4cGFuZGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGlzTm9kZUV4cGFuZGVkKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICByZXR1cm4gbm9kZSA/IHRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGlzTm9kZVNlbGVjdGVkKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICByZXR1cm4gbm9kZSA/IHRoaXMuZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGhhcyBjaGlsZHJlblxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSBoYXMgY2hpbGRyZW4sIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hpbGRyZW4obm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmhhc0NoaWxkcmVuKG5vZGUgPz8ge30sIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGVtcGxhdGUgY29udGV4dCBmb3IgYSBub2RlXG4gICAqL1xuICBnZXRUZW1wbGF0ZUNvbnRleHQobm9kZTogQVhUcmVlVmlld05vZGUsIGxldmVsID0gMCk6IEFYVHJlZVZpZXdOb2RlVGVtcGxhdGVDb250ZXh0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIGNvbnN0IGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpO1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IG5vZGUsXG4gICAgICBub2RlLFxuICAgICAgbGV2ZWwsXG4gICAgICBleHBhbmRlZDogdGhpcy5nZXROb2RlRXhwYW5kZWQobm9kZSksXG4gICAgICBjaGlsZHJlbkNvdW50OiBjaGlsZHJlbkNvdW50ID8/IGNoaWxkcmVuPy5sZW5ndGggPz8gMCxcbiAgICAgIGxvYWRpbmc6IHRoaXMuZ2V0Tm9kZUxvYWRpbmcobm9kZSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcGFkZGluZy1pbmxpbmUgZm9yIGEgbm9kZSBiYXNlZCBvbiBpdHMgbGV2ZWxcbiAgICovXG4gIGdldE5vZGVQYWRkaW5nSW5saW5lKGxldmVsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGluZGVudCA9IHRoaXMuaW5kZW50U2l6ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRMb29rID0gdGhpcy5sb29rKCk7XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGN1cnJlbnRMb29rID09PSAnd2l0aC1saW5lJyA/IDEgLyAzIDogMTtcbiAgICByZXR1cm4gbGV2ZWwgKiBpbmRlbnQgKiBtdWx0aXBsaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5vZGUgc2hvdWxkIHNob3cgZXhwYW5kIHRvZ2dsZVxuICAgKi9cbiAgc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmhhc0NoaWxkcmVuKG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpKSB8fFxuICAgICAgdGhpcy50cmVlU2VydmljZS5jYW5MYXp5TG9hZChub2RlLCB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSwgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjaGVja2JveGVzIHNob3VsZCBiZSBzaG93biAob25seSBmb3IgbXVsdGlwbGUgbW9kZSlcbiAgICovXG4gIHNob3VsZFNob3dDaGVja2JveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlKCkgPT09ICdtdWx0aXBsZSc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGlzIGEgbGVhZiAoaGFzIG5vIGNoaWxkcmVuKVxuICAgKiBBIG5vZGUgaXMgYSBsZWFmIGlmIGl0IGhhcyBubyBsb2FkZWQgY2hpbGRyZW4gQU5EIG5vIGNoaWxkcmVuQ291bnQgKG9yIGNoaWxkcmVuQ291bnQgaXMgMClcbiAgICovXG4gIGlzTGVhZk5vZGUobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuaGFzQ2hpbGRyZW4obm9kZSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIGNvbnN0IGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuQ291bnQgPSBjaGlsZHJlbkNvdW50ICYmIGNoaWxkcmVuQ291bnQgPiAwO1xuICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy50cmVlU2VydmljZS5jYW5MYXp5TG9hZChcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuXG4gICAgLy8gQSBub2RlIGlzIGEgbGVhZiBpZjpcbiAgICAvLyAxLiBJdCBoYXMgbm8gbG9hZGVkIGNoaWxkcmVuXG4gICAgLy8gMi4gQU5EIGl0IGhhcyBubyBjaGlsZHJlbkNvdW50IChvciBjaGlsZHJlbkNvdW50IGlzIDApXG4gICAgLy8gMy4gQU5EIGl0IGNhbm5vdCBiZSBsYXp5IGxvYWRlZFxuICAgIHJldHVybiAhaGFzQ2hpbGRyZW4gJiYgIWhhc0NoaWxkcmVuQ291bnQgJiYgIWNhbkxhenlMb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBjYW4gYmUgc2VsZWN0ZWQgKGNvbnNpZGVyaW5nIHNlbGVjdE1vZGUgYW5kIGlzTGVhZk9ubHlNb2RlKVxuICAgKi9cbiAgY2FuU2VsZWN0Tm9kZShub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUoKSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTGVhZk5vZGUobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNoZWNrYm94IHNob3VsZCBiZSBzaG93biBmb3IgYSBzcGVjaWZpYyBub2RlXG4gICAqL1xuICBzaG91bGRTaG93Q2hlY2tib3hGb3JOb2RlKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFNob3dDaGVja2JveCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTGVhZk5vZGUobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBsaXN0IElEIGZvciBlYWNoIG5vZGVcbiAgICovXG4gIGdldExpc3RJZChub2RlPzogQVhUcmVlVmlld05vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmdldExpc3RJZChub2RlLCB0aGlzLmlkRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGlzIGN1cnJlbnRseSBmb2N1c2VkXG4gICAqL1xuICBpc05vZGVGb2N1c2VkKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZE5vZGVJZCgpID09PSBub2RlSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEFSSUEgbGV2ZWwgZm9yIGEgbm9kZVxuICAgKi9cbiAgZ2V0Tm9kZUFyaWFMZXZlbChsZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGV2ZWwgKyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBUklBIGV4cGFuZGVkIHN0YXRlIGZvciBhIG5vZGVcbiAgICovXG4gIGdldE5vZGVBcmlhRXhwYW5kZWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShub2RlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldE5vZGVFeHBhbmRlZChub2RlKSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEFSSUEgc2VsZWN0ZWQgc3RhdGUgZm9yIGEgbm9kZVxuICAgKi9cbiAgZ2V0Tm9kZUFyaWFTZWxlY3RlZChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUoKSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldE5vZGVTZWxlY3RlZChub2RlKTtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlKCkgPT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlKCkgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgIHJldHVybiBzZWxlY3RlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgc2VsZWN0aW9uIGNoYW5nZSBldmVudCB3aXRoIGFsbCBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSB0aGlzLmdldFNlbGVjdGVkTm9kZXMoKTtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgc2VsZWN0ZWROb2RlcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEV2ZW50IEhhbmRsZXJzID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub2RlIGRvdWJsZSBjbGlja1xuICAgKi9cbiAgb25Ob2RlRG91YmxlQ2xpY2tIYW5kbGUobm9kZTogQVhUcmVlVmlld05vZGUsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldE5vZGVEaXNhYmxlZChub2RlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5vbk5vZGVEb3VibGVDbGljay5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBuYXRpdmVFdmVudDogZXZlbnQsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEhhbmRsZSBub2RlIGNsaWNrIGhhbmRsZVxuICAgKi9cbiAgb25Ob2RlQ2xpY2tIYW5kbGUobm9kZTogQVhUcmVlVmlld05vZGUsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldE5vZGVEaXNhYmxlZChub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuXG4gICAgdGhpcy5hY3RpdmVOb2RlSWQuc2V0KHRoaXMuZ2V0Tm9kZUlkKG5vZGUpKTtcbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMuaGFuZGxlU2luZ2xlU2VsZWN0aW9uKG5vZGUsIGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm9uTm9kZUNsaWNrLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBldmVudCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgbm9kZSBleHBhbnNpb24gc3RhdGUgd2l0aCBsYXp5IGxvYWRpbmcgc3VwcG9ydFxuICAgKi9cbiAgYXN5bmMgdG9nZ2xlTm9kZShub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURpc2FibGVkKG5vZGUpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pc0V2ZW50KGV2ZW50KSAmJiB0eXBlb2YgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuaGFzQ2hpbGRyZW4obm9kZSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy50cmVlU2VydmljZS5jYW5MYXp5TG9hZChcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuIHx8IGNhbkxhenlMb2FkKSB7XG4gICAgICBjb25zdCB3aWxsRXhwYW5kID0gIXRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpO1xuXG4gICAgICBpZiAod2lsbEV4cGFuZCAmJiBjYW5MYXp5TG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG5vZGUsIHdpbGxFeHBhbmQpO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHRoaXMub25Ob2RlVG9nZ2xlLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBldmVudCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIG5vZGUgc2VsZWN0aW9uIHN0YXRlIHdpdGggaW5kZXRlcm1pbmF0ZSBzdXBwb3J0IChmb3IgbXVsdGlwbGUgbW9kZSlcbiAgICovXG4gIHRvZ2dsZVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEFYVmFsdWVDaGFuZ2VkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmlzVXNlckludGVyYWN0aW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbm9uZScpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuICAgIGlmIChtb2RlICE9PSAnbXVsdGlwbGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50LnZhbHVlID09PSBudWxsID8gdHJ1ZSA6IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgaWYgKHRoaXMuY2FzY2FkZXNUb0NoaWxkcmVuKCkgJiYgY2hpbGRyZW4gJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiBldmVudC5pc1VzZXJJbnRlcmFjdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZHJvcCBldmVudHMgZm9yIHRyZWUgbm9kZXNcbiAgICovXG4gIG9uRHJvcChldmVudDogQVhEcm9wTGlzdERyb3BwZWRFdmVudCwgcGFyZW50Tm9kZT86IEFYVHJlZVZpZXdOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBwYXJlbnROb2RlID8gKHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKHBhcmVudE5vZGUpID8/IFtdKSA6IHRoaXMubm9kZXMoKTtcbiAgICBjb25zdCBpc1Jlb3JkZXJpbmcgPSBldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyO1xuXG4gICAgaWYgKGlzUmVvcmRlcmluZykge1xuICAgICAgdGhpcy5oYW5kbGVSZW9yZGVyKGV2ZW50LCB0YXJnZXRBcnJheSwgcGFyZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlTW92ZShldmVudCwgdGFyZ2V0QXJyYXksIHBhcmVudE5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyb3AgZXZlbnRzIHdoZW4gZHJvcHBpbmcgZGlyZWN0bHkgb250byBhIG5vZGUgKHRvIG1ha2UgaXQgYSBjaGlsZClcbiAgICovXG4gIG9uRHJvcE9udG9Ob2RlKGV2ZW50OiBBWERyb3BMaXN0RHJvcHBlZEV2ZW50LCB0YXJnZXROb2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Nb3ZlVG9QYXJlbnQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc291cmNlTGlzdElkID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZWxlbWVudC5pZDtcbiAgICBjb25zdCBzb3VyY2VBcnJheSA9IHRoaXMuZ2V0QXJyYXlCeUxpc3RJZChzb3VyY2VMaXN0SWQpO1xuICAgIGlmICghc291cmNlQXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmVkTm9kZSA9IHNvdXJjZUFycmF5W2V2ZW50LnByZXZpb3VzSW5kZXhdO1xuXG4gICAgaWYgKCF0aGlzLnRyZWVTZXJ2aWNlLmlzVmFsaWREcm9wVGFyZ2V0KG1vdmVkTm9kZSwgdGFyZ2V0Tm9kZSwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbWl0QmVmb3JlRHJvcEV2ZW50KG1vdmVkTm9kZSwgc291cmNlTGlzdElkLCB0YXJnZXROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCAwKSkgcmV0dXJuO1xuXG4gICAgbGV0IHRhcmdldENoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4odGFyZ2V0Tm9kZSk7XG4gICAgaWYgKCF0YXJnZXRDaGlsZHJlbikge1xuICAgICAgdGFyZ2V0Q2hpbGRyZW4gPSBbXTtcbiAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKHRhcmdldE5vZGUsIHRhcmdldENoaWxkcmVuKTtcbiAgICB9XG4gICAgc291cmNlQXJyYXkuc3BsaWNlKGV2ZW50LnByZXZpb3VzSW5kZXgsIDEpO1xuICAgIHRhcmdldENoaWxkcmVuLnVuc2hpZnQobW92ZWROb2RlKTtcbiAgICB0aGlzLnNldE5vZGVFeHBhbmRlZCh0YXJnZXROb2RlLCB0cnVlKTtcblxuICAgIHRoaXMuZW1pdERyb3BFdmVudHMobW92ZWROb2RlLCB0aGlzLmZpbmRQYXJlbnRCeUxpc3RJZChzb3VyY2VMaXN0SWQpLCB0YXJnZXROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCAwLCBmYWxzZSk7XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub2RlIGZvY3VzIGV2ZW50XG4gICAqL1xuICBvbk5vZGVGb2N1cyhub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNlZE5vZGVJZC5zZXQobm9kZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdHJlZSBjb250YWluZXIgZm9jdXMgLSBmb2N1cyBmaXJzdCBub2RlIGlmIG5vbmUgaXMgZm9jdXNlZFxuICAgKi9cbiAgb25UcmVlRm9jdXMoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBjb25zdCBmbGF0TGlzdCA9IHRoaXMudHJlZVNlcnZpY2UuYnVpbGRGbGF0Tm9kZUxpc3QoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgdGhpcy5oaWRkZW5GaWVsZCgpLFxuICAgICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgKTtcbiAgICAgIGlmIChmbGF0TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRJZCA9IHRoaXMuZm9jdXNlZE5vZGVJZCgpO1xuICAgICAgICBpZiAoZm9jdXNlZElkKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvY3VzZWQgbm9kZSBzdGlsbCBleGlzdHMgYW5kIGlzIG5vdCBoaWRkZW5cbiAgICAgICAgICBjb25zdCBmb2N1c2VkTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZmluZE5vZGVCeUlkKHRoaXMubm9kZXMoKSwgZm9jdXNlZElkLCB0aGlzLmlkRmllbGQoKSk7XG4gICAgICAgICAgaWYgKGZvY3VzZWROb2RlICYmIHRoaXMuZ2V0Tm9kZUhpZGRlbihmb2N1c2VkTm9kZSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZChmb2N1c2VkSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb2N1c2VkIG5vZGUgbm8gbG9uZ2VyIGV4aXN0cywgZm9jdXMgZmlyc3Qgbm9kZVxuICAgICAgICAgICAgdGhpcy5mb2N1c05vZGVCeUlkKHRoaXMuZ2V0Tm9kZUlkKGZsYXRMaXN0WzBdLm5vZGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbm9kZSBpcyBmb2N1c2VkLCBmb2N1cyBmaXJzdCBub2RlXG4gICAgICAgICAgdGhpcy5mb2N1c05vZGVCeUlkKHRoaXMuZ2V0Tm9kZUlkKGZsYXRMaXN0WzBdLm5vZGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdHJlZSBjb250YWluZXIgYmx1clxuICAgKi9cbiAgb25UcmVlQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ICYmICEoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5mb2N1c2VkTm9kZUlkLnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICovXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmbGF0TGlzdCA9IHRoaXMudHJlZVNlcnZpY2UuYnVpbGRGbGF0Tm9kZUxpc3QoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICB0aGlzLmhpZGRlbkZpZWxkKCksXG4gICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAoZmxhdExpc3QubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50Rm9jdXNlZCA9IHRoaXMuZ2V0Rm9jdXNlZE5vZGUoKTtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gY3VycmVudEZvY3VzZWRcbiAgICAgID8gZmxhdExpc3QuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmdldE5vZGVJZChpdGVtLm5vZGUpID09PSB0aGlzLmdldE5vZGVJZChjdXJyZW50Rm9jdXNlZCkpXG4gICAgICA6IC0xO1xuXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEgJiYgZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBjdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlnYXRpb25SZXN1bHQgPSB0aGlzLmhhbmRsZU5hdmlnYXRpb25LZXkoZXZlbnQsIGZsYXRMaXN0LCBjdXJyZW50SW5kZXgsIGN1cnJlbnRGb2N1c2VkKTtcbiAgICBpZiAobmF2aWdhdGlvblJlc3VsdC5oYW5kbGVkKSB7XG4gICAgICBpZiAobmF2aWdhdGlvblJlc3VsdC5zaG91bGRQcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbmF2aWdhdGlvblJlc3VsdC50YXJnZXRJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICBuYXZpZ2F0aW9uUmVzdWx0LnRhcmdldEluZGV4ID49IDAgJiZcbiAgICAgICAgbmF2aWdhdGlvblJlc3VsdC50YXJnZXRJbmRleCA8IGZsYXRMaXN0Lmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZCh0aGlzLmdldE5vZGVJZChmbGF0TGlzdFtuYXZpZ2F0aW9uUmVzdWx0LnRhcmdldEluZGV4XS5ub2RlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUHJpdmF0ZSBNZXRob2RzID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBMb2FkIHJvb3QgaXRlbXMgd2hlbiBkYXRhc291cmNlIGlzIGEgZnVuY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJvb3RJdGVtcyhsb2FkRm46IEFYVHJlZVZpZXdDYWxsYmFjayk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBsb2FkRm4oKTtcbiAgICAgIGNvbnN0IHJvb3ROb2RlcyA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgICB0aGlzLm5vZGVzLnNldChyb290Tm9kZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKCdGYWlsZWQgdG8gbG9hZCByb290IGl0ZW1zJywgZXJyb3IpO1xuICAgICAgdGhpcy5ub2Rlcy5zZXQoW10pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNoaWxkcmVuIGZvciBhIG5vZGUgdXNpbmcgbGF6eSBsb2FkaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWROb2RlQ2hpbGRyZW4obm9kZTogQVhUcmVlVmlld05vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub2RlSWQgPSB0aGlzLmdldE5vZGVJZChub2RlKTtcbiAgICBpZiAoIXRoaXMuaXNMYXp5RGF0YVNvdXJjZSgpIHx8IHRoaXMubG9hZGluZ05vZGVzKCkuaGFzKG5vZGVJZCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnRyZWVTZXJ2aWNlLmhhc0NoaWxkcmVuKG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW5Db3VudCA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuQ291bnQobm9kZSk7XG4gICAgICBpZiAoIWNoaWxkcmVuQ291bnQgfHwgY2hpbGRyZW5Db3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSB0aGlzLmRhdGFzb3VyY2UoKTtcbiAgICBpZiAodHlwZW9mIGRzICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2FkaW5nTm9kZXMudXBkYXRlKChzZXQpID0+IG5ldyBTZXQoc2V0KS5hZGQobm9kZUlkKSk7XG4gICAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBkcyhub2RlSWQpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcmVzdWx0IDogcmVzdWx0O1xuICAgICAgdGhpcy5zZXROb2RlQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pO1xuICAgICAgdGhpcy5zZXROb2RlQ2hpbGRyZW5Db3VudChub2RlLCBjaGlsZHJlbi5sZW5ndGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKCdGYWlsZWQgdG8gbG9hZCBjaGlsZHJlbicsIGVycm9yKTtcbiAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuQ291bnQobm9kZSwgMCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZ05vZGVzLnVwZGF0ZSgoc2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgICAgbmV3U2V0LmRlbGV0ZShub2RlSWQpO1xuICAgICAgICByZXR1cm4gbmV3U2V0O1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcmVmcmVzaCBub2RlcyBzaWduYWwgYW5kIHN5bmMgYmFjayB0byBkYXRhc291cmNlIGlmIGl0J3MgYW4gYXJyYXlcbiAgICogQ3JlYXRlcyBuZXcgYXJyYXkgcmVmZXJlbmNlcyBmb3IgYWxsIG5lc3RlZCBjaGlsZHJlbiB0byBlbnN1cmUgcmVhY3Rpdml0eVxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoTm9kZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudE5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIC8vIENyZWF0ZSBuZXcgYXJyYXkgcmVmZXJlbmNlcyBmb3IgYWxsIG5lc3RlZCBjaGlsZHJlbiB0byBlbnN1cmUgcmVhY3Rpdml0eVxuICAgIC8vIFRoaXMgZW5zdXJlcyBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiBwaWNrcyB1cCBjaGFuZ2VzIGV2ZW4gd2l0aCBjYWxsYmFjayBkYXRhc291cmNlXG4gICAgdGhpcy5lbnN1cmVOZXdBcnJheVJlZmVyZW5jZXMoY3VycmVudE5vZGVzKTtcbiAgICB0aGlzLm5vZGVzLnNldChbLi4uY3VycmVudE5vZGVzXSk7XG5cbiAgICBpZiAoIXRoaXMuaXNMYXp5RGF0YVNvdXJjZSgpICYmICF0aGlzLmlzVXBkYXRpbmdGcm9tRGF0YXNvdXJjZSkge1xuICAgICAgdGhpcy5pc1VwZGF0aW5nRnJvbURhdGFzb3VyY2UgPSB0cnVlO1xuICAgICAgdGhpcy5kYXRhc291cmNlLnNldChbLi4uY3VycmVudE5vZGVzXSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nRnJvbURhdGFzb3VyY2UgPSBmYWxzZTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBlbnN1cmUgYWxsIGNoaWxkcmVuIGFycmF5cyBoYXZlIG5ldyByZWZlcmVuY2VzIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgKiBNdXRhdGVzIHRoZSB0cmVlIHN0cnVjdHVyZSBieSByZXBsYWNpbmcgY2hpbGRyZW4gYXJyYXlzIHdpdGggbmV3IGFycmF5IHJlZmVyZW5jZXNcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlTmV3QXJyYXlSZWZlcmVuY2VzKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBhcnJheSByZWZlcmVuY2UgZm9yIGNoaWxkcmVuXG4gICAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKG5vZGUsIFsuLi5jaGlsZHJlbl0pO1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIG5lc3RlZCBjaGlsZHJlblxuICAgICAgICB0aGlzLmVuc3VyZU5ld0FycmF5UmVmZXJlbmNlcyhjaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzaW5nbGUgc2VsZWN0aW9uIG1vZGVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2luZ2xlU2VsZWN0aW9uKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlc2VsZWN0QWxsTm9kZXMoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIHRydWUpO1xuICAgIHRoaXMuc2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSwgZmFsc2UpO1xuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3QuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlICh1c2VkIGludGVybmFsbHksIGJ1dCBpbiBtdWx0aXBsZSBtb2RlIHNlbGVjdGlvbiBpcyBwcmltYXJpbHkgaGFuZGxlZCBieSBjaGVja2JveGVzKVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhdGhpcy5nZXROb2RlU2VsZWN0ZWQobm9kZSk7XG4gICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSwgZmFsc2UpO1xuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICBpZiAodGhpcy5jYXNjYWRlc1RvQ2hpbGRyZW4oKSAmJiBjaGlsZHJlbiAmJiAhdGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLnNlbGVjdEFsbENoaWxkcmVuKFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSAmJiAhdGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZVBhcmVudFN0YXRlcyhcbiAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICBub2RlLFxuICAgICAgICB0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCksXG4gICAgICAgIHRoaXMuaWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3QuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFycmF5IHJlZmVyZW5jZSBieSBkcm9wIGxpc3QgSURcbiAgICovXG4gIHByaXZhdGUgZ2V0QXJyYXlCeUxpc3RJZChsaXN0SWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5nZXRBcnJheUJ5TGlzdElkKHRoaXMubm9kZXMoKSwgbGlzdElkLCB0aGlzLmlkRmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgcGFyZW50IG5vZGUgYnkgbGlzdCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kUGFyZW50QnlMaXN0SWQobGlzdElkOiBzdHJpbmcpOiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuZmluZFBhcmVudEJ5TGlzdElkKHRoaXMubm9kZXMoKSwgbGlzdElkLCB0aGlzLmlkRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbW92ZSBvcGVyYXRpb24gaXMgYWxsb3dlZCBiYXNlZCBvbiBkcmFnQmVoYXZpb3JcbiAgICovXG4gIHByaXZhdGUgY2FuTW92ZVRvUGFyZW50KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlaGF2aW9yID0gdGhpcy5kcmFnQmVoYXZpb3IoKTtcbiAgICByZXR1cm4gYmVoYXZpb3IgIT09ICdub25lJyAmJiBiZWhhdmlvciAhPT0gJ29yZGVyLW9ubHknO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJlb3JkZXIgb3BlcmF0aW9uIGlzIGFsbG93ZWQgYmFzZWQgb24gZHJhZ0JlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIGNhblJlb3JkZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVoYXZpb3IgPSB0aGlzLmRyYWdCZWhhdmlvcigpO1xuICAgIHJldHVybiBiZWhhdmlvciAhPT0gJ25vbmUnICYmIGJlaGF2aW9yICE9PSAnbW92ZSc7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHJlb3JkZXJpbmcgd2l0aGluIHRoZSBzYW1lIGxpc3QgICAqL1xuICBwcml2YXRlIGhhbmRsZVJlb3JkZXIoXG4gICAgZXZlbnQ6IEFYRHJvcExpc3REcm9wcGVkRXZlbnQsXG4gICAgdGFyZ2V0QXJyYXk6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgcGFyZW50Tm9kZT86IEFYVHJlZVZpZXdOb2RlLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVvcmRlcigpKSByZXR1cm47XG5cbiAgICBjb25zdCBtb3ZlZE5vZGUgPSB0YXJnZXRBcnJheVtldmVudC5wcmV2aW91c0luZGV4XTtcbiAgICBtb3ZlSXRlbUluQXJyYXkodGFyZ2V0QXJyYXksIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG5cbiAgICB0aGlzLmVtaXREcm9wRXZlbnRzKG1vdmVkTm9kZSwgcGFyZW50Tm9kZSwgcGFyZW50Tm9kZSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW92aW5nIGJldHdlZW4gZGlmZmVyZW50IGxpc3RzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU1vdmUoZXZlbnQ6IEFYRHJvcExpc3REcm9wcGVkRXZlbnQsIHRhcmdldEFycmF5OiBBWFRyZWVWaWV3Tm9kZVtdLCBwYXJlbnROb2RlPzogQVhUcmVlVmlld05vZGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuTW92ZVRvUGFyZW50KCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNvdXJjZUxpc3RJZCA9IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmVsZW1lbnQuaWQ7XG4gICAgY29uc3Qgc291cmNlQXJyYXkgPSB0aGlzLmdldEFycmF5QnlMaXN0SWQoc291cmNlTGlzdElkKTtcbiAgICBpZiAoIXNvdXJjZUFycmF5KSByZXR1cm47XG5cbiAgICBjb25zdCBtb3ZlZE5vZGUgPSBzb3VyY2VBcnJheVtldmVudC5wcmV2aW91c0luZGV4XTtcblxuICAgIGlmIChwYXJlbnROb2RlICYmICF0aGlzLnRyZWVTZXJ2aWNlLmlzVmFsaWREcm9wVGFyZ2V0KG1vdmVkTm9kZSwgcGFyZW50Tm9kZSkpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5lbWl0QmVmb3JlRHJvcEV2ZW50KG1vdmVkTm9kZSwgc291cmNlTGlzdElkLCBwYXJlbnROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJhbnNmZXJBcnJheUl0ZW0oc291cmNlQXJyYXksIHRhcmdldEFycmF5LCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuXG4gICAgdGhpcy5lbWl0RHJvcEV2ZW50cyhcbiAgICAgIG1vdmVkTm9kZSxcbiAgICAgIHRoaXMuZmluZFBhcmVudEJ5TGlzdElkKHNvdXJjZUxpc3RJZCksXG4gICAgICBwYXJlbnROb2RlLFxuICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBiZWZvcmVEcm9wIGV2ZW50IGFuZCByZXR1cm4gd2hldGhlciB0byBjb250aW51ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0QmVmb3JlRHJvcEV2ZW50KFxuICAgIG1vdmVkTm9kZTogQVhUcmVlVmlld05vZGUsXG4gICAgc291cmNlTGlzdElkOiBzdHJpbmcsXG4gICAgY3VycmVudFBhcmVudDogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQsXG4gICAgcHJldmlvdXNJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBiZWZvcmVEcm9wRXZlbnQ6IEFYVHJlZVZpZXdCZWZvcmVEcm9wRXZlbnQgPSB7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBtb3ZlZE5vZGUsXG4gICAgICBwcmV2aW91c1BhcmVudDogdGhpcy5maW5kUGFyZW50QnlMaXN0SWQoc291cmNlTGlzdElkKSxcbiAgICAgIGN1cnJlbnRQYXJlbnQsXG4gICAgICBwcmV2aW91c0luZGV4LFxuICAgICAgY3VycmVudEluZGV4LFxuICAgICAgY2FuY2VsZWQ6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5vbkJlZm9yZURyb3AuZW1pdChiZWZvcmVEcm9wRXZlbnQpO1xuXG4gICAgcmV0dXJuICFiZWZvcmVEcm9wRXZlbnQuY2FuY2VsZWQ7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBkcm9wIGV2ZW50cyBiYXNlZCBvbiBvcGVyYXRpb24gdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0RHJvcEV2ZW50cyhcbiAgICBub2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBwcmV2aW91c1BhcmVudDogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQsXG4gICAgY3VycmVudFBhcmVudDogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQsXG4gICAgcHJldmlvdXNJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgIGlzUmVvcmRlcjogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZHJvcEV2ZW50OiBBWFRyZWVWaWV3RHJvcEV2ZW50ID0ge1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHByZXZpb3VzUGFyZW50LFxuICAgICAgY3VycmVudFBhcmVudCxcbiAgICAgIHByZXZpb3VzSW5kZXgsXG4gICAgICBjdXJyZW50SW5kZXgsXG4gICAgfTtcblxuICAgIGlmIChpc1Jlb3JkZXIpIHtcbiAgICAgIHRoaXMub25PcmRlckNoYW5nZS5lbWl0KGRyb3BFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Nb3ZlQ2hhbmdlLmVtaXQoZHJvcEV2ZW50KTtcbiAgICB9XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlLmVtaXQoZHJvcEV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBmb2N1c2VkIG5vZGVcbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9jdXNlZE5vZGUoKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBmb2N1c2VkSWQgPSB0aGlzLmZvY3VzZWROb2RlSWQoKTtcbiAgICBpZiAoIWZvY3VzZWRJZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuZmluZE5vZGVCeUlkKHRoaXMubm9kZXMoKSwgZm9jdXNlZElkLCB0aGlzLmlkRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGZvY3VzIHRvIGEgbm9kZSBieSBJRFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c05vZGVCeUlkKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkTm9kZUlkLnNldChub2RlSWQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS10cmVlLW5vZGUtaWQ9XCIke25vZGVJZH1cIl1gKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBrZXlzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRpb25LZXkoXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZmxhdExpc3Q6IEFYVHJlZVZpZXdGbGF0Tm9kZVtdLFxuICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRGb2N1c2VkOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwsXG4gICk6IHsgaGFuZGxlZDogYm9vbGVhbjsgc2hvdWxkUHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHRhcmdldEluZGV4OiBudW1iZXIgfCBudWxsIH0ge1xuICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IGN1cnJlbnRJbmRleDtcbiAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIGxldCBoYW5kbGVkID0gdHJ1ZTtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IGZsYXRMaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICBpZiAoY3VycmVudEZvY3VzZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5nZXROb2RlRXhwYW5kZWQoY3VycmVudEZvY3VzZWQpICYmIHRoaXMuc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTm9kZShjdXJyZW50Rm9jdXNlZCwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gZmxhdExpc3RbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbT8ucGFyZW50KSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gZmxhdExpc3QuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmdldE5vZGVJZChpdGVtLm5vZGUpID09PSB0aGlzLmdldE5vZGVJZChjdXJyZW50SXRlbS5wYXJlbnQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZCkge1xuICAgICAgICAgIGlmICghdGhpcy5nZXROb2RlRXhwYW5kZWQoY3VycmVudEZvY3VzZWQpICYmIHRoaXMuc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTm9kZShjdXJyZW50Rm9jdXNlZCwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUV4cGFuZGVkKGN1cnJlbnRGb2N1c2VkKSAmJlxuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5oYXNDaGlsZHJlbihjdXJyZW50Rm9jdXNlZCwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKGN1cnJlbnRGb2N1c2VkKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0TGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IHRoaXMuZ2V0Tm9kZUlkKGl0ZW0ubm9kZSkgPT09IHRoaXMuZ2V0Tm9kZUlkKGZpcnN0Q2hpbGQpKTtcbiAgICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRGbGF0TGlzdCA9IHRoaXMudHJlZVNlcnZpY2UuYnVpbGRGbGF0Tm9kZUxpc3QoXG4gICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbkZpZWxkKCksXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHVwZGF0ZWRGbGF0TGlzdC5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5nZXROb2RlSWQoaXRlbS5ub2RlKSA9PT0gdGhpcy5nZXROb2RlSWQoZmlyc3RDaGlsZCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gMCAmJiB0YXJnZXRJbmRleCA8IHVwZGF0ZWRGbGF0TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZCh0aGlzLmdldE5vZGVJZCh1cGRhdGVkRmxhdExpc3RbdGFyZ2V0SW5kZXhdLm5vZGUpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIHNob3VsZFByZXZlbnREZWZhdWx0OiB0cnVlLCB0YXJnZXRJbmRleDogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIHRhcmdldEluZGV4ID0gZmxhdExpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgICBpZiAoY3VycmVudEZvY3VzZWQgJiYgdGhpcy5zZWxlY3RNb2RlKCkgIT09ICdub25lJyAmJiB0aGlzLmNhblNlbGVjdE5vZGUoY3VycmVudEZvY3VzZWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNwYWNlS2V5U2VsZWN0aW9uKGN1cnJlbnRGb2N1c2VkLCBldmVudCk7XG4gICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGN1cnJlbnRGb2N1c2VkICYmIHRoaXMuY2FuU2VsZWN0Tm9kZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRW50ZXJLZXlTZWxlY3Rpb24oY3VycmVudEZvY3VzZWQsIGV2ZW50KTtcbiAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBzaG91bGRQcmV2ZW50RGVmYXVsdDogdHJ1ZSwgdGFyZ2V0SW5kZXg6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZCAmJiB0aGlzLnNlbGVjdE1vZGUoKSA9PT0gJ211bHRpcGxlJyAmJiB0aGlzLmNhblNlbGVjdE5vZGUoY3VycmVudEZvY3VzZWQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDdHJsRW50ZXJTZWxlY3Rpb24oY3VycmVudEZvY3VzZWQsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIHNob3VsZFByZXZlbnREZWZhdWx0OiB0cnVlLCB0YXJnZXRJbmRleDogbnVsbCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB7IGhhbmRsZWQsIHNob3VsZFByZXZlbnREZWZhdWx0LCB0YXJnZXRJbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBTcGFjZSBrZXkgc2VsZWN0aW9uXG4gICAqIEluIHNpbmdsZSBtb2RlOiByZXBsYWNlcyBzZWxlY3Rpb24gKGRlc2VsZWN0cyBhbGwsIHNlbGVjdHMgdGhpcyBub2RlKVxuICAgKiBJbiBtdWx0aXBsZSBtb2RlOiB0b2dnbGVzIHNlbGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTcGFjZUtleVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuXG4gICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAvLyBTaW5nbGUgbW9kZTogcmVwbGFjZSBzZWxlY3Rpb25cbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuZGVzZWxlY3RBbGxOb2RlcyhcbiAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGlwbGUgbW9kZTogdG9nZ2xlIHNlbGVjdGlvblxuICAgICAgY29uc3QgbmV3VmFsdWUgPSAhdGhpcy5nZXROb2RlU2VsZWN0ZWQobm9kZSk7XG4gICAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCBuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICAgIHRoaXMuaWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLm9uTm9kZVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBuYXRpdmVFdmVudDogZXZlbnQsXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgRW50ZXIga2V5IHNlbGVjdGlvblxuICAgKiBJbiBzaW5nbGUgbW9kZTogcmVwbGFjZXMgc2VsZWN0aW9uIChkZXNlbGVjdHMgYWxsLCBzZWxlY3RzIHRoaXMgbm9kZSlcbiAgICogSW4gbXVsdGlwbGUgbW9kZTogcmVwbGFjZXMgc2VsZWN0aW9uIChkZXNlbGVjdHMgYWxsLCBzZWxlY3RzIHRoaXMgbm9kZSBhbmQgcmVzcGVjdHMgc2VsZWN0aW9uQmVoYXZpb3IpXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUVudGVyS2V5U2VsZWN0aW9uKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3ROb2RlKG5vZGUpKSByZXR1cm47XG5cbiAgICBjb25zdCBtb2RlID0gdGhpcy5zZWxlY3RNb2RlKCk7XG5cbiAgICAvLyBFbnRlciBrZXkgYWx3YXlzIHJlcGxhY2VzIHNlbGVjdGlvbiAoZGVzZWxlY3RzIGFsbCBmaXJzdClcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlc2VsZWN0QWxsTm9kZXMoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIHRydWUpO1xuICAgIHRoaXMuc2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSwgZmFsc2UpO1xuXG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAvLyBSZXNwZWN0IHNlbGVjdGlvbkJlaGF2aW9yOiBjYXNjYWRlIHRvIGNoaWxkcmVuIGlmIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBSZXNwZWN0IHNlbGVjdGlvbkJlaGF2aW9yOiB1cGRhdGUgcGFyZW50IHN0YXRlcyBpZiBpbnRlcm1lZGlhdGUgbW9kZVxuICAgICAgaWYgKHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSAmJiAhdGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlUGFyZW50U3RhdGVzKFxuICAgICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSxcbiAgICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3QuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEN0cmwvQ21kICsgRW50ZXIga2V5IHNlbGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVDdHJsRW50ZXJTZWxlY3Rpb24obm9kZTogQVhUcmVlVmlld05vZGUsIGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNlbGVjdE5vZGUobm9kZSkpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXRoaXMuZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgaWYgKHRoaXMuY2FzY2FkZXNUb0NoaWxkcmVuKCkgJiYgY2hpbGRyZW4gJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdmFsdWUgaXMgYW4gRXZlbnRcbiAgICovXG4gIHByaXZhdGUgaXNFdmVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEV2ZW50IHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFdmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIGNvbnNpc3RlbnRseVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bWVzc2FnZX06YCwgZXJyb3IubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bWVzc2FnZX06YCwgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBSb290IGRyb3AgbGlzdCAtLT5cbjxkaXZcbiAgYXhGb2N1c1RyYXBcbiAgW2F4RHJvcExpc3RdPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gIFtzb3J0aW5nRGlzYWJsZWRdPVwiZmFsc2VcIlxuICBbaWRdPVwiZ2V0TGlzdElkKClcIlxuICBbYXR0ci5kYXRhLW5vZGUtaWRdPVwibnVsbFwiXG4gIGRyb3BMaXN0R3JvdXA9XCJheC10cmVlLXZpZXctbm9kZXNcIlxuICAoZHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgY2xhc3M9XCJheC10cmVlLXZpZXctZHJvcC1saXN0XCJcbiAgW2NsYXNzLmF4LXRyZWUtdmlldy1jYXJkXT1cImxvb2soKSA9PT0gJ2NhcmQnXCJcbiAgW2NsYXNzLmF4LXRyZWUtdmlldy13aXRoLWxpbmVzXT1cImxvb2soKSA9PT0gJ3dpdGgtbGluZSdcIlxuICByb2xlPVwiZ3JvdXBcIlxuPlxuICBAZm9yIChub2RlIG9mIG5vZGVzKCk7IHRyYWNrIGdldE5vZGVJZChub2RlKSkge1xuICAgIEBpZiAoZ2V0Tm9kZUhpZGRlbihub2RlKSAhPT0gdHJ1ZSkge1xuICAgICAgPGRpdlxuICAgICAgICBbYXhEcmFnXT1cImRyYWdCZWhhdmlvcigpICE9PSAnbm9uZSdcIlxuICAgICAgICBbZHJhZ0Rpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKVwiXG4gICAgICAgIFtkcmFnRGF0YV09XCJub2RlXCJcbiAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZVwiXG4gICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1hY3RpdmVdPVwiYWN0aXZlTm9kZUlkKCkgPT09IGdldE5vZGVJZChub2RlKVwiXG4gICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1zZWxlY3RlZF09XCJnZXROb2RlU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtZGlzYWJsZWRdPVwiZ2V0Tm9kZURpc2FibGVkKG5vZGUpXCJcbiAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWxvYWRpbmddPVwiZ2V0Tm9kZUxvYWRpbmcobm9kZSlcIlxuICAgICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgICBbYXR0ci5hcmlhLWxldmVsXT1cImdldE5vZGVBcmlhTGV2ZWwoMClcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImdldE5vZGVBcmlhRXhwYW5kZWQobm9kZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImdldE5vZGVBcmlhU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKSB8fCAoaXNMZWFmT25seU1vZGUoKSAmJiAhaXNMZWFmTm9kZShub2RlKSkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGUtY29udGVudFwiXG4gICAgICAgICAgW2F4RHJvcExpc3RdPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gICAgICAgICAgW2lkXT1cIidheC10cmVlLXZpZXctbm9kZS1kcm9wLScgKyBnZXROb2RlSWQobm9kZSlcIlxuICAgICAgICAgIFthdHRyLmRhdGEtbm9kZS1pZF09XCJnZXROb2RlSWQobm9kZSlcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdHJlZS1ub2RlLWlkXT1cImdldE5vZGVJZChub2RlKVwiXG4gICAgICAgICAgW2F0dHIuZGF0YS1kcm9wLXR5cGVdPVwiJ29udG8tbm9kZSdcIlxuICAgICAgICAgIGRyb3BMaXN0R3JvdXA9XCJheC10cmVlLXZpZXctbm9kZXNcIlxuICAgICAgICAgIChkcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wT250b05vZGUoJGV2ZW50LCBub2RlKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTm9kZUNsaWNrSGFuZGxlKG5vZGUsICRldmVudClcIlxuICAgICAgICAgIChkYmxjbGljayk9XCJvbk5vZGVEb3VibGVDbGlja0hhbmRsZShub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAoZm9jdXMpPVwib25Ob2RlRm9jdXMoZ2V0Tm9kZUlkKG5vZGUpKVwiXG4gICAgICAgICAgW3RhYmluZGV4XT1cImlzTm9kZUZvY3VzZWQoZ2V0Tm9kZUlkKG5vZGUpKSA/IDAgOiAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKHNob3VsZFNob3dEcmFnSGFuZGxlKCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtdHJlZS12aWV3LWRyYWctaGFuZGxlXCIgYXhEcmFnSGFuZGxlIHRpdGxlPVwiRHJhZyB0byByZW9yZGVyXCI+IOKLruKLriA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxheC1idXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LWV4cGFuZC10b2dnbGUgYXgtc21cIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlTm9kZShub2RlLCAkYW55KCRldmVudCkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctaGFzLWNoaWxkcmVuXT1cInNob3VsZFNob3dFeHBhbmRUb2dnbGUobm9kZSlcIlxuICAgICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1leHBhbmRlZF09XCJnZXROb2RlRXhwYW5kZWQobm9kZSlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKSB8fCBnZXROb2RlTG9hZGluZyhub2RlKVwiXG4gICAgICAgICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJzaG91bGRTaG93RXhwYW5kVG9nZ2xlKG5vZGUpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoZ2V0Tm9kZUxvYWRpbmcobm9kZSkpIHtcbiAgICAgICAgICAgICAgPGF4LWljb24+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1zcGlubmVyIGZhLXNwaW4gYXgtdHJlZS12aWV3LWxvYWRpbmctc3Bpbm5lclwiPjwvaT5cbiAgICAgICAgICAgICAgPC9heC1pY29uPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxheC1pY29uPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpID8gZGlyZWN0aW9uRXhwYW5kZWRJY29uKCkgOiBkaXJlY3Rpb25Db2xsYXBzZWRJY29uKClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctdG9nZ2xlLWljb25cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYXgtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2F4LWJ1dHRvbj5cbiAgICAgICAgICBAaWYgKG5vZGVUZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZSgpIVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRUZW1wbGF0ZUNvbnRleHQobm9kZSwgMClcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGlmIChzaG91bGRTaG93Q2hlY2tib3hGb3JOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAgIDxheC1jaGVjay1ib3hcbiAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSkgPyBudWxsIDogZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJnZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cInRvZ2dsZVNlbGVjdGlvbihub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvYXgtY2hlY2stYm94PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSAmJiBnZXROb2RlSWNvbihub2RlKSkge1xuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZ2V0Tm9kZUljb24obm9kZSlcIiBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWljb25cIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F4VG9vbHRpcF09XCJnZXROb2RlVG9vbHRpcChub2RlKSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtheFRvb2x0aXBEaXNhYmxlZF09XCIhZ2V0Tm9kZVRvb2x0aXAobm9kZSlcIlxuICAgICAgICAgICAgICBbYXhUb29sdGlwUGxhY2VtZW50XT1cIid0b3Atc3RhcnQnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZ2V0Tm9kZVRpdGxlKG5vZGUpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICBzaG93Q2hpbGRyZW5CYWRnZSgpICYmXG4gICAgICAgICAgICAgIChnZXROb2RlQ2hpbGRyZW5Db3VudChub2RlKSB8fCAoZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpICYmIGdldE5vZGVDaGlsZHJlbihub2RlKSEubGVuZ3RoID4gMCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1iYWRnZVwiPlxuICAgICAgICAgICAgICAgIDxheC1iYWRnZVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctY2hpbGRyZW4tYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgW3RleHRdPVwiKGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpID8/IGdldE5vZGVDaGlsZHJlbihub2RlKT8ubGVuZ3RoID8/IDApLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgID48L2F4LWJhZGdlPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChnZXROb2RlRXhwYW5kZWQobm9kZSkgJiYgZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpICYmIGdldE5vZGVDaGlsZHJlbihub2RlKSEubGVuZ3RoID4gMCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtdHJlZS12aWV3LWNoaWxkcmVuXCIgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpbGRyZW5MaXN0XCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNoaWxkcmVuOiBnZXROb2RlQ2hpbGRyZW4obm9kZSksIHBhcmVudDogbm9kZSwgbGV2ZWw6IDEgfVwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIH1cbjwvZGl2PlxuXG48IS0tIFJlY3Vyc2l2ZSBjaGlsZHJlbiB0ZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjY2hpbGRyZW5MaXN0IGxldC1jaGlsZHJlbj1cImNoaWxkcmVuXCIgbGV0LXBhcmVudD1cInBhcmVudFwiIGxldC1sZXZlbD1cImxldmVsXCI+XG4gIDxkaXZcbiAgICBbYXhEcm9wTGlzdF09XCJkcmFnQmVoYXZpb3IoKSAhPT0gJ25vbmUnXCJcbiAgICBbaWRdPVwiZ2V0TGlzdElkKHBhcmVudClcIlxuICAgIFthdHRyLmRhdGEtbm9kZS1pZF09XCJnZXROb2RlSWQocGFyZW50KVwiXG4gICAgZHJvcExpc3RHcm91cD1cImF4LXRyZWUtdmlldy1ub2Rlc1wiXG4gICAgKGRyb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50LCBwYXJlbnQpXCJcbiAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1kcm9wLWxpc3RcIlxuICAgIHJvbGU9XCJncm91cFwiXG4gID5cbiAgICBAZm9yIChub2RlIG9mIGNoaWxkcmVuOyB0cmFjayBnZXROb2RlSWQobm9kZSkpIHtcbiAgICAgIEBpZiAoZ2V0Tm9kZUhpZGRlbihub2RlKSAhPT0gdHJ1ZSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2F4RHJhZ109XCJkcmFnQmVoYXZpb3IoKSAhPT0gJ25vbmUnXCJcbiAgICAgICAgICBbZHJhZ0Rpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKVwiXG4gICAgICAgICAgW2RyYWdEYXRhXT1cIm5vZGVcIlxuICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGVcIlxuICAgICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1hY3RpdmVdPVwiYWN0aXZlTm9kZUlkKCkgPT09IGdldE5vZGVJZChub2RlKVwiXG4gICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLXNlbGVjdGVkXT1cImdldE5vZGVTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWRpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKVwiXG4gICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWxvYWRpbmddPVwiZ2V0Tm9kZUxvYWRpbmcobm9kZSlcIlxuICAgICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1mb2N1c2VkXT1cImlzTm9kZUZvY3VzZWQoZ2V0Tm9kZUlkKG5vZGUpKVwiXG4gICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxldmVsXT1cImdldE5vZGVBcmlhTGV2ZWwobGV2ZWwpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImdldE5vZGVBcmlhRXhwYW5kZWQobm9kZSlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZ2V0Tm9kZUFyaWFTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJnZXROb2RlRGlzYWJsZWQobm9kZSkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGUtY29udGVudFwiXG4gICAgICAgICAgICBbYXhEcm9wTGlzdF09XCJkcmFnQmVoYXZpb3IoKSAhPT0gJ25vbmUnXCJcbiAgICAgICAgICAgIFtpZF09XCInYXgtdHJlZS12aWV3LW5vZGUtZHJvcC0nICsgZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbm9kZS1pZF09XCJnZXROb2RlSWQobm9kZSlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10cmVlLW5vZGUtaWRdPVwiZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZHJvcC10eXBlXT1cIidvbnRvLW5vZGUnXCJcbiAgICAgICAgICAgIGRyb3BMaXN0R3JvdXA9XCJheC10cmVlLXZpZXctbm9kZXNcIlxuICAgICAgICAgICAgKGRyb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3BPbnRvTm9kZSgkZXZlbnQsIG5vZGUpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5vZGVDbGlja0hhbmRsZShub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkYmxjbGljayk9XCJvbk5vZGVEb3VibGVDbGlja0hhbmRsZShub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbk5vZGVGb2N1cyhnZXROb2RlSWQobm9kZSkpXCJcbiAgICAgICAgICAgIChibHVyKT1cImZvY3VzZWROb2RlSWQuc2V0KG51bGwpXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJpc05vZGVGb2N1c2VkKGdldE5vZGVJZChub2RlKSkgPyAwIDogLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd0RyYWdIYW5kbGUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF4LXRyZWUtdmlldy1kcmFnLWhhbmRsZVwiIGF4RHJhZ0hhbmRsZSB0aXRsZT1cIkRyYWcgdG8gcmVvcmRlclwiPiDii67ii64gPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGF4LWJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1leHBhbmQtdG9nZ2xlIGF4LXNtXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlTm9kZShub2RlLCAkYW55KCRldmVudCkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1oYXMtY2hpbGRyZW5dPVwic2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShub2RlKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctZXhwYW5kZWRdPVwiZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldE5vZGVEaXNhYmxlZChub2RlKSB8fCBnZXROb2RlTG9hZGluZyhub2RlKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS52aXNpYmlsaXR5XT1cInNob3VsZFNob3dFeHBhbmRUb2dnbGUobm9kZSkgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoZ2V0Tm9kZUxvYWRpbmcobm9kZSkpIHtcbiAgICAgICAgICAgICAgICA8YXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtc3Bpbm5lciBmYS1zcGluIGF4LXRyZWUtdmlldy1sb2FkaW5nLXNwaW5uZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9heC1pY29uPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8YXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXROb2RlRXhwYW5kZWQobm9kZSkgPyBkaXJlY3Rpb25FeHBhbmRlZEljb24oKSA6IGRpcmVjdGlvbkNvbGxhcHNlZEljb24oKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LXRvZ2dsZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9heC1pY29uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2F4LWJ1dHRvbj5cblxuICAgICAgICAgICAgQGlmIChub2RlVGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlKCkhXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0VGVtcGxhdGVDb250ZXh0KG5vZGUsIGxldmVsKVwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKHNob3VsZFNob3dDaGVja2JveEZvck5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICA8YXgtY2hlY2stYm94XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlKSA/IG51bGwgOiBnZXROb2RlU2VsZWN0ZWQobm9kZSkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cInRvZ2dsZVNlbGVjdGlvbihub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9heC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSAmJiBnZXROb2RlSWNvbihub2RlKSkge1xuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJnZXROb2RlSWNvbihub2RlKVwiIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGUtaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGUtbGFiZWxcIlxuICAgICAgICAgICAgICAgIFtheFRvb2x0aXBdPVwiZ2V0Tm9kZVRvb2x0aXAobm9kZSkgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtheFRvb2x0aXBEaXNhYmxlZF09XCIhZ2V0Tm9kZVRvb2x0aXAobm9kZSlcIlxuICAgICAgICAgICAgICAgIFtheFRvb2x0aXBQbGFjZW1lbnRdPVwiJ3RvcC1zdGFydCdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZ2V0Tm9kZVRpdGxlKG5vZGUpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICBzaG93Q2hpbGRyZW5CYWRnZSgpICYmXG4gICAgICAgICAgICAgICAgKGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpIHx8IChnZXROb2RlQ2hpbGRyZW4obm9kZSkgJiYgZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpIS5sZW5ndGggPiAwKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1iYWRnZVwiPlxuICAgICAgICAgICAgICAgICAgPGF4LWJhZGdlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LWNoaWxkcmVuLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiKGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpID8/IGdldE5vZGVDaGlsZHJlbihub2RlKT8ubGVuZ3RoID8/IDApLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICAgPjwvYXgtYmFkZ2U+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGdldE5vZGVFeHBhbmRlZChub2RlKSAmJiBnZXROb2RlQ2hpbGRyZW4obm9kZSkgJiYgZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpIS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF4LXRyZWUtdmlldy1jaGlsZHJlblwiIHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlsZHJlbkxpc3RcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjaGlsZHJlbjogZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpLCBwYXJlbnQ6IG5vZGUsIGxldmVsOiBsZXZlbCArIDEgfVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==","import { NgModule } from '@angular/core';\nimport { AXTreeViewComponent } from './tree-view.component';\nimport * as i0 from \"@angular/core\";\nexport class AXTreeViewModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [AXTreeViewComponent],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUs1RCxNQUFNLE9BQU8sZ0JBQWdCOzhHQUFoQixnQkFBZ0I7K0dBQWhCLGdCQUFnQixZQUZqQixtQkFBbUI7K0dBRWxCLGdCQUFnQixZQUZqQixtQkFBbUI7OzJGQUVsQixnQkFBZ0I7a0JBSDVCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQy9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYVHJlZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RyZWUtdmlldy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQVhUcmVlVmlld0NvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJlZVZpZXdNb2R1bGUge31cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvbXBvbmVudHMtdHJlZS12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcG9uZW50cy90cmVlLXZpZXcvc3JjL2Fjb3JleC1jb21wb25lbnRzLXRyZWUtdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA;AACA;AACA;AACA;AACO,MAAM,iBAAiB,CAAC;AAC/B;AACA,IAAI,SAAS,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC;AAC1D,IAAI,SAAS,IAAI,CAAC,gBAAgB,GAAG,yBAAyB,CAAC;AAC/D,IAAI,SAAS,IAAI,CAAC,WAAW,GAAG,oBAAoB,CAAC;AACrD;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE;AAC5C,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpC,gBAAgB,OAAO,IAAI;AAC3B,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;AAC7C,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC;AACtE,gBAAgB,IAAI,KAAK;AACzB,oBAAoB,OAAO,KAAK;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAClF,QAAQ,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;AAC5C,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE;AACxE,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC;AAC/F,gBAAgB,IAAI,KAAK;AACzB,oBAAoB,OAAO,KAAK;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,SAAS;AACxB,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AACzF,QAAQ,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;AAC1C,QAAQ,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;AAC5C,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;AAC5G,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAC7F,QAAQ,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;AAC5C,QAAQ,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC;AAChD,QAAQ,IAAI,QAAQ,KAAK,UAAU,EAAE;AACrC,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC;AACpD,QAAQ,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AACtC,YAAY,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC1C,YAAY,IAAI,OAAO,KAAK,QAAQ,EAAE;AACtC,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ,YAAY,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;AACpF,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE;AACzI,QAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,QAAQ,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK;AACtD,YAAY,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACzC,gBAAgB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;AAChD,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACpD,gBAAgB,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AAClD,oBAAoB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1D,oBAAoB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACxD,oBAAoB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACxD,oBAAoB,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAC9C,wBAAwB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC;AAC3D,oBAAoB;AACpB,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1B,QAAQ,OAAO,QAAQ;AACvB,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAClD,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAC5C,QAAQ,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;AACxC,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AAC1G,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC;AACtD,QAAQ,OAAO,gBAAgB,IAAI,OAAO,CAAC,aAAa,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACxH,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AACxI,QAAQ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AACtC,YAAY,KAAK,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC3C,YAAY,KAAK,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAC7C,YAAY,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;AACtD,YAAY,IAAI,aAAa,EAAE;AAC/B,gBAAgB,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;AACjH,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AAC1G,QAAQ,IAAI,aAAa,GAAG,CAAC;AAC7B,QAAQ,IAAI,kBAAkB,GAAG,CAAC;AAClC,QAAQ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AACtC,YAAY,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;AACjD,YAAY,MAAM,aAAa,GAAG,KAAK,CAAC,kBAAkB,CAAC;AAC3D,YAAY,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC5C,gBAAgB,aAAa,EAAE;AAC/B,YAAY;AACZ,YAAY,IAAI,aAAa,EAAE;AAC/B,gBAAgB,kBAAkB,EAAE;AACpC,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO;AACf,YAAY,WAAW,EAAE,aAAa,KAAK,QAAQ,CAAC,MAAM;AAC1D,YAAY,YAAY,EAAE,aAAa,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC;AACrE,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AAC5K,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC;AACtF,QAAQ,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,CAAC;AACtD,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc;AACtC,YAAY;AACZ,QAAQ,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,cAAc,EAAE,aAAa,EAAE,kBAAkB,CAAC;AAC/H,QAAQ,IAAI,WAAW,EAAE;AACzB,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;AACxC,YAAY,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAC9C,QAAQ;AACR,aAAa,IAAI,YAAY,EAAE;AAC/B,YAAY,IAAI,iBAAiB,EAAE;AACnC,gBAAgB,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;AAC5C,gBAAgB,MAAM,CAAC,kBAAkB,CAAC,GAAG,IAAI;AACjD,YAAY;AACZ,iBAAiB;AACjB,gBAAgB,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK;AAC7C,gBAAgB,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAClD,YAAY;AACZ,QAAQ;AACR,aAAa;AACb,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK;AACzC,YAAY,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAC9C,QAAQ;AACR,QAAQ,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,CAAC;AAC5H,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AAC1H,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AACvC,YAAY,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAC5C,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;AACjG,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AACnI,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC1C,YAAY,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AAC5C,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;AAC1G,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE;AACjF,QAAQ,IAAI,KAAK,GAAG,CAAC;AACrB,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;AACnC,gBAAgB,KAAK,EAAE;AACvB,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC;AACnF,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE;AAC3F,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;AACnC,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC;AACpF,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AACxH,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,YAAY,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACjC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAC1D,YAAY,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC5C,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,YAAY;AACZ,iBAAiB;AACjB,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACpD,gBAAgB,IAAI,QAAQ,EAAE;AAC9B,oBAAoB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC;AACnG,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AAClJ,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,gBAAgB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,CAAC;AACzH,gBAAgB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,CAAC;AACjI,gBAAgB,IAAI,WAAW,EAAE;AACjC,oBAAoB,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;AAC9C,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AACpD,gBAAgB;AAChB,qBAAqB,IAAI,YAAY,EAAE;AACvC,oBAAoB,IAAI,iBAAiB,EAAE;AAC3C,wBAAwB,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;AAClD,wBAAwB,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI;AACvD,oBAAoB;AACpB,yBAAyB;AACzB,wBAAwB,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AACnD,wBAAwB,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AACxD,oBAAoB;AACpB,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK;AAC/C,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK;AACpD,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,MAAM,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AAC9K,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;AACrE,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,CAAC;AAC3G,YAAY,IAAI,WAAW,IAAI,WAAW,EAAE;AAC5C,gBAAgB,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC7C,oBAAoB,MAAM,gBAAgB,CAAC,IAAI,CAAC;AAChD,gBAAgB;AAChB,gBAAgB,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC9C,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACpD,gBAAgB,IAAI,QAAQ,EAAE;AAC9B,oBAAoB,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,CAAC;AACzJ,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAChF,QAAQ,IAAI,MAAM,KAAK,iBAAiB,CAAC,YAAY,EAAE;AACvD,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE;AACnE,YAAY,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,CAAC;AACjF,YAAY,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAClE,YAAY,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI;AACvC,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;AACxE,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,MAAM,QAAQ,GAAG,IAAI,GAAG,aAAa,CAAC;AAC9C,QAAQ,OAAO,QAAQ,IAAI,IAAI;AAC/B,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE;AACtD,QAAQ,IAAI,MAAM,KAAK,iBAAiB,CAAC,YAAY,EAAE;AACvD,YAAY,OAAO,SAAS;AAC5B,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,gBAAgB;AAC3E,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC,WAAW;AAC3C,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACjD,QAAQ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS;AACrE,IAAI;AACJ;AACA;AACA;AACA,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE;AACpC,QAAQ,IAAI,CAAC,IAAI;AACjB,YAAY,OAAO,iBAAiB,CAAC,YAAY;AACjD,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AACpC,QAAQ,OAAO,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1D,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,GAAG;AACpB,QAAQ,OAAO,iBAAiB,CAAC,YAAY;AAC7C,IAAI;AACJ;AACA;AACA;AACA,IAAI,iBAAiB,GAAG;AACxB,QAAQ,OAAO,iBAAiB,CAAC,gBAAgB;AACjD,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,GAAG;AACpB,QAAQ,OAAO,iBAAiB,CAAC,WAAW;AAC5C,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE;AACnD,QAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,QAAQ,MAAM,QAAQ,GAAG,CAAC,QAAQ,KAAK;AACvC,YAAY,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACzC,gBAAgB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACpD,gBAAgB,IAAI,QAAQ,EAAE;AAC9B,oBAAoB,QAAQ,CAAC,QAAQ,CAAC;AACtC,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,QAAQ,CAAC,KAAK,CAAC;AACvB,QAAQ,OAAO,QAAQ;AACvB,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAC3E,QAAQ,MAAM,IAAI,GAAG,EAAE;AACvB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,IAAI,OAAO,GAAG,IAAI;AAC1B,QAAQ,OAAO,OAAO,EAAE;AACxB,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACjC,YAAY,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;AACtF,YAAY,OAAO,GAAG,MAAM,IAAI,IAAI;AACpC,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAC5E,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;AAC5E,QAAQ,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE;AAC3E,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,EAAE;AACrB,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;AAC/E,QAAQ,MAAM,aAAa,GAAG,MAAM,GAAG,aAAa,CAAC,IAAI,KAAK;AAC9D,QAAQ,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;AACjE,IAAI;AACJ;AACA;AACA;AACA,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,YAAY,GAAG,SAAS,EAAE,SAAS,GAAG,MAAM,EAAE,aAAa,GAAG,UAAU,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE,WAAW,GAAG,QAAQ,EAAE,kBAAkB,GAAG,eAAe,EAAE,SAAS,GAAG,MAAM,EAAE,aAAa,GAAG,UAAU,EAAE;AAChV,QAAQ,MAAM,MAAM,GAAG;AACvB,YAAY,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7D,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AAC1C,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;AAC9C,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACxC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,CAAC,aAAa,GAAG,KAAK;AAClC,YAAY,CAAC,kBAAkB,GAAG,KAAK;AACvC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AAChD,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;AAC5C,YAAY,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAC1D,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;AAClG,SAAS;AACT,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAC5C,QAAQ,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC5P,YAAY,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM;AACrE,QAAQ;AACR,QAAQ,OAAO,MAAM;AACrB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AAC9J,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;AAC1E,QAAQ;AACR;AACA,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;AACtF,QAAQ,MAAM,qBAAqB,GAAG;AACtC,cAAc,aAAa,CAAC,aAAa;AACzC,cAAc,SAAS;AACvB,QAAQ,MAAM,YAAY,GAAG,qBAAqB,IAAI,KAAK;AAC3D;AACA,QAAQ,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;AACjF,QAAQ,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;AACjC,YAAY,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;AAC1E,QAAQ;AACR,QAAQ,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE;AACA,QAAQ,IAAI,WAAW;AACvB,QAAQ,IAAI,SAAS;AACrB,QAAQ,IAAI,WAAW,EAAE;AACzB,YAAY,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC;AACtE,YAAY,IAAI,CAAC,SAAS,EAAE;AAC5B;AACA,gBAAgB,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC;AAC/D,gBAAgB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;AACxF,YAAY;AACZ;AACA,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;AACvF;AACA,gBAAgB,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC;AAC/D,gBAAgB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;AACxF,YAAY;AACZ,YAAY,IAAI,iBAAiB,GAAG,SAAS,CAAC,aAAa,CAAC;AAC5D,YAAY,IAAI,CAAC,iBAAiB,EAAE;AACpC,gBAAgB,iBAAiB,GAAG,EAAE;AACtC,gBAAgB,SAAS,CAAC,aAAa,CAAC,GAAG,iBAAiB;AAC5D,YAAY;AACZ,YAAY,WAAW,GAAG,iBAAiB;AAC3C,QAAQ;AACR,aAAa;AACb,YAAY,WAAW,GAAG,KAAK;AAC/B,QAAQ;AACR;AACA,QAAQ,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM;AACtH;AACA,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE;AAC9E,YAAY,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;AACnD,QAAQ;AACR,aAAa;AACb,YAAY,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;AACvC,QAAQ;AACR;AACA,QAAQ,IAAI,aAAa,EAAE;AAC3B,YAAY,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC;AAChE,YAAY,aAAa,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;AAC5E,QAAQ;AACR,QAAQ,IAAI,SAAS,EAAE;AACvB,YAAY,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC;AAC5D,YAAY,SAAS,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;AACxE,YAAY,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;AAC5C,QAAQ;AACR,QAAQ,OAAO;AACf,YAAY,OAAO,EAAE,IAAI;AACzB,YAAY,SAAS;AACrB,YAAY,cAAc,EAAE,aAAa;AACzC,YAAY,SAAS;AACrB,YAAY,aAAa,EAAE,YAAY;AACvC,YAAY,YAAY,EAAE,QAAQ;AAClC,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AACvH,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR;AACA,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;AACpC;AACA,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE;AAClD,YAAY,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;AACnD,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC1C,YAAY,IAAI,CAAC,kBAAkB,CAAC,GAAG,QAAQ,EAAE,MAAM;AACvD,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE,aAAa,GAAG,UAAU,EAAE;AAC9J,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;AAClE,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR;AACA,QAAQ,IAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;AAC5C,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,YAAY,QAAQ,GAAG,EAAE;AACzB,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ;AAC5C,QAAQ;AACR;AACA,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;AAC3E,YAAY,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;AAChD,QAAQ;AACR,aAAa;AACb,YAAY,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AACpC,QAAQ;AACR;AACA,QAAQ,MAAM,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC,MAAM;AACpD;AACA,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AACpC,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;AACxC,QAAQ;AACR,QAAQ,OAAO,MAAM;AACrB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AAChH,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9D,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR;AACA,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;AAC/E,QAAQ,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,SAAS;AACzE,QAAQ,MAAM,WAAW,GAAG,cAAc,IAAI,KAAK;AACnD;AACA,QAAQ,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;AACzE,QAAQ,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAC1B,YAAY,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D;AACA,YAAY,IAAI,MAAM,EAAE;AACxB,gBAAgB,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7D,gBAAgB,MAAM,CAAC,kBAAkB,CAAC,GAAG,eAAe,EAAE,MAAM,IAAI,CAAC;AACzE,YAAY;AACZ,YAAY,OAAO,OAAO;AAC1B,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,aAAa,GAAG,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;AACvJ,QAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AACpC,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;AAC1C,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,QAAQ;AACR,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;AACzD,QAAQ;AACR,QAAQ,IAAI,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC9C,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,kCAAkC,EAAE,MAAM,CAAC,mCAAmC,CAAC,CAAC;AACzG,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AAC5C,QAAQ,IAAI,QAAQ,EAAE;AACtB,YAAY,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;AAClD,YAAY,IAAI,MAAM,EAAE;AACxB,gBAAgB,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AACtC,YAAY;AACZ,YAAY,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC1C,gBAAgB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,CAAC;AACpI,gBAAgB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5C,oBAAoB,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,gBAAgB;AAChB,YAAY;AACZ,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAC1D,YAAY,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM,EAAE;AAClF,gBAAgB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,iBAAiB,EAAE,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACzJ,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO;AACf,YAAY,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;AACtC,YAAY,MAAM;AAClB,SAAS;AACT,IAAI;AACJ,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC;AACpL,IAAI,SAAS,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACvI;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;AAC3H,YAAY,IAAI,EAAE;AAClB,SAAS,CAAC,EAAE,CAAC;;ACtoBN,MAAM,mBAAmB,CAAC;AACjC,IAAI,WAAW,GAAG;AAClB;AACA,QAAQ,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACpD,QAAQ,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;AACjD,QAAQ,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5C;AACA;AACA,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7F;AACA,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9F;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClH;AACA,QAAQ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3F;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChG;AACA,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxF;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxG;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,0BAA0B,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACpH;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,2BAA2B,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvH;AACA,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxF;AACA,QAAQ,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnF;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,SAAS,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnG;AACA,QAAQ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACpF;AACA,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7F;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnG;AACA,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1F;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtG;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtG;AACA,QAAQ,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrH;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtG;AACA,QAAQ,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChG;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtG;AACA,QAAQ,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrH;AACA,QAAQ,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1F;AACA;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE;AACpC;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE;AACpC;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE;AACpC;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,MAAM,EAAE;AACzC;AACA,QAAQ,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE;AACnC;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,MAAM,EAAE;AACzC;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE;AACrC;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE;AACpC;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE;AACrC;AACA;AACA,QAAQ,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/E;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACpG;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjG;AACA,QAAQ,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzG;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/F;AACA,QAAQ,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxI,QAAQ,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,MAAM;AACrD,YAAY,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/C,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AACpD,YAAY,IAAI,cAAc,IAAI,WAAW,KAAK,2BAA2B,EAAE;AAC/E,gBAAgB,OAAO,0BAA0B;AACjD,YAAY;AACZ,YAAY,IAAI,CAAC,cAAc,IAAI,WAAW,KAAK,0BAA0B,EAAE;AAC/E,gBAAgB,OAAO,2BAA2B;AAClD,YAAY;AACZ,YAAY,OAAO,WAAW;AAC9B,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3E;AACA,QAAQ,IAAI,CAAC,wBAAwB,GAAG,KAAK;AAC7C;AACA,QAAQ,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClJ;AACA,QAAQ,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1I;AACA,QAAQ,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,MAAM;AACjD,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACrD,YAAY,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,qBAAqB;AAC9E,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvE;AACA,QAAQ,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM;AACnD,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACrD,YAAY,OAAO,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,qBAAqB;AACpF,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzE;AACA,QAAQ,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM;AACnD,YAAY,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM;AAClF,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzE;AACA;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,YAAY;AACpD,YAAY,IAAI,IAAI,CAAC,wBAAwB,EAAE;AAC/C,gBAAgB;AAChB,YAAY;AACZ,YAAY,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AACxC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;AACnC,gBAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,YAAY;AACZ,iBAAiB,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;AAC/C,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AAChD,gBAAgB;AAChB,gBAAgB,OAAO,KAAK,EAAE;AAC9B,oBAAoB,IAAI,CAAC,WAAW,CAAC,2BAA2B,EAAE,KAAK,CAAC;AACxE,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtE;AACA,QAAQ,IAAI,CAAC,sBAAsB,GAAG,eAAe,CAAC,MAAM;AAC5D,YAAY,IAAI,CAAC,eAAe,CAAC;AACjC,iBAAiB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/F,iBAAiB,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5D,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE;AAC/C,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY;AAC9C,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;AACxC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK;AAC/B,IAAI;AACJ;AACA;AACA;AACA,IAAI,SAAS,CAAC,IAAI,EAAE;AACpB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;AACzD,IAAI;AACJ;AACA;AACA;AACA,IAAI,YAAY,CAAC,IAAI,EAAE;AACvB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC;AAC5D,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,IAAI,EAAE;AACzB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC;AACrE,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE;AACtB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC;AAClE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAClE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAC3D,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAClE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAC3D,IAAI;AACJ;AACA;AACA;AACA,IAAI,oBAAoB,CAAC,IAAI,EAAE;AAC/B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;AACvE,IAAI;AACJ;AACA;AACA;AACA,IAAI,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE;AACtC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;AAChE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAClE,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,IAAI,EAAE;AACxB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;AAChE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC;AACtE,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC;AAC3D,IAAI;AACJ;AACA;AACA;AACA,IAAI,oBAAoB,CAAC,IAAI,EAAE;AAC/B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC;AAC3E,IAAI;AACJ;AACA;AACA;AACA,IAAI,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE;AACtC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC;AAChE,IAAI;AACJ;AACA;AACA,IAAI,iBAAiB;AACrB;AACA,IAAI,sBAAsB;AAC1B;AACA;AACA;AACA;AACA,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1M,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrM,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACvG,IAAI;AACJ;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;AAC1C,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,QAAQ,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5G,QAAQ,OAAO,QAAQ;AACvB,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,GAAG;AACrB,QAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5H,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACpC,YAAY,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACpK,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,SAAS,GAAG;AAChB,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAC1C,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACnC;AACA,YAAY,MAAM,WAAW,GAAG,CAAC,KAAK,KAAK;AAC3C,gBAAgB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAC1C,oBAAoB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC9E,wBAAwB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AACxD,wBAAwB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9D,oBAAoB;AACpB,oBAAoB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC/D,oBAAoB,IAAI,QAAQ,EAAE;AAClC,wBAAwB,WAAW,CAAC,QAAQ,CAAC;AAC7C,oBAAoB;AACpB,gBAAgB;AAChB,YAAY,CAAC;AACb,YAAY,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACrC,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACvI,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACpI,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,QAAQ,CAAC,EAAE,EAAE;AACjB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9E,IAAI;AACJ;AACA;AACA;AACA,IAAI,OAAO,GAAG;AACd,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9C,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,IAAI,EAAE;AACzB,QAAQ,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC5D,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE;AAC9B,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACjJ,QAAQ,IAAI,OAAO,EAAE;AACrB,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;AACzC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACjL,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,MAAM,EAAE;AACvB,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1I,QAAQ,IAAI,OAAO,EAAE;AACrB;AACA,YAAY,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC7C,gBAAgB,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACxK,YAAY;AACZ,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,QAAQ;AACR,QAAQ,OAAO,OAAO;AACtB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,UAAU,CAAC,MAAM,EAAE;AAC7B,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACpF,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxI,QAAQ,IAAI,WAAW,IAAI,WAAW,EAAE;AACxC,YAAY,IAAI,WAAW,EAAE;AAC7B,gBAAgB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACjD,YAAY;AACZ,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5C,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC/F,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC,MAAM,EAAE;AACzB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AACxC,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;AAC7C,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;AACjG,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,mBAAmB,CAAC,MAAM,EAAE;AACtC,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AACxC,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACrC,QAAQ;AACR,aAAa;AACb,YAAY,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACzC,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,MAAM,EAAE;AACvB,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAC1C,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;AAC9E,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC/B,YAAY,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAClI,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5C,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAClD,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5C,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAClD,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACvD,YAAY,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACjF,gBAAgB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzI,YAAY;AACZ,YAAY,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACvE,gBAAgB,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3L,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,iBAAiB,EAAE,KAAK;AACpC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC,MAAM,EAAE;AACzB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;AACzC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC7E,YAAY,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACtI,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACnE,YAAY,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvL,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,iBAAiB,EAAE,KAAK;AACpC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,MAAM,EAAE;AACtB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,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;AAChH,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/C,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAChC,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC/E,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,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;AACjH,QAAQ,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC3D,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC,MAAM,EAAE;AACzB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxG,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;AACzC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACjL,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE;AAChD;AACA,YAAY,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC;AAC5I,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,MAAM,EAAE;AACtB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7S,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,MAAM,EAAE;AACtB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AACtF,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAClC,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,QAAQ,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK;AACpC,YAAY,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACtC,gBAAgB,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAChD,oBAAoB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,gBAAgB;AAChB,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3D,gBAAgB,IAAI,QAAQ,EAAE;AAC9B,oBAAoB,QAAQ,CAAC,QAAQ,CAAC;AACtC,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC9B,QAAQ,OAAO,QAAQ;AACvB,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,iBAAiB,GAAG;AACxB,QAAQ,MAAM,SAAS,GAAG,EAAE;AAC5B,QAAQ,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK;AACpC,YAAY,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACtC,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3D,gBAAgB,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACrE,gBAAgB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,MAAM,IAAI,aAAa,CAAC,EAAE;AACxF,oBAAoB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,gBAAgB;AAChB,gBAAgB,IAAI,QAAQ,EAAE;AAC9B,oBAAoB,QAAQ,CAAC,QAAQ,CAAC;AACtC,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC9B,QAAQ,OAAO,SAAS;AACxB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc,CAAC,MAAM,EAAE;AAC3B,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,OAAO,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK;AACxD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc,CAAC,MAAM,EAAE;AAC3B,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,OAAO,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK;AACxD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1C,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7E,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;AACxC,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAC7D,QAAQ,OAAO;AACf,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,KAAK;AACjB,YAAY,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAChD,YAAY,aAAa,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AACjE,YAAY,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC9C,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA,IAAI,oBAAoB,CAAC,KAAK,EAAE;AAChC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AACxC,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AACvC,QAAQ,MAAM,UAAU,GAAG,WAAW,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAClE,QAAQ,OAAO,KAAK,GAAG,MAAM,GAAG,UAAU;AAC1C,IAAI;AACJ;AACA;AACA;AACA,IAAI,sBAAsB,CAAC,IAAI,EAAE;AACjC,QAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxE,YAAY,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxH,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,GAAG;AACzB,QAAQ,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU;AAC/C,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,IAAI,EAAE;AACrB,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACpF,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAC7D,QAAQ,MAAM,gBAAgB,GAAG,aAAa,IAAI,aAAa,GAAG,CAAC;AACnE,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxI;AACA;AACA;AACA;AACA,QAAQ,OAAO,CAAC,WAAW,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW;AAChE,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,IAAI,EAAE;AACxB,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAC1C,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACnC,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACxC,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,yBAAyB,CAAC,IAAI,EAAE;AACpC,QAAQ,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AACxC,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACnC,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACxC,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,SAAS,CAAC,IAAI,EAAE;AACpB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/D,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;AAC9C,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,KAAK,EAAE;AAC5B,QAAQ,OAAO,KAAK,GAAG,CAAC;AACxB,IAAI;AACJ;AACA;AACA;AACA,IAAI,mBAAmB,CAAC,IAAI,EAAE;AAC9B,QAAQ,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;AAChD,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO;AAC5D,IAAI;AACJ;AACA;AACA;AACA,IAAI,mBAAmB,CAAC,IAAI,EAAE;AAC9B,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;AAC1C,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE;AAC5C,YAAY,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO;AAC9C,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;AAC9C,YAAY,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO;AAC9C,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,mBAAmB,GAAG;AAC1B,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrD,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACpC,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,aAAa;AACzB,SAAS,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE;AACzC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAY;AACZ,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACpC,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,SAAS,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAY;AACZ,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnD,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC/B,YAAY,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC;AACnD,QAAQ;AACR,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC5E,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAY;AACZ,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,UAAU,EAAE;AAChF,YAAY,KAAK,CAAC,eAAe,EAAE;AACnC,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACpF,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxI,QAAQ,IAAI,WAAW,IAAI,WAAW,EAAE;AACxC,YAAY,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1D,YAAY,IAAI,UAAU,IAAI,WAAW,EAAE;AAC3C,gBAAgB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACjD,YAAY;AACZ,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC;AAClD,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACjF,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,CAAC,KAAK,CAAC,iBAAiB;AACpC,YAAY;AACZ,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM;AACxC,YAAY;AACZ,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACrC,YAAY;AACZ,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAQ,IAAI,IAAI,KAAK,UAAU;AAC/B,YAAY;AACZ,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK;AAClE,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC5C,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC7E,YAAY,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzI,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACnE,YAAY,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvL,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;AACtD,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE;AAC9B,QAAQ,MAAM,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAChG,QAAQ,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS;AACxE,QAAQ,IAAI,YAAY,EAAE;AAC1B,YAAY,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;AAC9D,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;AAC3D,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE;AACtC,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACnC,YAAY;AACZ,QAAQ,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;AAC/D,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC/D,QAAQ,IAAI,CAAC,WAAW;AACxB,YAAY;AACZ,QAAQ,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1D,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5G,YAAY;AACZ,QAAQ,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;AAClG,YAAY;AACZ,QAAQ,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAC7D,QAAQ,IAAI,CAAC,cAAc,EAAE;AAC7B,YAAY,cAAc,GAAG,EAAE;AAC/B,YAAY,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC;AAC5D,QAAQ;AACR,QAAQ,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;AAClD,QAAQ,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AACzC,QAAQ,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC;AAC9C,QAAQ,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC;AACxH,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE;AACxB,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACtC,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,KAAK,EAAE;AACvB,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;AAClD,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACnK,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,gBAAgB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtD,gBAAgB,IAAI,SAAS,EAAE;AAC/B;AACA,oBAAoB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9G,oBAAoB,IAAI,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;AACjF,wBAAwB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AACrD,oBAAoB;AACpB,yBAAyB;AACzB;AACA,wBAAwB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5E,oBAAoB;AACpB,gBAAgB;AAChB,qBAAqB;AACrB;AACA,oBAAoB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxE,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,UAAU,CAAC,KAAK,EAAE;AACtB,QAAQ,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;AACvF,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACxC,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,KAAK,EAAE;AACzB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC/J,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AACjC,YAAY;AACZ,QAAQ,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AACpD,QAAQ,IAAI,YAAY,GAAG;AAC3B,cAAc,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;AACvG,cAAc,CAAC,CAAC;AAChB,QAAQ,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;AACzE,YAAY,YAAY,GAAG,CAAC;AAC5B,QAAQ;AACR,QAAQ,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC;AACxG,QAAQ,IAAI,gBAAgB,CAAC,OAAO,EAAE;AACtC,YAAY,IAAI,gBAAgB,CAAC,oBAAoB,EAAE;AACvD,gBAAgB,KAAK,CAAC,cAAc,EAAE;AACtC,gBAAgB,KAAK,CAAC,eAAe,EAAE;AACvC,YAAY;AACZ,YAAY,IAAI,gBAAgB,CAAC,WAAW,KAAK,IAAI;AACrD,gBAAgB,gBAAgB,CAAC,WAAW,IAAI,CAAC;AACjD,gBAAgB,gBAAgB,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE;AAChE,gBAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/F,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,MAAM,aAAa,CAAC,MAAM,EAAE;AAChC,QAAQ,IAAI;AACZ,YAAY,MAAM,MAAM,GAAG,MAAM,EAAE;AACnC,YAAY,MAAM,SAAS,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;AAC/E,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AACrC,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB,YAAY,IAAI,CAAC,WAAW,CAAC,2BAA2B,EAAE,KAAK,CAAC;AAChE,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,gBAAgB,CAAC,IAAI,EAAE;AACjC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3C,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;AACvE,YAAY;AACZ,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;AACtE,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACjE,YAAY,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,CAAC,EAAE;AACvD,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAQ,IAAI,OAAO,EAAE,KAAK,UAAU;AACpC,YAAY;AACZ,QAAQ,IAAI;AACZ,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvE,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;AACrC,YAAY,MAAM,QAAQ,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;AAC9E,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AAChD,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC5D,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB,YAAY,IAAI,CAAC,WAAW,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAC9D,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAQ;AACR,gBAAgB;AAChB,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;AAC9C,gBAAgB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3C,gBAAgB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AACrC,gBAAgB,OAAO,MAAM;AAC7B,YAAY,CAAC,CAAC;AACd,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACzC;AACA;AACA,QAAQ,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;AACnD,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;AACzC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AACxE,YAAY,IAAI,CAAC,wBAAwB,GAAG,IAAI;AAChD,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;AAClD,YAAY,UAAU,CAAC,MAAM;AAC7B,gBAAgB,IAAI,CAAC,wBAAwB,GAAG,KAAK;AACrD,YAAY,CAAC,EAAE,CAAC,CAAC;AACjB,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,wBAAwB,CAAC,KAAK,EAAE;AACpC,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACvD,YAAY,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD;AACA,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;AACzD;AACA,gBAAgB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;AACvD,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE;AACvC,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9H,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AACxC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE;AACzC,QAAQ,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACpD,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC5C,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC7E,YAAY,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzI,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACnE,YAAY,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvL,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,MAAM,EAAE;AAC7B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5G,IAAI;AACJ;AACA;AACA;AACA,IAAI,kBAAkB,CAAC,MAAM,EAAE;AAC/B,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACxF,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,GAAG;AACtB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AAC5C,QAAQ,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY;AAC/D,IAAI;AACJ;AACA;AACA;AACA,IAAI,UAAU,GAAG;AACjB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AAC5C,QAAQ,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;AACzD,IAAI;AACJ;AACA;AACA,IAAI,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE;AAClD,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAC9B,YAAY;AACZ,QAAQ,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1D,QAAQ,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAC7E,QAAQ,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC;AAC7G,IAAI;AACJ;AACA;AACA;AACA,IAAI,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE;AAC/C,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACnC,YAAY;AACZ,QAAQ,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;AAC/D,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC/D,QAAQ,IAAI,CAAC,WAAW;AACxB,YAAY;AACZ,QAAQ,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1D,QAAQ,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC;AACpF,YAAY;AACZ,QAAQ,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE;AACrH,YAAY;AACZ,QAAQ;AACR,QAAQ,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAC5F,QAAQ,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;AACzI,IAAI;AACJ;AACA;AACA;AACA,IAAI,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE;AAC7F,QAAQ,MAAM,eAAe,GAAG;AAChC,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,SAAS;AACrB,YAAY,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;AACjE,YAAY,aAAa;AACzB,YAAY,aAAa;AACzB,YAAY,YAAY;AACxB,YAAY,QAAQ,EAAE,KAAK;AAC3B,SAAS;AACT,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AAC/C,QAAQ,OAAO,CAAC,eAAe,CAAC,QAAQ;AACxC,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE;AAChG,QAAQ,MAAM,SAAS,GAAG;AAC1B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,cAAc;AAC1B,YAAY,aAAa;AACzB,YAAY,aAAa;AACzB,YAAY,YAAY;AACxB,SAAS;AACT,QAAQ,IAAI,SAAS,EAAE;AACvB,YAAY,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9C,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC7C,QAAQ;AACR,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;AAC1C,IAAI;AACJ;AACA;AACA;AACA,IAAI,cAAc,GAAG;AACrB,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AAC9C,QAAQ,IAAI,CAAC,SAAS;AACtB,YAAY,OAAO,IAAI;AACvB,QAAQ,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACrF,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACtC,QAAQ,UAAU,CAAC,MAAM;AACzB,YAAY,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACrF,YAAY,IAAI,OAAO,EAAE;AACzB,gBAAgB,OAAO,CAAC,KAAK,EAAE;AAC/B,gBAAgB,OAAO,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChF,YAAY;AACZ,QAAQ,CAAC,EAAE,CAAC,CAAC;AACb,IAAI;AACJ;AACA;AACA;AACA,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE;AACvE,QAAQ,IAAI,WAAW,GAAG,YAAY;AACtC,QAAQ,IAAI,oBAAoB,GAAG,IAAI;AACvC,QAAQ,IAAI,OAAO,GAAG,IAAI;AAC1B,QAAQ,QAAQ,KAAK,CAAC,GAAG;AACzB,YAAY,KAAK,SAAS;AAC1B,gBAAgB,IAAI,YAAY,GAAG,CAAC,EAAE;AACtC,oBAAoB,WAAW,GAAG,YAAY,GAAG,CAAC;AAClD,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,oBAAoB,GAAG,KAAK;AAChD,gBAAgB;AAChB,gBAAgB;AAChB,YAAY,KAAK,WAAW;AAC5B,gBAAgB,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACxD,oBAAoB,WAAW,GAAG,YAAY,GAAG,CAAC;AAClD,gBAAgB;AAChB,qBAAqB,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;AAC9C,oBAAoB,WAAW,GAAG,CAAC;AACnC,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,oBAAoB,GAAG,KAAK;AAChD,gBAAgB;AAChB,gBAAgB;AAChB,YAAY,KAAK,WAAW;AAC5B,gBAAgB,IAAI,cAAc,EAAE;AACpC,oBAAoB,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;AAC7G,wBAAwB,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AAC9D,wBAAwB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC/F,oBAAoB;AACpB,yBAAyB;AACzB,wBAAwB,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;AAClE,wBAAwB,IAAI,WAAW,EAAE,MAAM,EAAE;AACjD,4BAA4B,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACxI,wBAAwB;AACxB,6BAA6B;AAC7B,4BAA4B,oBAAoB,GAAG,KAAK;AACxD,wBAAwB;AACxB,oBAAoB;AACpB,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,oBAAoB,GAAG,KAAK;AAChD,gBAAgB;AAChB,gBAAgB;AAChB,YAAY,KAAK,YAAY;AAC7B,gBAAgB,IAAI,cAAc,EAAE;AACpC,oBAAoB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;AAC9G,wBAAwB,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AAC9D,wBAAwB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC/F,oBAAoB;AACpB,yBAAyB,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;AACjE,wBAAwB,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;AAC5F,wBAAwB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;AAC7E,wBAAwB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7D,4BAA4B,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC1D,4BAA4B,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;AAChI,4BAA4B,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;AACpD,gCAAgC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9L,gCAAgC,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAC3I,gCAAgC,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE;AAC9F,oCAAoC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;AACzG,oCAAoC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC3G,gCAAgC;AAChC,4BAA4B;AAC5B,wBAAwB;AACxB,6BAA6B;AAC7B,4BAA4B,oBAAoB,GAAG,KAAK;AACxD,wBAAwB;AACxB,oBAAoB;AACpB,yBAAyB;AACzB,wBAAwB,oBAAoB,GAAG,KAAK;AACpD,oBAAoB;AACpB,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,oBAAoB,GAAG,KAAK;AAChD,gBAAgB;AAChB,gBAAgB;AAChB,YAAY,KAAK,MAAM;AACvB,gBAAgB,WAAW,GAAG,CAAC;AAC/B,gBAAgB;AAChB,YAAY,KAAK,KAAK;AACtB,gBAAgB,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;AACjD,gBAAgB;AAChB,YAAY,KAAK,GAAG;AACpB,YAAY,KAAK,OAAO;AACxB,gBAAgB,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AAC1G,oBAAoB,KAAK,CAAC,cAAc,EAAE;AAC1C,oBAAoB,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC;AACvE,oBAAoB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC3F,gBAAgB;AAChB,gBAAgB,oBAAoB,GAAG,KAAK;AAC5C,gBAAgB;AAChB,YAAY,KAAK,OAAO;AACxB,gBAAgB,IAAI,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AAC1E,oBAAoB,KAAK,CAAC,cAAc,EAAE;AAC1C,oBAAoB,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC;AACvE,oBAAoB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC3F,gBAAgB;AAChB,gBAAgB,oBAAoB,GAAG,KAAK;AAC5C,gBAAgB;AAChB,YAAY;AACZ,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;AAC/E,oBAAoB,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AAClH,wBAAwB,KAAK,CAAC,cAAc,EAAE;AAC9C,wBAAwB,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5E,wBAAwB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;AAC/F,oBAAoB;AACpB,gBAAgB;AAChB,gBAAgB,OAAO,GAAG,KAAK;AAC/B,gBAAgB,oBAAoB,GAAG,KAAK;AAC5C,gBAAgB;AAChB;AACA,QAAQ,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE;AAC7D,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE;AACzC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACrC,YAAY;AACZ,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC/B;AACA,YAAY,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAClI,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5C,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAClD,QAAQ;AACR,aAAa;AACb;AACA,YAAY,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxD,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AAChD,YAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAClD,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACvD,YAAY,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACjF,gBAAgB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7I,YAAY;AACZ,YAAY,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACvE,gBAAgB,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3L,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE;AACzC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACrC,YAAY;AACZ,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC;AACA,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9H,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;AACxC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE;AACjC,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACvD;AACA,YAAY,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACjF,gBAAgB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzI,YAAY;AACZ;AACA,YAAY,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACvE,gBAAgB,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3L,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,wBAAwB,CAAC,IAAI,EAAE,KAAK,EAAE;AAC1C,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACrC,YAAY;AACZ,QAAQ,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACpD,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC5C,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9C,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACnD,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC7E,YAAY,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACzI,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACnE,YAAY,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvL,QAAQ;AACR,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/B,YAAY,SAAS,EAAE,IAAI;AAC3B,YAAY,IAAI;AAChB,YAAY,WAAW,EAAE,KAAK;AAC9B,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;AAClC,IAAI;AACJ;AACA;AACA;AACA,IAAI,OAAO,CAAC,KAAK,EAAE;AACnB,QAAQ,OAAO,KAAK,YAAY,KAAK;AACrC,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE;AAChC,QAAQ,IAAI,KAAK,YAAY,KAAK,EAAE;AACpC,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AACvD,QAAQ;AACR,aAAa;AACb,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AAC/C,QAAQ;AACR,IAAI;AACJ,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACrL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,UAAU,EAAE,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,OAAO,EAAE,kCAAkC,EAAE,qBAAqB,EAAE,kCAAkC,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,ggVAAggV,EAAE,MAAM,EAAE,CAAC,ktKAAktK,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,yBAAyB,EAAE,kBAAkB,EAAE,0BAA0B,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,2CAA2C,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,qDAAqD,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,wBAAwB,CAAC,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;AACjgtB;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE;AAChL,wBAAwB,YAAY;AACpC,wBAAwB,WAAW;AACnC,wBAAwB,eAAe;AACvC,wBAAwB,qBAAqB;AAC7C,wBAAwB,mBAAmB;AAC3C,wBAAwB,oBAAoB;AAC5C,wBAAwB,gBAAgB;AACxC,wBAAwB,iBAAiB;AACzC,wBAAwB,mBAAmB;AAC3C,wBAAwB,gBAAgB;AACxC,wBAAwB,wBAAwB;AAChD,wBAAwB,kBAAkB;AAC1C,qBAAqB,EAAE,IAAI,EAAE;AAC7B,wBAAwB,KAAK,EAAE,cAAc;AAC7C,wBAAwB,IAAI,EAAE,MAAM;AACpC,wBAAwB,QAAQ,EAAE,GAAG;AACrC,wBAAwB,8BAA8B,EAAE,sBAAsB;AAC9E,wBAAwB,2BAA2B,EAAE,mBAAmB;AACxE,wBAAwB,gCAAgC,EAAE,wBAAwB;AAClF,wBAAwB,0BAA0B,EAAE,OAAO;AAC3D,wBAAwB,oCAAoC,EAAE,qBAAqB;AACnF,wBAAwB,oCAAoC,EAAE,2BAA2B;AACzF,wBAAwB,mBAAmB,EAAE,mBAAmB;AAChE,wBAAwB,WAAW,EAAE,uBAAuB;AAC5D,wBAAwB,SAAS,EAAE,qBAAqB;AACxD,wBAAwB,QAAQ,EAAE,oBAAoB;AACtD,qBAAqB,EAAE,QAAQ,EAAE,ggVAAggV,EAAE,MAAM,EAAE,CAAC,ktKAAktK,CAAC,EAAE;AACjwf,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;ACj/CrjG,MAAM,gBAAgB,CAAC;AAC9B,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AACnK,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AACnK;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;AAC1H,YAAY,IAAI,EAAE,QAAQ;AAC1B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAClD,iBAAiB;AACjB,SAAS,CAAC,EAAE,CAAC;;ACbb;AACA;AACA;;;;"}
1
+ {"version":3,"file":"acorex-components-tree-view.mjs","sources":["../tmp-esm2022/tree-view/lib/tree-view.service.js","../tmp-esm2022/tree-view/lib/tree-view.component.js","../tmp-esm2022/tree-view/lib/tree-view.module.js","../tmp-esm2022/tree-view/acorex-components-tree-view.js"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as i0 from \"@angular/core\";\n/**\n * Service for tree node operations\n * Handles all business logic for tree node manipulation\n */\nexport class AXTreeViewService {\n // ==================== Constants ====================\n static { this.ROOT_LIST_ID = 'ax-tree-view-root-list'; }\n static { this.NODE_DROP_PREFIX = 'ax-tree-view-node-drop-'; }\n static { this.LIST_PREFIX = 'ax-tree-view-list-'; }\n // ==================== Node Finding & Traversal ====================\n /**\n * Find a node by ID in the tree\n */\n findNodeById(nodes, id, idField = 'id', childrenField = 'children') {\n for (const node of nodes) {\n if (node[idField] === id)\n return node;\n const children = node[childrenField];\n if (children) {\n const found = this.findNodeById(children, id, idField, childrenField);\n if (found)\n return found;\n }\n }\n return null;\n }\n /**\n * Find parent node of a given node\n */\n findParentNode(nodes, targetNode, idField = 'id', childrenField = 'children') {\n const targetId = targetNode[idField];\n for (const node of nodes) {\n const children = node[childrenField];\n if (children?.some((child) => child[idField] === targetId)) {\n return node;\n }\n if (children) {\n const found = this.findParentNode(children, targetNode, idField, childrenField);\n if (found)\n return found;\n }\n }\n return undefined;\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(movedNode, targetNode, idField = 'id', childrenField = 'children') {\n const movedId = movedNode[idField];\n const targetId = targetNode[idField];\n if (movedId === targetId || this.isNodeDescendantOf(targetNode, movedNode, idField, childrenField)) {\n return false;\n }\n return true;\n }\n /**\n * Check if targetNode is a descendant of ancestorNode\n */\n isNodeDescendantOf(targetNode, ancestorNode, idField = 'id', childrenField = 'children') {\n const targetId = targetNode[idField];\n const ancestorId = ancestorNode[idField];\n if (targetId === ancestorId) {\n return true;\n }\n const children = ancestorNode[childrenField];\n if (!children || children.length === 0) {\n return false;\n }\n for (const child of children) {\n const childId = child[idField];\n if (childId === targetId) {\n return true;\n }\n if (this.isNodeDescendantOf(targetNode, child, idField, childrenField)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Build a flat list of all visible focusable nodes\n */\n buildFlatNodeList(nodes, hiddenField = 'hidden', disabledField = 'disabled', expandedField = 'expanded', childrenField = 'children') {\n const flatList = [];\n const traverse = (nodeList, level, parent) => {\n for (const node of nodeList) {\n const hidden = node[hiddenField];\n const disabled = node[disabledField];\n if (hidden !== true && !disabled) {\n flatList.push({ node, level, parent });\n const expanded = node[expandedField];\n const children = node[childrenField];\n if (expanded && children) {\n traverse(children, level + 1, node);\n }\n }\n }\n };\n traverse(nodes, 0);\n return flatList;\n }\n // ==================== Node State Checks ====================\n /**\n * Check if node has children\n */\n hasChildren(node, childrenField = 'children') {\n const children = node[childrenField];\n return Boolean(children?.length);\n }\n /**\n * Check if node can be lazy loaded\n */\n canLazyLoad(node, isLazyDataSource, childrenCountField = 'childrenCount', childrenField = 'children') {\n const childrenCount = node[childrenCountField];\n return isLazyDataSource && Boolean(childrenCount && childrenCount > 0 && !this.hasChildren(node, childrenField));\n }\n // ==================== Selection Management ====================\n /**\n * Recursively select/deselect all children\n */\n selectAllChildren(children, selected, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const child of children) {\n child[selectedField] = selected;\n child[indeterminateField] = false;\n const childChildren = child[childrenField];\n if (childChildren) {\n this.selectAllChildren(childChildren, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Get selection state of children\n */\n getChildrenSelectionState(children, selectedField = 'selected', indeterminateField = 'indeterminate') {\n let selectedCount = 0;\n let indeterminateCount = 0;\n for (const child of children) {\n const selected = child[selectedField];\n const indeterminate = child[indeterminateField];\n if (selected && !indeterminate) {\n selectedCount++;\n }\n if (indeterminate) {\n indeterminateCount++;\n }\n }\n return {\n allSelected: selectedCount === children.length,\n someSelected: selectedCount > 0 || indeterminateCount > 0,\n };\n }\n /**\n * Update parent node states based on children selection (with intermediate state support)\n */\n updateParentStates(nodes, changedNode, intermediateState, idField = 'id', childrenField = 'children', selectedField = 'selected', indeterminateField = 'indeterminate') {\n const parent = this.findParentNode(nodes, changedNode, idField, childrenField);\n const parentChildren = parent?.[childrenField];\n if (!parent || !parentChildren)\n return;\n const { allSelected, someSelected } = this.getChildrenSelectionState(parentChildren, selectedField, indeterminateField);\n if (allSelected) {\n parent[selectedField] = true;\n parent[indeterminateField] = false;\n }\n else if (someSelected) {\n if (intermediateState) {\n parent[selectedField] = true;\n parent[indeterminateField] = true;\n }\n else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n }\n else {\n parent[selectedField] = false;\n parent[indeterminateField] = false;\n }\n this.updateParentStates(nodes, parent, intermediateState, idField, childrenField, selectedField, indeterminateField);\n }\n /**\n * Recursively deselect all nodes\n */\n deselectAllNodes(nodes, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const node of nodes) {\n node[selectedField] = false;\n node[indeterminateField] = false;\n const children = node[childrenField];\n if (children) {\n this.deselectAllNodes(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Recursively set selection state for all nodes\n */\n setAllSelection(nodes, selected, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (const node of nodes) {\n node[selectedField] = selected;\n node[indeterminateField] = false;\n const children = node[childrenField];\n if (children) {\n this.setAllSelection(children, selected, selectedField, indeterminateField, childrenField);\n }\n }\n }\n /**\n * Recursively count selected nodes\n */\n countSelected(nodes, selectedField = 'selected', childrenField = 'children') {\n let count = 0;\n for (const node of nodes) {\n if (node[selectedField])\n count++;\n const children = node[childrenField];\n if (children) {\n count += this.countSelected(children, selectedField, childrenField);\n }\n }\n return count;\n }\n /**\n * Recursively collect selected nodes\n */\n collectSelected(nodes, result, selectedField = 'selected', childrenField = 'children') {\n for (const node of nodes) {\n if (node[selectedField])\n result.push(node);\n const children = node[childrenField];\n if (children) {\n this.collectSelected(children, result, selectedField, childrenField);\n }\n }\n }\n /**\n * Recursively remove selected nodes\n */\n removeSelected(nodes, selectedField = 'selected', indeterminateField = 'indeterminate', childrenField = 'children') {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n const selected = node[selectedField];\n const indeterminate = node[indeterminateField];\n if (selected && !indeterminate) {\n nodes.splice(i, 1);\n }\n else {\n const children = node[childrenField];\n if (children) {\n this.removeSelected(children, selectedField, indeterminateField, childrenField);\n }\n }\n }\n }\n /**\n * Recursively update all parent states in the tree (used after deletion)\n */\n updateAllParentStates(nodes, intermediateState, childrenField = 'children', selectedField = 'selected', indeterminateField = 'indeterminate') {\n for (const node of nodes) {\n const children = node[childrenField];\n if (children && children.length > 0) {\n this.updateAllParentStates(children, intermediateState, childrenField, selectedField, indeterminateField);\n const { allSelected, someSelected } = this.getChildrenSelectionState(children, selectedField, indeterminateField);\n if (allSelected) {\n node[selectedField] = true;\n node[indeterminateField] = false;\n }\n else if (someSelected) {\n if (intermediateState) {\n node[selectedField] = true;\n node[indeterminateField] = true;\n }\n else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n else {\n node[selectedField] = false;\n node[indeterminateField] = false;\n }\n }\n }\n }\n // ==================== Expansion Management ====================\n /**\n * Recursively set expanded state (with lazy loading)\n */\n async setExpandedState(nodes, expanded, isLazyDataSource, loadNodeChildren, expandedField = 'expanded', childrenField = 'children', childrenCountField = 'childrenCount') {\n for (const node of nodes) {\n const hasChildren = this.hasChildren(node, childrenField);\n const canLazyLoad = this.canLazyLoad(node, isLazyDataSource, childrenCountField, childrenField);\n if (hasChildren || canLazyLoad) {\n if (expanded && canLazyLoad) {\n await loadNodeChildren(node);\n }\n node[expandedField] = expanded;\n const children = node[childrenField];\n if (children) {\n await this.setExpandedState(children, expanded, isLazyDataSource, loadNodeChildren, expandedField, childrenField, childrenCountField);\n }\n }\n }\n }\n // ==================== Drag & Drop Helpers ====================\n /**\n * Get array reference by drop list ID\n */\n getArrayByListId(nodes, listId, idField = 'id', childrenField = 'children') {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return nodes;\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 const nodeId = listId.replace(AXTreeViewService.LIST_PREFIX, '');\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n const children = node?.[childrenField];\n return children ?? null;\n }\n /**\n * Find parent node by list ID\n */\n findParentByListId(nodes, listId, idField = 'id', childrenField = 'children') {\n if (listId === AXTreeViewService.ROOT_LIST_ID) {\n return undefined;\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 * Generate unique list ID for each node\n */\n getListId(node, idField = 'id') {\n if (!node)\n return AXTreeViewService.ROOT_LIST_ID;\n const nodeId = node[idField];\n return `${AXTreeViewService.LIST_PREFIX}${nodeId}`;\n }\n /**\n * Get root list ID constant\n */\n getRootListId() {\n return AXTreeViewService.ROOT_LIST_ID;\n }\n /**\n * Get node drop prefix constant\n */\n getNodeDropPrefix() {\n return AXTreeViewService.NODE_DROP_PREFIX;\n }\n /**\n * Get list prefix constant\n */\n getListPrefix() {\n return AXTreeViewService.LIST_PREFIX;\n }\n // ==================== Node Utilities ====================\n /**\n * Get all nodes in a flat array\n */\n getAllNodes(nodes, childrenField = 'children') {\n const allNodes = [];\n const traverse = (nodeList) => {\n for (const node of nodeList) {\n allNodes.push(node);\n const children = node[childrenField];\n if (children) {\n traverse(children);\n }\n }\n };\n traverse(nodes);\n return allNodes;\n }\n /**\n * Get the path to a node (array of parent nodes from root to node)\n */\n getNodePath(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const path = [];\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return path;\n }\n let current = node;\n while (current) {\n path.unshift(current);\n const parent = this.findParentNode(nodes, current, idField, childrenField);\n current = parent ?? null;\n }\n return path;\n }\n /**\n * Get the level/depth of a node (0 = root level)\n */\n getNodeLevel(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const path = this.getNodePath(nodes, nodeId, idField, childrenField);\n return path.length > 0 ? path.length - 1 : -1;\n }\n /**\n * Get sibling nodes of a given node\n */\n getSiblings(nodes, nodeId, idField = 'id', childrenField = 'children') {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return [];\n }\n const parent = this.findParentNode(nodes, node, idField, childrenField);\n const siblingsArray = parent?.[childrenField] ?? nodes;\n return siblingsArray.filter((n) => n[idField] !== nodeId);\n }\n /**\n * Clone a node (creates a deep copy)\n */\n cloneNode(node, idField = 'id', titleField = 'title', tooltipField = 'tooltip', iconField = 'icon', expandedField = 'expanded', selectedField = 'selected', indeterminateField = 'indeterminate', disabledField = 'disabled', hiddenField = 'hidden', childrenCountField = 'childrenCount', dataField = 'data', childrenField = 'children') {\n const cloned = {\n [idField]: `${node[idField]}-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 const children = node[childrenField];\n if (children && children.length > 0) {\n cloned[childrenField] = children.map((child) => this.cloneNode(child, idField, titleField, tooltipField, iconField, expandedField, selectedField, indeterminateField, disabledField, hiddenField, childrenCountField, dataField, childrenField));\n cloned[childrenCountField] = cloned[childrenField].length;\n }\n return cloned;\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(nodes, nodeId, newParentId, index, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount', expandedField = 'expanded') {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n // Find current parent\n const currentParent = this.findParentNode(nodes, node, idField, childrenField);\n const currentParentChildren = currentParent\n ? currentParent[childrenField]\n : undefined;\n const currentArray = currentParentChildren ?? nodes;\n // Find and remove from current location\n const currentIndex = currentArray.findIndex((n) => n[idField] === nodeId);\n if (currentIndex === -1) {\n return { success: false, previousIndex: -1, currentIndex: -1 };\n }\n const movedNode = currentArray.splice(currentIndex, 1)[0];\n // Find new parent\n let targetArray;\n let newParent;\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 // 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 let newParentChildren = newParent[childrenField];\n if (!newParentChildren) {\n newParentChildren = [];\n newParent[childrenField] = newParentChildren;\n }\n targetArray = newParentChildren;\n }\n else {\n targetArray = nodes;\n }\n // Calculate new index before inserting\n const newIndex = index !== undefined && index >= 0 && index <= targetArray.length ? index : targetArray.length;\n // Insert at new location\n if (index !== undefined && index >= 0 && index <= targetArray.length) {\n targetArray.splice(index, 0, movedNode);\n }\n else {\n targetArray.push(movedNode);\n }\n // Update childrenCount\n if (currentParent) {\n const updatedChildren = currentParent[childrenField];\n currentParent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n if (newParent) {\n const updatedChildren = newParent[childrenField];\n newParent[childrenCountField] = updatedChildren?.length ?? 0;\n newParent[expandedField] = true; // Auto-expand new parent\n }\n return {\n success: true,\n movedNode,\n previousParent: currentParent,\n newParent,\n previousIndex: currentIndex,\n currentIndex: newIndex,\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(nodes, nodeId, updates, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount') {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\n }\n // Update node properties\n Object.assign(node, updates);\n // If children array is provided, ensure it exists and update childrenCount\n if (updates[childrenField] !== undefined) {\n const children = updates[childrenField];\n node[childrenField] = children;\n node[childrenCountField] = children?.length;\n }\n return node;\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(nodes, parentId, childNode, index, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount', expandedField = 'expanded') {\n const parent = this.findNodeById(nodes, parentId, idField, childrenField);\n if (!parent) {\n return null;\n }\n // Ensure children array exists\n let children = parent[childrenField];\n if (!children) {\n children = [];\n parent[childrenField] = children;\n }\n // Insert or append child\n if (index !== undefined && index >= 0 && index <= children.length) {\n children.splice(index, 0, childNode);\n }\n else {\n children.push(childNode);\n }\n // Update childrenCount\n parent[childrenCountField] = children.length;\n // Auto-expand parent if it was collapsed\n if (!parent[expandedField]) {\n parent[expandedField] = true;\n }\n return parent;\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(nodes, nodeId, idField = 'id', childrenField = 'children', childrenCountField = 'childrenCount') {\n const node = this.findNodeById(nodes, nodeId, idField, childrenField);\n if (!node) {\n return null;\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] : undefined;\n const targetArray = parentChildren ?? nodes;\n // Find and remove the node\n const index = targetArray.findIndex((n) => n[idField] === nodeId);\n if (index !== -1) {\n const removed = targetArray.splice(index, 1)[0];\n // Update parent's childrenCount if it exists\n if (parent) {\n const updatedChildren = parent[childrenField];\n parent[childrenCountField] = updatedChildren?.length ?? 0;\n }\n return removed;\n }\n return null;\n }\n /**\n * Validate node structure (check for required fields and circular references)\n */\n validateNode(node, visitedIds = new Set(), idField = 'id', titleField = 'title', childrenField = 'children', childrenCountField = 'childrenCount') {\n const errors = [];\n const nodeId = node[idField];\n const nodeTitle = node[titleField];\n if (!nodeId) {\n errors.push(`Node must have an ${idField}`);\n }\n if (!nodeTitle) {\n errors.push(`Node must have a ${titleField}`);\n }\n if (nodeId && visitedIds.has(nodeId)) {\n errors.push(`Circular reference detected: node ${nodeId} appears multiple times in the tree`);\n }\n const children = node[childrenField];\n if (children) {\n const newVisited = new Set(visitedIds);\n if (nodeId) {\n newVisited.add(nodeId);\n }\n for (const child of children) {\n const childValidation = this.validateNode(child, newVisited, idField, titleField, childrenField, childrenCountField);\n if (!childValidation.valid) {\n errors.push(...childValidation.errors.map((e) => `Child of ${nodeId}: ${e}`));\n }\n }\n const childrenCount = node[childrenCountField];\n if (childrenCount !== undefined && childrenCount !== children.length) {\n errors.push(`Node ${nodeId}: ${childrenCountField} (${childrenCount}) does not match ${childrenField} array length (${children.length})`);\n }\n }\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewService, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL3RyZWUtdmlldy9zcmMvbGliL3RyZWUtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDOzs7R0FHRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsc0RBQXNEO2FBQzlCLGlCQUFZLEdBQUcsd0JBQXdCLEFBQTNCLENBQTRCO2FBQ3hDLHFCQUFnQixHQUFHLHlCQUF5QixBQUE1QixDQUE2QjthQUM3QyxnQkFBVyxHQUFHLG9CQUFvQixBQUF2QixDQUF3QjtJQUUzRCxxRUFBcUU7SUFDckU7O09BRUc7SUFDSCxZQUFZLENBQUMsS0FBdUIsRUFBRSxFQUFVLEVBQUUsT0FBTyxHQUFHLElBQUksRUFBRSxhQUFhLEdBQUcsVUFBVTtRQUMxRixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUssSUFBSSxDQUFDLE9BQU8sQ0FBWSxLQUFLLEVBQUU7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBaUMsQ0FBQztZQUNyRSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUNaLEtBQXVCLEVBQ3ZCLFVBQTBCLEVBQzFCLE9BQU8sR0FBRyxJQUFJLEVBQ2QsYUFBYSxHQUFHLFVB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LGtCQUFrQixDQUF1QixDQUFDO1lBQ3JFLElBQUksYUFBYSxLQUFLLFNBQVMsSUFBSSxhQUFhLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyRSxNQUFNLENBQUMsSUFBSSxDQUNULFFBQVEsTUFBTSxLQUFLLGtCQUFrQixLQUFLLGFBQWEsb0JBQW9CLGFBQWEsa0JBQWtCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FDN0gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDMUIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDOzhHQW41QlUsaUJBQWlCO2tIQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWFRyZWVWaWV3Q2hpbGRyZW5TZWxlY3Rpb25TdGF0ZSwgQVhUcmVlVmlld0ZsYXROb2RlLCBBWFRyZWVWaWV3Tm9kZSB9IGZyb20gJy4vdHJlZS12aWV3LnR5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciB0cmVlIG5vZGUgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhbGwgYnVzaW5lc3MgbG9naWMgZm9yIHRyZWUgbm9kZSBtYW5pcHVsYXRpb25cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFYVHJlZVZpZXdTZXJ2aWNlIHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJPT1RfTElTVF9JRCA9ICdheC10cmVlLXZpZXctcm9vdC1saXN0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTk9ERV9EUk9QX1BSRUZJWCA9ICdheC10cmVlLXZpZXctbm9kZS1kcm9wLSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExJU1RfUFJFRklYID0gJ2F4LXRyZWUtdmlldy1saXN0LSc7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTm9kZSBGaW5kaW5nICYgVHJhdmVyc2FsID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBGaW5kIGEgbm9kZSBieSBJRCBpbiB0aGUgdHJlZVxuICAgKi9cbiAgZmluZE5vZGVCeUlkKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLCBpZDogc3RyaW5nLCBpZEZpZWxkID0gJ2lkJywgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKChub2RlW2lkRmllbGRdIGFzIHN0cmluZykgPT09IGlkKSByZXR1cm4gbm9kZTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTm9kZUJ5SWQoY2hpbGRyZW4sIGlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgcGFyZW50IG5vZGUgb2YgYSBnaXZlbiBub2RlXG4gICAqL1xuICBmaW5kUGFyZW50Tm9kZShcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICB0YXJnZXROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRhcmdldElkID0gdGFyZ2V0Tm9kZVtpZEZpZWxkXSBhcyBzdHJpbmc7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZHJlbj8uc29tZSgoY2hpbGQpID0+IChjaGlsZFtpZEZpZWxkXSBhcyBzdHJpbmcpID09PSB0YXJnZXRJZCkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKGNoaWxkcmVuLCB0YXJnZXROb2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGFyZ2V0Tm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgYW5jZXN0b3JOb2RlIChvciB0aGUgc2FtZSBub2RlKVxuICAgKiBQcmV2ZW50cyBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGNoZWNraW5nIGlmIHRhcmdldCBleGlzdHMgaW4gYW5jZXN0b3IncyBjaGlsZHJlbiB0cmVlXG4gICAqL1xuICBpc1ZhbGlkRHJvcFRhcmdldChcbiAgICBtb3ZlZE5vZGU6IEFYVHJlZVZpZXdOb2RlLFxuICAgIHRhcmdldE5vZGU6IEFYVHJlZVZpZXdOb2RlLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBtb3ZlZElkID0gbW92ZWROb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBjb25zdCB0YXJnZXRJZCA9IHRhcmdldE5vZGVbaWRGaWVsZF0gYXMgc3RyaW5nO1xuICAgIGlmIChtb3ZlZElkID09PSB0YXJnZXRJZCB8fCB0aGlzLmlzTm9kZURlc2NlbmRhbnRPZih0YXJnZXROb2RlLCBtb3ZlZE5vZGUsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcmdldE5vZGUgaXMgYSBkZXNjZW5kYW50IG9mIGFuY2VzdG9yTm9kZVxuICAgKi9cbiAgcHJpdmF0ZSBpc05vZGVEZXNjZW5kYW50T2YoXG4gICAgdGFyZ2V0Tm9kZTogQVhUcmVlVmlld05vZGUsXG4gICAgYW5jZXN0b3JOb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSB0YXJnZXROb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBjb25zdCBhbmNlc3RvcklkID0gYW5jZXN0b3JOb2RlW2lkRmllbGRdIGFzIHN0cmluZztcbiAgICBpZiAodGFyZ2V0SWQgPT09IGFuY2VzdG9ySWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gYW5jZXN0b3JOb2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZElkID0gY2hpbGRbaWRGaWVsZF0gYXMgc3RyaW5nO1xuICAgICAgaWYgKGNoaWxkSWQgPT09IHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNOb2RlRGVzY2VuZGFudE9mKHRhcmdldE5vZGUsIGNoaWxkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBmbGF0IGxpc3Qgb2YgYWxsIHZpc2libGUgZm9jdXNhYmxlIG5vZGVzXG4gICAqL1xuICBidWlsZEZsYXROb2RlTGlzdChcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBoaWRkZW5GaWVsZCA9ICdoaWRkZW4nLFxuICAgIGRpc2FibGVkRmllbGQgPSAnZGlzYWJsZWQnLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiBBWFRyZWVWaWV3RmxhdE5vZGVbXSB7XG4gICAgY29uc3QgZmxhdExpc3Q6IEFYVHJlZVZpZXdGbGF0Tm9kZVtdID0gW107XG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZUxpc3Q6IEFYVHJlZVZpZXdOb2RlW10sIGxldmVsOiBudW1iZXIsIHBhcmVudD86IEFYVHJlZVZpZXdOb2RlKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZUxpc3QpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gbm9kZVtoaWRkZW5GaWVsZF0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBub2RlW2Rpc2FibGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChoaWRkZW4gIT09IHRydWUgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgZmxhdExpc3QucHVzaCh7IG5vZGUsIGxldmVsLCBwYXJlbnQgfSk7XG4gICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBub2RlW2V4cGFuZGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGV4cGFuZGVkICYmIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRyYXZlcnNlKG5vZGVzLCAwKTtcbiAgICByZXR1cm4gZmxhdExpc3Q7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBOb2RlIFN0YXRlIENoZWNrcyA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogQ2hlY2sgaWYgbm9kZSBoYXMgY2hpbGRyZW5cbiAgICovXG4gIGhhc0NoaWxkcmVuKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkcmVuPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5vZGUgY2FuIGJlIGxhenkgbG9hZGVkXG4gICAqL1xuICBjYW5MYXp5TG9hZChcbiAgICBub2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpc0xhenlEYXRhU291cmNlOiBib29sZWFuLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hpbGRyZW5Db3VudCA9IG5vZGVbY2hpbGRyZW5Db3VudEZpZWxkXSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzTGF6eURhdGFTb3VyY2UgJiYgQm9vbGVhbihjaGlsZHJlbkNvdW50ICYmIGNoaWxkcmVuQ291bnQgPiAwICYmICF0aGlzLmhhc0NoaWxkcmVuKG5vZGUsIGNoaWxkcmVuRmllbGQpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbiBNYW5hZ2VtZW50ID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBzZWxlY3QvZGVzZWxlY3QgYWxsIGNoaWxkcmVuXG4gICAqL1xuICBzZWxlY3RBbGxDaGlsZHJlbihcbiAgICBjaGlsZHJlbjogQVhUcmVlVmlld05vZGVbXSxcbiAgICBzZWxlY3RlZDogYm9vbGVhbixcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkW3NlbGVjdGVkRmllbGRdID0gc2VsZWN0ZWQ7XG4gICAgICBjaGlsZFtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICBjb25zdCBjaGlsZENoaWxkcmVuID0gY2hpbGRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZENoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hpbGRyZW4oY2hpbGRDaGlsZHJlbiwgc2VsZWN0ZWQsIHNlbGVjdGVkRmllbGQsIGluZGV0ZXJtaW5hdGVGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3Rpb24gc3RhdGUgb2YgY2hpbGRyZW5cbiAgICovXG4gIGdldENoaWxkcmVuU2VsZWN0aW9uU3RhdGUoXG4gICAgY2hpbGRyZW46IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICApOiBBWFRyZWVWaWV3Q2hpbGRyZW5TZWxlY3Rpb25TdGF0ZSB7XG4gICAgbGV0IHNlbGVjdGVkQ291bnQgPSAwO1xuICAgIGxldCBpbmRldGVybWluYXRlQ291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjaGlsZFtzZWxlY3RlZEZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5kZXRlcm1pbmF0ZSA9IGNoaWxkW2luZGV0ZXJtaW5hdGVGaWVsZF0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiAhaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBzZWxlY3RlZENvdW50Kys7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBpbmRldGVybWluYXRlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsU2VsZWN0ZWQ6IHNlbGVjdGVkQ291bnQgPT09IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHNvbWVTZWxlY3RlZDogc2VsZWN0ZWRDb3VudCA+IDAgfHwgaW5kZXRlcm1pbmF0ZUNvdW50ID4gMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwYXJlbnQgbm9kZSBzdGF0ZXMgYmFzZWQgb24gY2hpbGRyZW4gc2VsZWN0aW9uICh3aXRoIGludGVybWVkaWF0ZSBzdGF0ZSBzdXBwb3J0KVxuICAgKi9cbiAgdXBkYXRlUGFyZW50U3RhdGVzKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIGNoYW5nZWROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpbnRlcm1lZGlhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZmluZFBhcmVudE5vZGUobm9kZXMsIGNoYW5nZWROb2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBwYXJlbnRDaGlsZHJlbiA9IHBhcmVudD8uW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudENoaWxkcmVuKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGFsbFNlbGVjdGVkLCBzb21lU2VsZWN0ZWQgfSA9IHRoaXMuZ2V0Q2hpbGRyZW5TZWxlY3Rpb25TdGF0ZShcbiAgICAgIHBhcmVudENoaWxkcmVuLFxuICAgICAgc2VsZWN0ZWRGaWVsZCxcbiAgICAgIGluZGV0ZXJtaW5hdGVGaWVsZCxcbiAgICApO1xuXG4gICAgaWYgKGFsbFNlbGVjdGVkKSB7XG4gICAgICBwYXJlbnRbc2VsZWN0ZWRGaWVsZF0gPSB0cnVlO1xuICAgICAgcGFyZW50W2luZGV0ZXJtaW5hdGVGaWVsZF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHNvbWVTZWxlY3RlZCkge1xuICAgICAgaWYgKGludGVybWVkaWF0ZVN0YXRlKSB7XG4gICAgICAgIHBhcmVudFtzZWxlY3RlZEZpZWxkXSA9IHRydWU7XG4gICAgICAgIHBhcmVudFtpbmRldGVybWluYXRlRmllbGRdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudFtzZWxlY3RlZEZpZWxkXSA9IGZhbHNlO1xuICAgICAgICBwYXJlbnRbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRbc2VsZWN0ZWRGaWVsZF0gPSBmYWxzZTtcbiAgICAgIHBhcmVudFtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICBub2RlcyxcbiAgICAgIHBhcmVudCxcbiAgICAgIGludGVybWVkaWF0ZVN0YXRlLFxuICAgICAgaWRGaWVsZCxcbiAgICAgIGNoaWxkcmVuRmllbGQsXG4gICAgICBzZWxlY3RlZEZpZWxkLFxuICAgICAgaW5kZXRlcm1pbmF0ZUZpZWxkLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZGVzZWxlY3QgYWxsIG5vZGVzXG4gICAqL1xuICBkZXNlbGVjdEFsbE5vZGVzKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGluZGV0ZXJtaW5hdGVGaWVsZCA9ICdpbmRldGVybWluYXRlJyxcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gZmFsc2U7XG4gICAgICBub2RlW2luZGV0ZXJtaW5hdGVGaWVsZF0gPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuZGVzZWxlY3RBbGxOb2RlcyhjaGlsZHJlbiwgc2VsZWN0ZWRGaWVsZCwgaW5kZXRlcm1pbmF0ZUZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgc2V0IHNlbGVjdGlvbiBzdGF0ZSBmb3IgYWxsIG5vZGVzXG4gICAqL1xuICBzZXRBbGxTZWxlY3Rpb24oXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIG5vZGVbc2VsZWN0ZWRGaWVsZF0gPSBzZWxlY3RlZDtcbiAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5zZXRBbGxTZWxlY3Rpb24oY2hpbGRyZW4sIHNlbGVjdGVkLCBzZWxlY3RlZEZpZWxkLCBpbmRldGVybWluYXRlRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb3VudCBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgY291bnRTZWxlY3RlZChub2RlczogQVhUcmVlVmlld05vZGVbXSwgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVbc2VsZWN0ZWRGaWVsZF0gYXMgYm9vbGVhbikgY291bnQrKztcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvdW50ICs9IHRoaXMuY291bnRTZWxlY3RlZChjaGlsZHJlbiwgc2VsZWN0ZWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb2xsZWN0IHNlbGVjdGVkIG5vZGVzXG4gICAqL1xuICBjb2xsZWN0U2VsZWN0ZWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgcmVzdWx0OiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmIChub2RlW3NlbGVjdGVkRmllbGRdIGFzIGJvb2xlYW4pIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0U2VsZWN0ZWQoY2hpbGRyZW4sIHJlc3VsdCwgc2VsZWN0ZWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlbW92ZSBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgcmVtb3ZlU2VsZWN0ZWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgc2VsZWN0ZWRGaWVsZCA9ICdzZWxlY3RlZCcsXG4gICAgaW5kZXRlcm1pbmF0ZUZpZWxkID0gJ2luZGV0ZXJtaW5hdGUnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gbm9kZVtzZWxlY3RlZEZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5kZXRlcm1pbmF0ZSA9IG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHNlbGVjdGVkICYmICFpbmRldGVybWluYXRlKSB7XG4gICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKGNoaWxkcmVuLCBzZWxlY3RlZEZpZWxkLCBpbmRldGVybWluYXRlRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHVwZGF0ZSBhbGwgcGFyZW50IHN0YXRlcyBpbiB0aGUgdHJlZSAodXNlZCBhZnRlciBkZWxldGlvbilcbiAgICovXG4gIHVwZGF0ZUFsbFBhcmVudFN0YXRlcyhcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBpbnRlcm1lZGlhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyxcbiAgICBzZWxlY3RlZEZpZWxkID0gJ3NlbGVjdGVkJyxcbiAgICBpbmRldGVybWluYXRlRmllbGQgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbFBhcmVudFN0YXRlcyhjaGlsZHJlbiwgaW50ZXJtZWRpYXRlU3RhdGUsIGNoaWxkcmVuRmllbGQsIHNlbGVjdGVkRmllbGQsIGluZGV0ZXJtaW5hdGVGaWVsZCk7XG5cbiAgICAgICAgY29uc3QgeyBhbGxTZWxlY3RlZCwgc29tZVNlbGVjdGVkIH0gPSB0aGlzLmdldENoaWxkcmVuU2VsZWN0aW9uU3RhdGUoXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgc2VsZWN0ZWRGaWVsZCxcbiAgICAgICAgICBpbmRldGVybWluYXRlRmllbGQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgbm9kZVtzZWxlY3RlZEZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgbm9kZVtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc29tZVNlbGVjdGVkKSB7XG4gICAgICAgICAgaWYgKGludGVybWVkaWF0ZVN0YXRlKSB7XG4gICAgICAgICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVbc2VsZWN0ZWRGaWVsZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIG5vZGVbaW5kZXRlcm1pbmF0ZUZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlW3NlbGVjdGVkRmllbGRdID0gZmFsc2U7XG4gICAgICAgICAgbm9kZVtpbmRldGVybWluYXRlRmllbGRdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBFeHBhbnNpb24gTWFuYWdlbWVudCA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgc2V0IGV4cGFuZGVkIHN0YXRlICh3aXRoIGxhenkgbG9hZGluZylcbiAgICovXG4gIGFzeW5jIHNldEV4cGFuZGVkU3RhdGUoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgZXhwYW5kZWQ6IGJvb2xlYW4sXG4gICAgaXNMYXp5RGF0YVNvdXJjZTogYm9vbGVhbixcbiAgICBsb2FkTm9kZUNoaWxkcmVuOiAobm9kZTogQVhUcmVlVmlld05vZGUpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZXhwYW5kZWRGaWVsZCA9ICdleHBhbmRlZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gdGhpcy5oYXNDaGlsZHJlbihub2RlLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy5jYW5MYXp5TG9hZChub2RlLCBpc0xhenlEYXRhU291cmNlLCBjaGlsZHJlbkNvdW50RmllbGQsIGNoaWxkcmVuRmllbGQpO1xuXG4gICAgICBpZiAoaGFzQ2hpbGRyZW4gfHwgY2FuTGF6eUxvYWQpIHtcbiAgICAgICAgaWYgKGV4cGFuZGVkICYmIGNhbkxhenlMb2FkKSB7XG4gICAgICAgICAgYXdhaXQgbG9hZE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlW2V4cGFuZGVkRmllbGRdID0gZXhwYW5kZWQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEV4cGFuZGVkU3RhdGUoXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGV4cGFuZGVkLFxuICAgICAgICAgICAgaXNMYXp5RGF0YVNvdXJjZSxcbiAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4sXG4gICAgICAgICAgICBleHBhbmRlZEZpZWxkLFxuICAgICAgICAgICAgY2hpbGRyZW5GaWVsZCxcbiAgICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRHJhZyAmIERyb3AgSGVscGVycyA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogR2V0IGFycmF5IHJlZmVyZW5jZSBieSBkcm9wIGxpc3QgSURcbiAgICovXG4gIGdldEFycmF5QnlMaXN0SWQoXG4gICAgbm9kZXM6IEFYVHJlZVZpZXdOb2RlW10sXG4gICAgbGlzdElkOiBzdHJpbmcsXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IEFYVHJlZVZpZXdOb2RlW10gfCBudWxsIHtcbiAgICBpZiAobGlzdElkID09PSBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQpIHtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBpZiAobGlzdElkLnN0YXJ0c1dpdGgoQVhUcmVlVmlld1NlcnZpY2UuTk9ERV9EUk9QX1BSRUZJWCkpIHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IGxpc3RJZC5yZXBsYWNlKEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVgsICcnKTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICAgIHJldHVybiBub2RlID8gW25vZGVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlSWQgPSBsaXN0SWQucmVwbGFjZShBWFRyZWVWaWV3U2VydmljZS5MSVNUX1BSRUZJWCwgJycpO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGU/LltjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBjaGlsZHJlbiA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgcGFyZW50IG5vZGUgYnkgbGlzdCBJRFxuICAgKi9cbiAgZmluZFBhcmVudEJ5TGlzdElkKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIGxpc3RJZDogc3RyaW5nLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICApOiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGxpc3RJZCA9PT0gQVhUcmVlVmlld1NlcnZpY2UuUk9PVF9MSVNUX0lEKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGxpc3RJZC5zdGFydHNXaXRoKEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVgpXG4gICAgICA/IEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVhcbiAgICAgIDogQVhUcmVlVmlld1NlcnZpY2UuTElTVF9QUkVGSVg7XG4gICAgY29uc3Qgbm9kZUlkID0gbGlzdElkLnJlcGxhY2UocHJlZml4LCAnJyk7XG4gICAgcmV0dXJuIHRoaXMuZmluZE5vZGVCeUlkKG5vZGVzLCBub2RlSWQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgbGlzdCBJRCBmb3IgZWFjaCBub2RlXG4gICAqL1xuICBnZXRMaXN0SWQobm9kZTogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQsIGlkRmllbGQgPSAnaWQnKTogc3RyaW5nIHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQ7XG4gICAgY29uc3Qgbm9kZUlkID0gbm9kZVtpZEZpZWxkXSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIGAke0FYVHJlZVZpZXdTZXJ2aWNlLkxJU1RfUFJFRklYfSR7bm9kZUlkfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvb3QgbGlzdCBJRCBjb25zdGFudFxuICAgKi9cbiAgZ2V0Um9vdExpc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBBWFRyZWVWaWV3U2VydmljZS5ST09UX0xJU1RfSUQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgZHJvcCBwcmVmaXggY29uc3RhbnRcbiAgICovXG4gIGdldE5vZGVEcm9wUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFYVHJlZVZpZXdTZXJ2aWNlLk5PREVfRFJPUF9QUkVGSVg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3QgcHJlZml4IGNvbnN0YW50XG4gICAqL1xuICBnZXRMaXN0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFYVHJlZVZpZXdTZXJ2aWNlLkxJU1RfUFJFRklYO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTm9kZSBVdGlsaXRpZXMgPT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEdldCBhbGwgbm9kZXMgaW4gYSBmbGF0IGFycmF5XG4gICAqL1xuICBnZXRBbGxOb2Rlcyhub2RlczogQVhUcmVlVmlld05vZGVbXSwgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicpOiBBWFRyZWVWaWV3Tm9kZVtdIHtcbiAgICBjb25zdCBhbGxOb2RlczogQVhUcmVlVmlld05vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVMaXN0OiBBWFRyZWVWaWV3Tm9kZVtdKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZUxpc3QpIHtcbiAgICAgICAgYWxsTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgIHRyYXZlcnNlKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdHJhdmVyc2Uobm9kZXMpO1xuICAgIHJldHVybiBhbGxOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhdGggdG8gYSBub2RlIChhcnJheSBvZiBwYXJlbnQgbm9kZXMgZnJvbSByb290IHRvIG5vZGUpXG4gICAqL1xuICBnZXROb2RlUGF0aChub2RlczogQVhUcmVlVmlld05vZGVbXSwgbm9kZUlkOiBzdHJpbmcsIGlkRmllbGQgPSAnaWQnLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIGNvbnN0IHBhdGg6IEFYVHJlZVZpZXdOb2RlW10gPSBbXTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudDogQVhUcmVlVmlld05vZGUgfCBudWxsID0gbm9kZTtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgcGF0aC51bnNoaWZ0KGN1cnJlbnQpO1xuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50Tm9kZShub2RlcywgY3VycmVudCwgaWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgICBjdXJyZW50ID0gcGFyZW50ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsZXZlbC9kZXB0aCBvZiBhIG5vZGUgKDAgPSByb290IGxldmVsKVxuICAgKi9cbiAgZ2V0Tm9kZUxldmVsKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLCBub2RlSWQ6IHN0cmluZywgaWRGaWVsZCA9ICdpZCcsIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXROb2RlUGF0aChub2Rlcywgbm9kZUlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gcGF0aC5sZW5ndGggLSAxIDogLTE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpYmxpbmcgbm9kZXMgb2YgYSBnaXZlbiBub2RlXG4gICAqL1xuICBnZXRTaWJsaW5ncyhub2RlczogQVhUcmVlVmlld05vZGVbXSwgbm9kZUlkOiBzdHJpbmcsIGlkRmllbGQgPSAnaWQnLCBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJyk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChub2Rlcywgbm9kZUlkLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBzaWJsaW5nc0FycmF5ID0gKHBhcmVudD8uW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQpID8/IG5vZGVzO1xuXG4gICAgcmV0dXJuIHNpYmxpbmdzQXJyYXkuZmlsdGVyKChuKSA9PiAobltpZEZpZWxkXSBhcyBzdHJpbmcpICE9PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb25lIGEgbm9kZSAoY3JlYXRlcyBhIGRlZXAgY29weSlcbiAgICovXG4gIGNsb25lTm9kZShcbiAgICBub2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpZEZpZWxkID0gJ2lkJyxcbiAgICB0aXRsZUZpZWxkID0gJ3RpdGxlJyxcbiAgICB0b29sdGlwRmllbGQgPSAndG9vbHRpcCcsXG4gICAgaWNvbkZpZWxkID0gJ2ljb24nLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICAgIHNlbGVjdGVkRmllbGQgPSAnc2VsZWN0ZWQnLFxuICAgIGluZGV0ZXJtaW5hdGVGaWVsZCA9ICdpbmRldGVybWluYXRlJyxcbiAgICBkaXNhYmxlZEZpZWxkID0gJ2Rpc2FibGVkJyxcbiAgICBoaWRkZW5GaWVsZCA9ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBkYXRhRmllbGQgPSAnZGF0YScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICk6IEFYVHJlZVZpZXdOb2RlIHtcbiAgICBjb25zdCBjbG9uZWQ6IEFYVHJlZVZpZXdOb2RlID0ge1xuICAgICAgW2lkRmllbGRdOiBgJHtub2RlW2lkRmllbGRdIGFzIHN0cmluZ30tY2xvbmUtJHtEYXRlLm5vdygpfWAsXG4gICAgICBbdGl0bGVGaWVsZF06IG5vZGVbdGl0bGVGaWVsZF0sXG4gICAgICBbdG9vbHRpcEZpZWxkXTogbm9kZVt0b29sdGlwRmllbGRdLFxuICAgICAgW2ljb25GaWVsZF06IG5vZGVbaWNvbkZpZWxkXSxcbiAgICAgIFtleHBhbmRlZEZpZWxkXTogbm9kZVtleHBhbmRlZEZpZWxkXSxcbiAgICAgIFtzZWxlY3RlZEZpZWxkXTogZmFsc2UsIC8vIENsb25lZCBub2RlcyBhcmUgbm90IHNlbGVjdGVkIGJ5IGRlZmF1bHRcbiAgICAgIFtpbmRldGVybWluYXRlRmllbGRdOiBmYWxzZSxcbiAgICAgIFtkaXNhYmxlZEZpZWxkXTogbm9kZVtkaXNhYmxlZEZpZWxkXSxcbiAgICAgIFtoaWRkZW5GaWVsZF06IG5vZGVbaGlkZGVuRmllbGRdLFxuICAgICAgW2NoaWxkcmVuQ291bnRGaWVsZF06IG5vZGVbY2hpbGRyZW5Db3VudEZpZWxkXSxcbiAgICAgIFtkYXRhRmllbGRdOiBub2RlW2RhdGFGaWVsZF0gPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vZGVbZGF0YUZpZWxkXSkpIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY2xvbmVkW2NoaWxkcmVuRmllbGRdID0gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT5cbiAgICAgICAgdGhpcy5jbG9uZU5vZGUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgaWRGaWVsZCxcbiAgICAgICAgICB0aXRsZUZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBGaWVsZCxcbiAgICAgICAgICBpY29uRmllbGQsXG4gICAgICAgICAgZXhwYW5kZWRGaWVsZCxcbiAgICAgICAgICBzZWxlY3RlZEZpZWxkLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGVGaWVsZCxcbiAgICAgICAgICBkaXNhYmxlZEZpZWxkLFxuICAgICAgICAgIGhpZGRlbkZpZWxkLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgICBkYXRhRmllbGQsXG4gICAgICAgICAgY2hpbGRyZW5GaWVsZCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBjbG9uZWRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IChjbG9uZWRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBOb2RlIE1hbmlwdWxhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogTW92ZSBhIG5vZGUgdG8gYSBuZXcgcGFyZW50IGluIHRoZSB0cmVlXG4gICAqIEBwYXJhbSBub2RlcyAtIFJvb3Qgbm9kZXMgYXJyYXlcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBtb3ZlXG4gICAqIEBwYXJhbSBuZXdQYXJlbnRJZCAtIFRoZSBJRCBvZiB0aGUgbmV3IHBhcmVudCAodW5kZWZpbmVkIGZvciByb290IGxldmVsKVxuICAgKiBAcGFyYW0gaW5kZXggLSBPcHRpb25hbCBpbmRleCB0byBpbnNlcnQgYXQgKGRlZmF1bHQ6IGFwcGVuZCB0byBlbmQpXG4gICAqIEBwYXJhbSBpZEZpZWxkIC0gRmllbGQgbmFtZSBmb3Igbm9kZSBJRFxuICAgKiBAcGFyYW0gY2hpbGRyZW5GaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGFycmF5XG4gICAqIEBwYXJhbSBjaGlsZHJlbkNvdW50RmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBjb3VudFxuICAgKiBAcGFyYW0gZXhwYW5kZWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGV4cGFuZGVkIHN0YXRlXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLCBtb3ZlZCBub2RlLCBwcmV2aW91cyBwYXJlbnQsIG5ldyBwYXJlbnQsIGFuZCBpbmRpY2VzXG4gICAqL1xuICBtb3ZlTm9kZShcbiAgICBub2RlczogQVhUcmVlVmlld05vZGVbXSxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICAgIGV4cGFuZGVkRmllbGQgPSAnZXhwYW5kZWQnLFxuICApOiB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtb3ZlZE5vZGU/OiBBWFRyZWVWaWV3Tm9kZTtcbiAgICBwcmV2aW91c1BhcmVudD86IEFYVHJlZVZpZXdOb2RlO1xuICAgIG5ld1BhcmVudD86IEFYVHJlZVZpZXdOb2RlO1xuICAgIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgICBjdXJyZW50SW5kZXg6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGVCeUlkKG5vZGVzLCBub2RlSWQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHByZXZpb3VzSW5kZXg6IC0xLCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjdXJyZW50IHBhcmVudFxuICAgIGNvbnN0IGN1cnJlbnRQYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBjdXJyZW50UGFyZW50Q2hpbGRyZW4gPSBjdXJyZW50UGFyZW50XG4gICAgICA/IChjdXJyZW50UGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjdXJyZW50QXJyYXkgPSBjdXJyZW50UGFyZW50Q2hpbGRyZW4gPz8gbm9kZXM7XG5cbiAgICAvLyBGaW5kIGFuZCByZW1vdmUgZnJvbSBjdXJyZW50IGxvY2F0aW9uXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEFycmF5LmZpbmRJbmRleCgobikgPT4gKG5baWRGaWVsZF0gYXMgc3RyaW5nKSA9PT0gbm9kZUlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHByZXZpb3VzSW5kZXg6IC0xLCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgfVxuXG4gICAgY29uc3QgbW92ZWROb2RlID0gY3VycmVudEFycmF5LnNwbGljZShjdXJyZW50SW5kZXgsIDEpWzBdO1xuXG4gICAgLy8gRmluZCBuZXcgcGFyZW50XG4gICAgbGV0IHRhcmdldEFycmF5OiBBWFRyZWVWaWV3Tm9kZVtdO1xuICAgIGxldCBuZXdQYXJlbnQ6IEFYVHJlZVZpZXdOb2RlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1BhcmVudElkKSB7XG4gICAgICBuZXdQYXJlbnQgPSB0aGlzLmZpbmROb2RlQnlJZChub2RlcywgbmV3UGFyZW50SWQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgICAgaWYgKCFuZXdQYXJlbnQpIHtcbiAgICAgICAgLy8gUmVzdG9yZSBub2RlIGlmIG5ldyBwYXJlbnQgbm90IGZvdW5kXG4gICAgICAgIGN1cnJlbnRBcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBtb3ZlZE5vZGUpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcHJldmlvdXNJbmRleDogY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGRyb3AgdGFyZ2V0XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZERyb3BUYXJnZXQobW92ZWROb2RlLCBuZXdQYXJlbnQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgbm9kZSBpZiBpbnZhbGlkIGRyb3AgdGFyZ2V0XG4gICAgICAgIGN1cnJlbnRBcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBtb3ZlZE5vZGUpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcHJldmlvdXNJbmRleDogY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXg6IC0xIH07XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdQYXJlbnRDaGlsZHJlbiA9IG5ld1BhcmVudFtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFuZXdQYXJlbnRDaGlsZHJlbikge1xuICAgICAgICBuZXdQYXJlbnRDaGlsZHJlbiA9IFtdO1xuICAgICAgICBuZXdQYXJlbnRbY2hpbGRyZW5GaWVsZF0gPSBuZXdQYXJlbnRDaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHRhcmdldEFycmF5ID0gbmV3UGFyZW50Q2hpbGRyZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEFycmF5ID0gbm9kZXM7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBpbmRleCBiZWZvcmUgaW5zZXJ0aW5nXG4gICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IDAgJiYgaW5kZXggPD0gdGFyZ2V0QXJyYXkubGVuZ3RoID8gaW5kZXggOiB0YXJnZXRBcnJheS5sZW5ndGg7XG5cbiAgICAvLyBJbnNlcnQgYXQgbmV3IGxvY2F0aW9uXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8PSB0YXJnZXRBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZShpbmRleCwgMCwgbW92ZWROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChtb3ZlZE5vZGUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZHJlbkNvdW50XG4gICAgaWYgKGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZHJlbiA9IGN1cnJlbnRQYXJlbnRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGN1cnJlbnRQYXJlbnRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IHVwZGF0ZWRDaGlsZHJlbj8ubGVuZ3RoID8/IDA7XG4gICAgfVxuICAgIGlmIChuZXdQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZHJlbiA9IG5ld1BhcmVudFtjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgbmV3UGFyZW50W2NoaWxkcmVuQ291bnRGaWVsZF0gPSB1cGRhdGVkQ2hpbGRyZW4/Lmxlbmd0aCA/PyAwO1xuICAgICAgbmV3UGFyZW50W2V4cGFuZGVkRmllbGRdID0gdHJ1ZTsgLy8gQXV0by1leHBhbmQgbmV3IHBhcmVudFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbW92ZWROb2RlLFxuICAgICAgcHJldmlvdXNQYXJlbnQ6IGN1cnJlbnRQYXJlbnQsXG4gICAgICBuZXdQYXJlbnQsXG4gICAgICBwcmV2aW91c0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICBjdXJyZW50SW5kZXg6IG5ld0luZGV4LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRWRpdC91cGRhdGUgYSBub2RlJ3MgcHJvcGVydGllc1xuICAgKiBAcGFyYW0gbm9kZXMgLSBSb290IG5vZGVzIGFycmF5XG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gZWRpdFxuICAgKiBAcGFyYW0gdXBkYXRlcyAtIFBhcnRpYWwgbm9kZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gaWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIG5vZGUgSURcbiAgICogQHBhcmFtIGNoaWxkcmVuRmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBhcnJheVxuICAgKiBAcGFyYW0gY2hpbGRyZW5Db3VudEZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gY291bnRcbiAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbm9kZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGVkaXROb2RlKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QVhUcmVlVmlld05vZGU+LFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbm9kZSBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmFzc2lnbihub2RlLCB1cGRhdGVzKTtcblxuICAgIC8vIElmIGNoaWxkcmVuIGFycmF5IGlzIHByb3ZpZGVkLCBlbnN1cmUgaXQgZXhpc3RzIGFuZCB1cGRhdGUgY2hpbGRyZW5Db3VudFxuICAgIGlmICh1cGRhdGVzW2NoaWxkcmVuRmllbGRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdXBkYXRlc1tjaGlsZHJlbkZpZWxkXSBhcyBBWFRyZWVWaWV3Tm9kZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgbm9kZVtjaGlsZHJlbkZpZWxkXSA9IGNoaWxkcmVuO1xuICAgICAgbm9kZVtjaGlsZHJlbkNvdW50RmllbGRdID0gY2hpbGRyZW4/Lmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjaGlsZCBub2RlIHRvIGEgcGFyZW50IG5vZGVcbiAgICogQHBhcmFtIG5vZGVzIC0gUm9vdCBub2RlcyBhcnJheVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgSUQgb2YgdGhlIHBhcmVudCBub2RlXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgLSBUaGUgY2hpbGQgbm9kZSB0byBhZGRcbiAgICogQHBhcmFtIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IGF0IChkZWZhdWx0OiBhcHBlbmQgdG8gZW5kKVxuICAgKiBAcGFyYW0gaWRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIG5vZGUgSURcbiAgICogQHBhcmFtIGNoaWxkcmVuRmllbGQgLSBGaWVsZCBuYW1lIGZvciBjaGlsZHJlbiBhcnJheVxuICAgKiBAcGFyYW0gY2hpbGRyZW5Db3VudEZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gY291bnRcbiAgICogQHBhcmFtIGV4cGFuZGVkRmllbGQgLSBGaWVsZCBuYW1lIGZvciBleHBhbmRlZCBzdGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IG5vZGUgaWYgZm91bmQgYW5kIGNoaWxkIHdhcyBhZGRlZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGFkZENoaWxkKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgY2hpbGROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgICBleHBhbmRlZEZpZWxkID0gJ2V4cGFuZGVkJyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmROb2RlQnlJZChub2RlcywgcGFyZW50SWQsIGlkRmllbGQsIGNoaWxkcmVuRmllbGQpO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgY2hpbGRyZW4gYXJyYXkgZXhpc3RzXG4gICAgbGV0IGNoaWxkcmVuID0gcGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAgIHBhcmVudFtjaGlsZHJlbkZpZWxkXSA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBvciBhcHBlbmQgY2hpbGRcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSAwICYmIGluZGV4IDw9IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNoaWxkcmVuQ291bnRcbiAgICBwYXJlbnRbY2hpbGRyZW5Db3VudEZpZWxkXSA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgIC8vIEF1dG8tZXhwYW5kIHBhcmVudCBpZiBpdCB3YXMgY29sbGFwc2VkXG4gICAgaWYgKCEocGFyZW50W2V4cGFuZGVkRmllbGRdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpKSB7XG4gICAgICBwYXJlbnRbZXhwYW5kZWRGaWVsZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSB0cmVlXG4gICAqIEBwYXJhbSBub2RlcyAtIFJvb3Qgbm9kZXMgYXJyYXlcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byByZW1vdmVcbiAgICogQHBhcmFtIGlkRmllbGQgLSBGaWVsZCBuYW1lIGZvciBub2RlIElEXG4gICAqIEBwYXJhbSBjaGlsZHJlbkZpZWxkIC0gRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gYXJyYXlcbiAgICogQHBhcmFtIGNoaWxkcmVuQ291bnRGaWVsZCAtIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGNvdW50XG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIG5vZGUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICByZW1vdmVOb2RlKFxuICAgIG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIGlkRmllbGQgPSAnaWQnLFxuICAgIGNoaWxkcmVuRmllbGQgPSAnY2hpbGRyZW4nLFxuICAgIGNoaWxkcmVuQ291bnRGaWVsZCA9ICdjaGlsZHJlbkNvdW50JyxcbiAgKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQobm9kZXMsIG5vZGVJZCwgaWRGaWVsZCwgY2hpbGRyZW5GaWVsZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHBhcmVudCB0byByZW1vdmUgZnJvbSBpdHMgY2hpbGRyZW4gYXJyYXlcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnROb2RlKG5vZGVzLCBub2RlLCBpZEZpZWxkLCBjaGlsZHJlbkZpZWxkKTtcbiAgICBjb25zdCBwYXJlbnRDaGlsZHJlbiA9IHBhcmVudCA/IChwYXJlbnRbY2hpbGRyZW5GaWVsZF0gYXMgQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBwYXJlbnRDaGlsZHJlbiA/PyBub2RlcztcblxuICAgIC8vIEZpbmQgYW5kIHJlbW92ZSB0aGUgbm9kZVxuICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0QXJyYXkuZmluZEluZGV4KChuKSA9PiAobltpZEZpZWxkXSBhcyBzdHJpbmcpID09PSBub2RlSWQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0YXJnZXRBcnJheS5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuXG4gICAgICAvLyBVcGRhdGUgcGFyZW50J3MgY2hpbGRyZW5Db3VudCBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkcmVuID0gcGFyZW50W2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIHBhcmVudFtjaGlsZHJlbkNvdW50RmllbGRdID0gdXBkYXRlZENoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgbm9kZSBzdHJ1Y3R1cmUgKGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgYW5kIGNpcmN1bGFyIHJlZmVyZW5jZXMpXG4gICAqL1xuICB2YWxpZGF0ZU5vZGUoXG4gICAgbm9kZTogQVhUcmVlVmlld05vZGUsXG4gICAgdmlzaXRlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCksXG4gICAgaWRGaWVsZCA9ICdpZCcsXG4gICAgdGl0bGVGaWVsZCA9ICd0aXRsZScsXG4gICAgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbicsXG4gICAgY2hpbGRyZW5Db3VudEZpZWxkID0gJ2NoaWxkcmVuQ291bnQnLFxuICApOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBub2RlSWQgPSBub2RlW2lkRmllbGRdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlVGl0bGUgPSBub2RlW3RpdGxlRmllbGRdIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICBlcnJvcnMucHVzaChgTm9kZSBtdXN0IGhhdmUgYW4gJHtpZEZpZWxkfWApO1xuICAgIH1cblxuICAgIGlmICghbm9kZVRpdGxlKSB7XG4gICAgICBlcnJvcnMucHVzaChgTm9kZSBtdXN0IGhhdmUgYSAke3RpdGxlRmllbGR9YCk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVJZCAmJiB2aXNpdGVkSWRzLmhhcyhub2RlSWQpKSB7XG4gICAgICBlcnJvcnMucHVzaChgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiBub2RlICR7bm9kZUlkfSBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZSB0cmVlYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlW2NoaWxkcmVuRmllbGRdIGFzIEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBuZXdWaXNpdGVkID0gbmV3IFNldCh2aXNpdGVkSWRzKTtcbiAgICAgIGlmIChub2RlSWQpIHtcbiAgICAgICAgbmV3VmlzaXRlZC5hZGQobm9kZUlkKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZFZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlTm9kZShcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBuZXdWaXNpdGVkLFxuICAgICAgICAgIGlkRmllbGQsXG4gICAgICAgICAgdGl0bGVGaWVsZCxcbiAgICAgICAgICBjaGlsZHJlbkZpZWxkLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnRGaWVsZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjaGlsZFZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCguLi5jaGlsZFZhbGlkYXRpb24uZXJyb3JzLm1hcCgoZSkgPT4gYENoaWxkIG9mICR7bm9kZUlkfTogJHtlfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gbm9kZVtjaGlsZHJlbkNvdW50RmllbGRdIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjaGlsZHJlbkNvdW50ICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW5Db3VudCAhPT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIGBOb2RlICR7bm9kZUlkfTogJHtjaGlsZHJlbkNvdW50RmllbGR9ICgke2NoaWxkcmVuQ291bnR9KSBkb2VzIG5vdCBtYXRjaCAke2NoaWxkcmVuRmllbGR9IGFycmF5IGxlbmd0aCAoJHtjaGlsZHJlbi5sZW5ndGh9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==","import { AXDragDirective, AXDragHandleDirective, AXDropListDirective, moveItemInArray, transferArrayItem, } 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 { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, ViewEncapsulation, } 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 * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nimport * as i2 from \"@angular/forms\";\nexport class AXTreeViewComponent {\n constructor() {\n // ==================== Dependencies ====================\n this.treeService = inject(AXTreeViewService);\n this.platformService = inject(AXPlatform);\n this.destroyRef = inject(DestroyRef);\n // ==================== Inputs ====================\n /** Tree data source - can be static array or lazy loading function */\n this.datasource = model.required(...(ngDevMode ? [{ debugName: \"datasource\" }] : []));\n /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */\n this.selectMode = input('single', ...(ngDevMode ? [{ debugName: \"selectMode\" }] : []));\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 this.selectionBehavior = input('intermediate', ...(ngDevMode ? [{ debugName: \"selectionBehavior\" }] : []));\n /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */\n this.dragArea = input('handler', ...(ngDevMode ? [{ debugName: \"dragArea\" }] : []));\n /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */\n this.dragBehavior = input('none', ...(ngDevMode ? [{ debugName: \"dragBehavior\" }] : []));\n /** Whether to show icons. Default: `true` */\n this.showIcons = input(true, ...(ngDevMode ? [{ debugName: \"showIcons\" }] : []));\n /** Whether to show children count badge. Default: `true` */\n this.showChildrenBadge = input(true, ...(ngDevMode ? [{ debugName: \"showChildrenBadge\" }] : []));\n /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */\n this.expandedIcon = input('fa-solid fa-chevron-down', ...(ngDevMode ? [{ debugName: \"expandedIcon\" }] : []));\n /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */\n this.collapsedIcon = input('fa-solid fa-chevron-right', ...(ngDevMode ? [{ debugName: \"collapsedIcon\" }] : []));\n /** Indent size in pixels for each level. Default: `16` */\n this.indentSize = input(16, ...(ngDevMode ? [{ debugName: \"indentSize\" }] : []));\n /** Visual style variant. Default: `'default'` */\n this.look = input('default', ...(ngDevMode ? [{ debugName: \"look\" }] : []));\n /** Custom template for tree items. Default: `undefined` */\n this.nodeTemplate = input(...(ngDevMode ? [undefined, { debugName: \"nodeTemplate\" }] : []));\n /** Field name for node ID. Default: `'id'` */\n this.idField = input('id', ...(ngDevMode ? [{ debugName: \"idField\" }] : []));\n /** Field name for node title. Default: `'title'` */\n this.titleField = input('title', ...(ngDevMode ? [{ debugName: \"titleField\" }] : []));\n /** Field name for node tooltip. Default: `'tooltip'` */\n this.tooltipField = input('tooltip', ...(ngDevMode ? [{ debugName: \"tooltipField\" }] : []));\n /** Field name for node icon. Default: `'icon'` */\n this.iconField = input('icon', ...(ngDevMode ? [{ debugName: \"iconField\" }] : []));\n /** Field name for expanded state. Default: `'expanded'` */\n this.expandedField = input('expanded', ...(ngDevMode ? [{ debugName: \"expandedField\" }] : []));\n /** Field name for selected state. Default: `'selected'` */\n this.selectedField = input('selected', ...(ngDevMode ? [{ debugName: \"selectedField\" }] : []));\n /** Field name for indeterminate state. Default: `'indeterminate'` */\n this.indeterminateField = input('indeterminate', ...(ngDevMode ? [{ debugName: \"indeterminateField\" }] : []));\n /** Field name for disabled state. Default: `'disabled'` */\n this.disabledField = input('disabled', ...(ngDevMode ? [{ debugName: \"disabledField\" }] : []));\n /** Field name for hidden state. Default: `'hidden'` */\n this.hiddenField = input('hidden', ...(ngDevMode ? [{ debugName: \"hiddenField\" }] : []));\n /** Field name for children array. Default: `'children'` */\n this.childrenField = input('children', ...(ngDevMode ? [{ debugName: \"childrenField\" }] : []));\n /** Field name for children count. Default: `'childrenCount'` */\n this.childrenCountField = input('childrenCount', ...(ngDevMode ? [{ debugName: \"childrenCountField\" }] : []));\n /** Field name for custom data. Default: `'data'` */\n this.dataField = input('data', ...(ngDevMode ? [{ debugName: \"dataField\" }] : []));\n /** Whether disabled state is inherited from parent nodes. Default: `true`. */\n this.inheritDisabled = input(true, ...(ngDevMode ? [{ debugName: \"inheritDisabled\" }] : []));\n // ==================== Outputs ====================\n /** Emitted before a drop operation - set canceled to true to prevent drop */\n this.onBeforeDrop = output();\n /** Emitted when a node is toggled (expanded/collapsed) */\n this.onNodeToggle = output();\n /** Emitted when a node is selected/deselected */\n this.onNodeSelect = output();\n /** Emitted when a node is double-clicked */\n this.onNodeDoubleClick = output();\n /** Emitted when a node is double-clicked */\n this.onNodeClick = output();\n /** Emitted when selection changes - returns all currently selected nodes */\n this.onSelectionChange = output();\n /** Emitted when nodes are reordered within the same parent */\n this.onOrderChange = output();\n /** Emitted when a node is moved to a different parent */\n this.onMoveChange = output();\n /** Emitted for any item change (order or move) */\n this.onItemsChange = output();\n // ==================== Internal State ====================\n /** Internal signal for tree nodes */\n this.nodes = signal([], ...(ngDevMode ? [{ debugName: \"nodes\" }] : []));\n /** Internal signal for tracking loading state */\n this.loadingNodes = signal(new Set(), ...(ngDevMode ? [{ debugName: \"loadingNodes\" }] : []));\n /** Currently focused node ID for keyboard navigation */\n this.focusedNodeId = signal(null, ...(ngDevMode ? [{ debugName: \"focusedNodeId\" }] : []));\n /** RTL detection signal */\n this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: \"isRtl\" }] : []));\n /** active node id */\n this.activeNodeId = signal(null, ...(ngDevMode ? [{ debugName: \"activeNodeId\" }] : []));\n /** Computed chevron icons that flip for RTL */\n this.directionExpandedIcon = computed(() => this.expandedIcon(), ...(ngDevMode ? [{ debugName: \"directionExpandedIcon\" }] : []));\n this.directionCollapsedIcon = computed(() => {\n const isRtlDirection = this.isRtl();\n const defaultIcon = this.collapsedIcon();\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 }, ...(ngDevMode ? [{ debugName: \"directionCollapsedIcon\" }] : []));\n /** Flag to prevent infinite loops when syncing datasource */\n this.isUpdatingFromDatasource = false;\n /** Computed to check if datasource is a function */\n this.isLazyDataSource = computed(() => typeof this.datasource() === 'function', ...(ngDevMode ? [{ debugName: \"isLazyDataSource\" }] : []));\n /** Computed: Returns true when selection is restricted to leaf nodes only */\n this.isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf', ...(ngDevMode ? [{ debugName: \"isLeafOnlyMode\" }] : []));\n /** Computed: Returns true when selecting a parent automatically selects all its children */\n this.cascadesToChildren = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'nested' || behavior === 'intermediate-nested';\n }, ...(ngDevMode ? [{ debugName: \"cascadesToChildren\" }] : []));\n /** Computed: Returns true when parent nodes show indeterminate state based on children selection */\n this.hasIntermediateState = computed(() => {\n const behavior = this.selectionBehavior();\n return behavior === 'intermediate' || behavior === 'intermediate-nested';\n }, ...(ngDevMode ? [{ debugName: \"hasIntermediateState\" }] : []));\n /** Computed: Returns true when drag handle should be shown */\n this.shouldShowDragHandle = computed(() => {\n return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';\n }, ...(ngDevMode ? [{ debugName: \"shouldShowDragHandle\" }] : []));\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n this.#datasourceEffect = effect(async () => {\n if (this.isUpdatingFromDatasource) {\n return;\n }\n const ds = this.datasource();\n if (Array.isArray(ds)) {\n this.nodes.set([...ds]);\n }\n else if (typeof ds === 'function') {\n try {\n await this.loadRootItems(ds);\n }\n catch (error) {\n this.handleError('Failed to load root items', error);\n }\n }\n }, ...(ngDevMode ? [{ debugName: \"#datasourceEffect\" }] : []));\n /** Initialize direction change listener */\n this.#initDirectionListener = afterNextRender(() => {\n this.platformService.directionChange\n .pipe(map((event) => event.data === 'rtl'), takeUntilDestroyed(this.destroyRef))\n .subscribe((isRtl) => this.isRtl.set(isRtl));\n });\n }\n // ==================== Node Property Helpers ====================\n /**\n * Get a property value from a node using the configured field name\n */\n getNodeProp(node, fieldName, defaultValue) {\n return node[fieldName] ?? defaultValue;\n }\n /**\n * Set a property value on a node using the configured field name\n */\n setNodeProp(node, fieldName, value) {\n node[fieldName] = value;\n }\n /**\n * Get node ID\n */\n getNodeId(node) {\n return this.getNodeProp(node, this.idField(), '');\n }\n /**\n * Get node title\n */\n getNodeTitle(node) {\n return this.getNodeProp(node, this.titleField(), '');\n }\n /**\n * Get node tooltip\n */\n getNodeTooltip(node) {\n return this.getNodeProp(node, this.tooltipField(), undefined);\n }\n /**\n * Get node icon\n */\n getNodeIcon(node) {\n return this.getNodeProp(node, this.iconField(), undefined);\n }\n /**\n * Get node expanded state\n */\n getNodeExpanded(node) {\n return this.getNodeProp(node, this.expandedField(), false);\n }\n /**\n * Set node expanded state\n */\n setNodeExpanded(node, value) {\n this.setNodeProp(node, this.expandedField(), value);\n }\n /**\n * Get node selected state\n */\n getNodeSelected(node) {\n return this.getNodeProp(node, this.selectedField(), false);\n }\n /**\n * Set node selected state\n */\n setNodeSelected(node, value) {\n this.setNodeProp(node, this.selectedField(), value);\n }\n /**\n * Get node indeterminate state\n */\n getNodeIndeterminate(node) {\n return this.getNodeProp(node, this.indeterminateField(), false);\n }\n /**\n * Set node indeterminate state\n */\n setNodeIndeterminate(node, value) {\n this.setNodeProp(node, this.indeterminateField(), value);\n }\n /**\n * Get node's own disabled state (without inheritance)\n */\n getNodeDisabled(node) {\n return this.getNodeProp(node, this.disabledField(), false);\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 isNodeEffectivelyDisabled(node) {\n // Check if node itself is disabled\n if (this.getNodeDisabled(node)) {\n return true;\n }\n // If not inheriting disabled state, just return false (node is not disabled)\n if (!this.inheritDisabled()) {\n return false;\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 // Check ancestors for disabled state\n return this.isAnyAncestorDisabled(node);\n }\n /**\n * Check if any ancestor of the node is disabled\n */\n isAnyAncestorDisabled(node) {\n const parent = this.treeService.findParentNode(this.nodes(), node, this.idField(), this.childrenField());\n if (!parent) {\n return false;\n }\n if (this.getNodeDisabled(parent)) {\n return true;\n }\n return this.isAnyAncestorDisabled(parent);\n }\n /**\n * Get node hidden state\n */\n getNodeHidden(node) {\n return this.getNodeProp(node, this.hiddenField(), false);\n }\n /**\n * Get node children array\n */\n getNodeChildren(node) {\n return this.getNodeProp(node, this.childrenField(), undefined);\n }\n /**\n * Set node children array\n */\n setNodeChildren(node, value) {\n this.setNodeProp(node, this.childrenField(), value);\n }\n /**\n * Get node children count\n */\n getNodeChildrenCount(node) {\n return this.getNodeProp(node, this.childrenCountField(), undefined);\n }\n /**\n * Set node children count\n */\n setNodeChildrenCount(node, value) {\n this.setNodeProp(node, this.childrenCountField(), value);\n }\n // ==================== Effects ====================\n /** Effect to handle datasource changes */\n #datasourceEffect;\n /** Initialize direction change listener */\n #initDirectionListener;\n // ==================== Public API ====================\n /**\n * Expand all nodes in the tree (with lazy loading support)\n */\n async expandAll() {\n await this.treeService.setExpandedState(this.nodes(), true, this.isLazyDataSource(), (node) => this.loadNodeChildren(node), this.expandedField(), this.childrenField(), this.childrenCountField());\n this.refreshNodes();\n }\n /**\n * Collapse all nodes in the tree\n */\n collapseAll() {\n this.treeService.setExpandedState(this.nodes(), false, this.isLazyDataSource(), (node) => this.loadNodeChildren(node), this.expandedField(), this.childrenField(), this.childrenCountField());\n this.refreshNodes();\n }\n /**\n * Get count of selected nodes\n */\n getSelectedCount() {\n return this.treeService.countSelected(this.nodes(), this.selectedField(), this.childrenField());\n }\n /**\n * Check if any nodes are selected\n */\n hasSelection() {\n return this.getSelectedCount() > 0;\n }\n /**\n * Get all selected nodes\n */\n getSelectedNodes() {\n const selected = [];\n this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());\n return selected;\n }\n /**\n * Delete selected nodes from the tree\n */\n deleteSelected() {\n this.treeService.removeSelected(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n if (!this.isLeafOnlyMode()) {\n this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n this.emitSelectionChange();\n }\n /**\n * Select all nodes in the tree (respects disabled state)\n */\n selectAll() {\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) => {\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 }\n else {\n // Select all nodes that are not disabled\n const selectAllNonDisabled = (nodes) => {\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 * Deselect all nodes in the tree\n */\n deselectAll() {\n this.treeService.setAllSelection(this.nodes(), false, this.selectedField(), this.indeterminateField(), this.childrenField());\n this.refreshNodes();\n this.emitSelectionChange();\n }\n /**\n * Find a node by ID in the tree\n */\n findNode(id) {\n return this.treeService.findNodeById(this.nodes(), id, this.idField(), this.childrenField());\n }\n /**\n * Refresh the tree to trigger change detection\n */\n refresh() {\n this.refreshNodes();\n }\n /**\n * Check if a node is currently loading\n */\n isNodeLoading(nodeId) {\n return this.loadingNodes().has(nodeId);\n }\n /**\n * Get loading state for a node (internal state)\n */\n getNodeLoading(node) {\n return this.loadingNodes().has(this.getNodeId(node));\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, updates) {\n const updated = this.treeService.editNode(this.nodes(), nodeId, updates, this.idField(), this.childrenField(), this.childrenCountField());\n if (updated) {\n this.refreshNodes();\n return true;\n }\n return false;\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, childNode, index) {\n const parent = this.treeService.addChild(this.nodes(), parentId, childNode, index, this.idField(), this.childrenField(), this.childrenCountField(), this.expandedField());\n if (parent) {\n this.refreshNodes();\n return true;\n }\n return false;\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) {\n const removed = this.treeService.removeNode(this.nodes(), nodeId, this.idField(), this.childrenField(), this.childrenCountField());\n if (removed) {\n // Update parent states if needed\n if (this.hasIntermediateState()) {\n this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n }\n return removed;\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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\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 * Collapse a specific node\n * @param nodeId - The ID of the node to collapse\n */\n collapseNode(nodeId) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return;\n }\n if (this.getNodeExpanded(node)) {\n this.collapseNode(nodeId);\n }\n else {\n await this.expandNode(nodeId);\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) {\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 const mode = this.selectMode();\n if (mode === 'single') {\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n else {\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, true, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return false;\n }\n this.setNodeSelected(node, false);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, false, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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) {\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 * 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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.getNodeChildren(node) ?? [];\n }\n /**\n * Get all root nodes\n * @returns Array of root nodes\n */\n getRootNodes() {\n return [...this.nodes()];\n }\n /**\n * Get all nodes in a flat array\n * @returns Array of all nodes in the tree\n */\n getAllNodes() {\n return this.treeService.getAllNodes(this.nodes(), this.childrenField());\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) {\n const nodePath = this.treeService.getNodePath(this.nodes(), nodeId, this.idField(), this.childrenField());\n return nodePath.map((node) => this.getNodeId(node));\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) {\n return this.treeService.getNodeLevel(this.nodes(), nodeId, this.idField(), this.childrenField());\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, newParentId, index) {\n const result = this.treeService.moveNode(this.nodes(), nodeId, newParentId, index, this.idField(), this.childrenField(), this.childrenCountField(), this.expandedField());\n if (result.success && result.movedNode) {\n // Emit drop events\n this.emitDropEvents(result.movedNode, result.previousParent, result.newParent, result.previousIndex, result.currentIndex, false);\n this.refreshNodes();\n return true;\n }\n return false;\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) {\n const node = this.findNode(nodeId);\n if (!node) {\n return null;\n }\n return this.treeService.cloneNode(node, this.idField(), this.titleField(), this.tooltipField(), this.iconField(), this.expandedField(), this.selectedField(), this.indeterminateField(), this.disabledField(), this.hiddenField(), this.childrenCountField(), this.dataField(), this.childrenField());\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) {\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 * Get all expanded nodes\n * @returns Array of expanded nodes\n */\n getExpandedNodes() {\n const expanded = [];\n const traverse = (nodes) => {\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 * Get all collapsed nodes that have children\n * @returns Array of collapsed nodes with children\n */\n getCollapsedNodes() {\n const collapsed = [];\n const traverse = (nodes) => {\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 * 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) {\n const node = this.findNode(nodeId);\n return node ? this.getNodeExpanded(node) : false;\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) {\n const node = this.findNode(nodeId);\n return node ? this.getNodeSelected(node) : false;\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) {\n const node = this.findNode(nodeId);\n return this.treeService.hasChildren(node ?? {}, this.childrenField());\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) {\n const node = this.findNode(nodeId);\n return node ? this.isNodeEffectivelyDisabled(node) : false;\n }\n /**\n * Get template context for a node\n */\n getTemplateContext(node, level = 0) {\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 * Calculate padding-inline for a node based on its level\n */\n getNodePaddingInline(level) {\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 * Check if node should show expand toggle\n */\n shouldShowExpandToggle(node) {\n return (this.treeService.hasChildren(node, this.childrenField()) ||\n this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField()));\n }\n /**\n * Check if checkboxes should be shown (only for multiple mode)\n */\n shouldShowCheckbox() {\n return this.selectMode() === 'multiple';\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) {\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(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\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 * Check if a node can be selected (considering selectMode and isLeafOnlyMode)\n */\n canSelectNode(node) {\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 * Check if checkbox should be shown for a specific node\n */\n shouldShowCheckboxForNode(node) {\n if (!this.shouldShowCheckbox()) {\n return false;\n }\n if (this.isLeafOnlyMode()) {\n return this.isLeafNode(node);\n }\n return true;\n }\n /**\n * Generate unique list ID for each node\n */\n getListId(node) {\n return this.treeService.getListId(node, this.idField());\n }\n /**\n * Check if a node is currently focused\n */\n isNodeFocused(nodeId) {\n return this.focusedNodeId() === nodeId;\n }\n /**\n * Get ARIA level for a node\n */\n getNodeAriaLevel(level) {\n return level + 1;\n }\n /**\n * Get ARIA expanded state for a node\n */\n getNodeAriaExpanded(node) {\n if (!this.shouldShowExpandToggle(node)) {\n return null;\n }\n return this.getNodeExpanded(node) ? 'true' : 'false';\n }\n /**\n * Get ARIA selected state for a node\n */\n getNodeAriaSelected(node) {\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 * Emit selection change event with all selected nodes\n */\n emitSelectionChange() {\n const selectedNodes = this.getSelectedNodes();\n this.onSelectionChange.emit({\n component: this,\n selectedNodes,\n });\n }\n // ==================== Event Handlers ====================\n /**\n * Handle node double click\n */\n onNodeDoubleClickHandle(node, event) {\n if (this.isNodeEffectivelyDisabled(node))\n return;\n this.onNodeDoubleClick.emit({\n component: this,\n node,\n nativeEvent: event,\n });\n }\n /**\n * Handle node click handle\n */\n onNodeClickHandle(node, event) {\n if (this.isNodeEffectivelyDisabled(node))\n return;\n const mode = this.selectMode();\n this.activeNodeId.set(this.getNodeId(node));\n if (mode === 'single') {\n this.handleSingleSelection(node, event);\n }\n this.onNodeClick.emit({ component: this, node, nativeEvent: event });\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, event) {\n if (this.isEvent(event) && typeof event.stopPropagation === 'function') {\n event.stopPropagation();\n }\n const hasChildren = this.treeService.hasChildren(node, this.childrenField());\n const canLazyLoad = this.treeService.canLazyLoad(node, this.isLazyDataSource(), this.childrenCountField(), this.childrenField());\n if (hasChildren || canLazyLoad) {\n const willExpand = !this.getNodeExpanded(node);\n if (willExpand && canLazyLoad) {\n await this.loadNodeChildren(node);\n }\n this.setNodeExpanded(node, willExpand);\n this.refreshNodes();\n this.onNodeToggle.emit({ component: this, node, nativeEvent: event });\n }\n }\n /**\n * Toggle node selection state with indeterminate support (for multiple mode)\n */\n toggleSelection(node, event) {\n if (!event.isUserInteraction)\n return;\n if (this.selectMode() === 'none')\n return;\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n if (mode !== 'multiple')\n return;\n const newValue = event.value === null ? true : event.value;\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\n }\n this.refreshNodes();\n this.onNodeSelect.emit({\n component: this,\n node,\n isUserInteraction: event.isUserInteraction,\n });\n this.emitSelectionChange();\n }\n /**\n * Handle drop events for tree nodes\n */\n onDrop(event, parentNode) {\n const targetArray = parentNode ? (this.getNodeChildren(parentNode) ?? []) : this.nodes();\n const isReordering = event.previousContainer === event.container;\n if (isReordering) {\n this.handleReorder(event, targetArray, parentNode);\n }\n else {\n this.handleMove(event, targetArray, parentNode);\n }\n this.refreshNodes();\n }\n /**\n * Handle drop events when dropping directly onto a node (to make it a child)\n */\n onDropOntoNode(event, targetNode) {\n if (!this.canMoveToParent())\n return;\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray)\n return;\n const movedNode = sourceArray[event.previousIndex];\n if (!this.treeService.isValidDropTarget(movedNode, targetNode, this.idField(), this.childrenField()))\n return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, targetNode, event.previousIndex, 0))\n return;\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 this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), targetNode, event.previousIndex, 0, false);\n this.refreshNodes();\n }\n /**\n * Handle node focus event\n */\n onNodeFocus(nodeId) {\n this.focusedNodeId.set(nodeId);\n }\n /**\n * Handle tree container focus - focus first node if none is focused\n */\n onTreeFocus(event) {\n if (event.target === event.currentTarget) {\n const flatList = this.treeService.buildFlatNodeList(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\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(this.nodes(), focusedId, this.idField(), this.childrenField());\n if (focusedNode && this.getNodeHidden(focusedNode) !== true) {\n this.focusNodeById(focusedId);\n }\n else {\n // Focused node no longer exists, focus first node\n this.focusNodeById(this.getNodeId(flatList[0].node));\n }\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 * Handle tree container blur\n */\n onTreeBlur(event) {\n if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget)) {\n this.focusedNodeId.set(null);\n }\n }\n /**\n * Handle keyboard navigation\n */\n handleKeyDown(event) {\n const flatList = this.treeService.buildFlatNodeList(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\n if (flatList.length === 0)\n return;\n const currentFocused = this.getFocusedNode();\n let currentIndex = currentFocused\n ? flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentFocused))\n : -1;\n if (currentIndex === -1 && event.target === event.currentTarget) {\n currentIndex = 0;\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 (navigationResult.targetIndex !== null &&\n navigationResult.targetIndex >= 0 &&\n navigationResult.targetIndex < flatList.length) {\n this.focusNodeById(this.getNodeId(flatList[navigationResult.targetIndex].node));\n }\n }\n }\n // ==================== Private Methods ====================\n /**\n * Load root items when datasource is a function\n */\n async loadRootItems(loadFn) {\n try {\n const result = loadFn();\n const rootNodes = result instanceof Promise ? await result : result;\n this.nodes.set(rootNodes);\n }\n catch (error) {\n this.handleError('Failed to load root items', error);\n this.nodes.set([]);\n }\n }\n /**\n * Load children for a node using lazy loading\n */\n async loadNodeChildren(node) {\n const nodeId = this.getNodeId(node);\n if (!this.isLazyDataSource() || this.loadingNodes().has(nodeId))\n return;\n if (this.treeService.hasChildren(node, this.childrenField())) {\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')\n return;\n try {\n this.loadingNodes.update((set) => new Set(set).add(nodeId));\n this.refreshNodes();\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 }\n catch (error) {\n this.handleError('Failed to load children', error);\n this.setNodeChildrenCount(node, 0);\n }\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 * 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 refreshNodes() {\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 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 * 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 ensureNewArrayReferences(nodes) {\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 * Handle single selection mode\n */\n handleSingleSelection(node, event) {\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\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 * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)\n */\n handleMultipleSelection(node, event) {\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Get array reference by drop list ID\n */\n getArrayByListId(listId) {\n return this.treeService.getArrayByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n /**\n * Find parent node by list ID\n */\n findParentByListId(listId) {\n return this.treeService.findParentByListId(this.nodes(), listId, this.idField(), this.childrenField());\n }\n /**\n * Check if move operation is allowed based on dragBehavior\n */\n canMoveToParent() {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'order-only';\n }\n /**\n * Check if reorder operation is allowed based on dragBehavior\n */\n canReorder() {\n const behavior = this.dragBehavior();\n return behavior !== 'none' && behavior !== 'move';\n }\n /**\n * Handle reordering within the same list */\n handleReorder(event, targetArray, parentNode) {\n if (!this.canReorder())\n return;\n const movedNode = targetArray[event.previousIndex];\n moveItemInArray(targetArray, event.previousIndex, event.currentIndex);\n this.emitDropEvents(movedNode, parentNode, parentNode, event.previousIndex, event.currentIndex, true);\n }\n /**\n * Handle moving between different lists\n */\n handleMove(event, targetArray, parentNode) {\n if (!this.canMoveToParent())\n return;\n const sourceListId = event.previousContainer.element.id;\n const sourceArray = this.getArrayByListId(sourceListId);\n if (!sourceArray)\n return;\n const movedNode = sourceArray[event.previousIndex];\n if (parentNode && !this.treeService.isValidDropTarget(movedNode, parentNode))\n return;\n if (!this.emitBeforeDropEvent(movedNode, sourceListId, parentNode, event.previousIndex, event.currentIndex)) {\n return;\n }\n transferArrayItem(sourceArray, targetArray, event.previousIndex, event.currentIndex);\n this.emitDropEvents(movedNode, this.findParentByListId(sourceListId), parentNode, event.previousIndex, event.currentIndex, false);\n }\n /**\n * Emit beforeDrop event and return whether to continue\n */\n emitBeforeDropEvent(movedNode, sourceListId, currentParent, previousIndex, currentIndex) {\n const beforeDropEvent = {\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 return !beforeDropEvent.canceled;\n }\n /**\n * Emit drop events based on operation type\n */\n emitDropEvents(node, previousParent, currentParent, previousIndex, currentIndex, isReorder) {\n const dropEvent = {\n component: this,\n node,\n previousParent,\n currentParent,\n previousIndex,\n currentIndex,\n };\n if (isReorder) {\n this.onOrderChange.emit(dropEvent);\n }\n else {\n this.onMoveChange.emit(dropEvent);\n }\n this.onItemsChange.emit(dropEvent);\n }\n /**\n * Get the currently focused node\n */\n getFocusedNode() {\n const focusedId = this.focusedNodeId();\n if (!focusedId)\n return null;\n return this.treeService.findNodeById(this.nodes(), focusedId, this.idField(), this.childrenField());\n }\n /**\n * Set focus to a node by ID\n */\n focusNodeById(nodeId) {\n this.focusedNodeId.set(nodeId);\n setTimeout(() => {\n const element = document.querySelector(`[data-tree-node-id=\"${nodeId}\"]`);\n if (element) {\n element.focus();\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n /**\n * Handle keyboard navigation keys\n */\n handleNavigationKey(event, flatList, currentIndex, currentFocused) {\n let targetIndex = currentIndex;\n let shouldPreventDefault = true;\n let handled = true;\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetIndex = currentIndex - 1;\n }\n else {\n shouldPreventDefault = false;\n }\n break;\n case 'ArrowDown':\n if (currentIndex < flatList.length - 1) {\n targetIndex = currentIndex + 1;\n }\n else if (currentIndex === -1) {\n targetIndex = 0;\n }\n else {\n shouldPreventDefault = false;\n }\n break;\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 }\n else {\n const currentItem = flatList[currentIndex];\n if (currentItem?.parent) {\n targetIndex = flatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(currentItem.parent));\n }\n else {\n shouldPreventDefault = false;\n }\n }\n }\n else {\n shouldPreventDefault = false;\n }\n break;\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 }\n else if (this.getNodeExpanded(currentFocused) &&\n this.treeService.hasChildren(currentFocused, this.childrenField())) {\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(this.nodes(), this.hiddenField(), this.disabledField(), this.expandedField(), this.childrenField());\n targetIndex = updatedFlatList.findIndex((item) => this.getNodeId(item.node) === this.getNodeId(firstChild));\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 }\n else {\n shouldPreventDefault = false;\n }\n }\n else {\n shouldPreventDefault = false;\n }\n }\n else {\n shouldPreventDefault = false;\n }\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = flatList.length - 1;\n break;\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 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 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 return { handled, shouldPreventDefault, targetIndex };\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 handleSpaceKeySelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n if (mode === 'single') {\n // Single mode: replace selection\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\n }\n else {\n // Multiple mode: toggle selection\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * 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 handleEnterKeySelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const mode = this.selectMode();\n // Enter key always replaces selection (deselects all first)\n this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());\n this.setNodeSelected(node, true);\n this.setNodeIndeterminate(node, false);\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(children, true, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n // Respect selectionBehavior: update parent states if intermediate mode\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Handle Ctrl/Cmd + Enter key selection\n */\n handleCtrlEnterSelection(node, event) {\n if (!this.canSelectNode(node))\n return;\n const newValue = !this.getNodeSelected(node);\n this.setNodeSelected(node, newValue);\n this.setNodeIndeterminate(node, false);\n const children = this.getNodeChildren(node);\n if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {\n this.treeService.selectAllChildren(children, newValue, this.selectedField(), this.indeterminateField(), this.childrenField());\n }\n if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {\n this.treeService.updateParentStates(this.nodes(), node, this.hasIntermediateState(), this.idField(), this.childrenField(), this.selectedField(), this.indeterminateField());\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 * Type guard to check if value is an Event\n */\n isEvent(value) {\n return value instanceof Event;\n }\n /**\n * Handle errors consistently\n */\n handleError(message, error) {\n if (error instanceof Error) {\n console.error(`${message}:`, error.message);\n }\n else {\n console.error(`${message}:`, error);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.9\", type: AXTreeViewComponent, isStandalone: true, selector: \"ax-tree-view\", inputs: { datasource: { classPropertyName: \"datasource\", publicName: \"datasource\", isSignal: true, isRequired: true, transformFunction: null }, selectMode: { classPropertyName: \"selectMode\", publicName: \"selectMode\", isSignal: true, isRequired: false, transformFunction: null }, selectionBehavior: { classPropertyName: \"selectionBehavior\", publicName: \"selectionBehavior\", isSignal: true, isRequired: false, transformFunction: null }, dragArea: { classPropertyName: \"dragArea\", publicName: \"dragArea\", isSignal: true, isRequired: false, transformFunction: null }, dragBehavior: { classPropertyName: \"dragBehavior\", publicName: \"dragBehavior\", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: \"showIcons\", publicName: \"showIcons\", isSignal: true, isRequired: false, transformFunction: null }, showChildrenBadge: { classPropertyName: \"showChildrenBadge\", publicName: \"showChildrenBadge\", isSignal: true, isRequired: false, transformFunction: null }, expandedIcon: { classPropertyName: \"expandedIcon\", publicName: \"expandedIcon\", isSignal: true, isRequired: false, transformFunction: null }, collapsedIcon: { classPropertyName: \"collapsedIcon\", publicName: \"collapsedIcon\", isSignal: true, isRequired: false, transformFunction: null }, indentSize: { classPropertyName: \"indentSize\", publicName: \"indentSize\", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: \"look\", publicName: \"look\", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: \"nodeTemplate\", publicName: \"nodeTemplate\", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: \"idField\", publicName: \"idField\", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: \"titleField\", publicName: \"titleField\", isSignal: true, isRequired: false, transformFunction: null }, tooltipField: { classPropertyName: \"tooltipField\", publicName: \"tooltipField\", isSignal: true, isRequired: false, transformFunction: null }, iconField: { classPropertyName: \"iconField\", publicName: \"iconField\", isSignal: true, isRequired: false, transformFunction: null }, expandedField: { classPropertyName: \"expandedField\", publicName: \"expandedField\", isSignal: true, isRequired: false, transformFunction: null }, selectedField: { classPropertyName: \"selectedField\", publicName: \"selectedField\", isSignal: true, isRequired: false, transformFunction: null }, indeterminateField: { classPropertyName: \"indeterminateField\", publicName: \"indeterminateField\", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: \"disabledField\", publicName: \"disabledField\", isSignal: true, isRequired: false, transformFunction: null }, hiddenField: { classPropertyName: \"hiddenField\", publicName: \"hiddenField\", isSignal: true, isRequired: false, transformFunction: null }, childrenField: { classPropertyName: \"childrenField\", publicName: \"childrenField\", isSignal: true, isRequired: false, transformFunction: null }, childrenCountField: { classPropertyName: \"childrenCountField\", publicName: \"childrenCountField\", isSignal: true, isRequired: false, transformFunction: null }, dataField: { classPropertyName: \"dataField\", publicName: \"dataField\", isSignal: true, isRequired: false, transformFunction: null }, inheritDisabled: { classPropertyName: \"inheritDisabled\", publicName: \"inheritDisabled\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: \"datasourceChange\", onBeforeDrop: \"onBeforeDrop\", onNodeToggle: \"onNodeToggle\", onNodeSelect: \"onNodeSelect\", onNodeDoubleClick: \"onNodeDoubleClick\", onNodeClick: \"onNodeClick\", onSelectionChange: \"onSelectionChange\", onOrderChange: \"onOrderChange\", onMoveChange: \"onMoveChange\", onItemsChange: \"onItemsChange\" }, host: { attributes: { \"role\": \"tree\", \"tabindex\": \"0\" }, listeners: { \"keydown\": \"handleKeyDown($event)\", \"focus\": \"onTreeFocus($event)\", \"blur\": \"onTreeBlur($event)\" }, properties: { \"class.ax-tree-view-default\": \"look() === 'default'\", \"class.ax-tree-view-card\": \"look() === 'card'\", \"class.ax-tree-view-with-line\": \"look() === 'with-line'\", \"class.ax-tree-view-rtl\": \"isRtl\", \"style.--ax-tree-view-indent-size\": \"indentSize() + 'px'\", \"style.--ax-tree-view-line-offset\": \"(indentSize() / 2) + 'px'\", \"attr.aria-label\": \"\\\"Tree navigation\\\"\" }, classAttribute: \"ax-tree-view\" }, providers: [AXTreeViewService], ngImport: i0, template: \"<!-- 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 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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 \\u22EE\\u22EE\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 \\u22EE\\u22EE\\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\", styles: [\".ax-tree-view{display:block;width:100%;--ax-comp-tree-view-indent-size: 12px;--ax-comp-tree-view-node-hover-bg: rgba(var(--ax-sys-color-on-lightest-surface), .04);--ax-comp-tree-view-node-selected-bg: rgba(var(--ax-sys-color-primary-500), .12);--ax-comp-tree-view-node-active-bg: rgba(var(--ax-sys-color-on-lighter-surface), .04);--ax-comp-tree-view-node-border-radius: 6px;--ax-comp-tree-view-node-margin: .25rem;--ax-comp-tree-view-line-color: rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity: .9;--ax-comp-tree-view-drag-placeholder-bg: rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg: rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline: rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding: 0;--ax-comp-tree-view-content-gap: .5rem;--ax-comp-tree-view-drop-list-min-height: 2rem;--ax-comp-tree-view-drag-handle-padding: .25rem;--ax-comp-tree-view-badge-padding: .25rem;--ax-comp-tree-view-expand-toggle-padding: .25rem;--ax-comp-tree-view-outline-offset: 2px;--ax-comp-tree-view-outline-offset-negative: -2px}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{position:relative;margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move}.ax-tree-view-node.ax-tree-view-node-active{background:var(--ax-comp-tree-view-node-active-bg)}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed currentColor!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{display:flex;align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{background:none;border:none;cursor:pointer;padding:var(--ax-comp-tree-view-expand-toggle-padding);min-width:1.5rem;height:1.5rem}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{font-size:1.125rem;flex-shrink:0}.ax-tree-view-node-label{flex:1;font-size:.875rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed}.ax-tree-view-node-disabled .ax-tree-view-node-content{pointer-events:none}.ax-tree-view-node-disabled .ax-tree-view-expand-toggle{pointer-events:auto;cursor:pointer}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{position:relative;padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\\\"\\\";position:absolute;inset-inline-start:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));top:0;height:calc(100% - .875rem);width:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\\\"\\\";position:absolute;inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2)));top:60%;width:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));height:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"ngmodule\", type: FormsModule }, { kind: \"directive\", type: i2.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i2.NgModel, selector: \"[ngModel]:not([formControlName]):not([formControl])\", inputs: [\"name\", \"disabled\", \"ngModel\", \"ngModelOptions\"], outputs: [\"ngModelChange\"], exportAs: [\"ngModel\"] }, { kind: \"directive\", type: AXDragDirective, selector: \"[axDrag]\", inputs: [\"axDrag\", \"dragData\", \"dragDisabled\", \"dragTransition\", \"dragElementClone\", \"dropZoneGroup\", \"dragStartDelay\", \"dragResetOnDblClick\", \"dragLockAxis\", \"dragClonedTemplate\", \"dragCursor\", \"dragBoundary\", \"dragTransitionDuration\"], outputs: [\"dragPositionChanged\"] }, { kind: \"directive\", type: AXDragHandleDirective, selector: \"[axDragHandle]\" }, { kind: \"directive\", type: AXDropListDirective, selector: \"[axDropList]\", inputs: [\"axDropList\", \"sortingDisabled\", \"dropListGroup\", \"dropListOrientation\"], outputs: [\"dropListDropped\"], exportAs: [\"axDropList\"] }, { kind: \"directive\", type: AXFocusTrapDirective, selector: \"[axFocusTrap]\" }, { kind: \"component\", type: AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"component\", type: AXCheckBoxComponent, selector: \"ax-check-box\", inputs: [\"disabled\", \"tabIndex\", \"readonly\", \"color\", \"value\", \"name\", \"id\", \"isLoading\", \"indeterminate\"], outputs: [\"onBlur\", \"onFocus\", \"valueChange\", \"onValueChanged\"] }, { kind: \"component\", type: AXBadgeComponent, selector: \"ax-badge\", inputs: [\"color\", \"look\", \"text\"] }, { kind: \"component\", type: AXDecoratorIconComponent, selector: \"ax-icon\", inputs: [\"icon\"] }, { kind: \"directive\", type: AXTooltipDirective, selector: \"[axTooltip]\", inputs: [\"axTooltipDisabled\", \"axTooltip\", \"axTooltipContext\", \"axTooltipPlacement\", \"axTooltipOffsetX\", \"axTooltipOffsetY\", \"axTooltipOpenAfter\", \"axTooltipCloseAfter\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-tree-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXTreeViewService], imports: [\n CommonModule,\n FormsModule,\n AXDragDirective,\n AXDragHandleDirective,\n AXDropListDirective,\n AXFocusTrapDirective,\n NgTemplateOutlet,\n AXButtonComponent,\n AXCheckBoxComponent,\n AXBadgeComponent,\n AXDecoratorIconComponent,\n AXTooltipDirective,\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 }, template: \"<!-- 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 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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 \\u22EE\\u22EE\\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 (click)=\\\"onNodeClickHandle(node, $event)\\\"\\n (dblclick)=\\\"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 \\u22EE\\u22EE\\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\", styles: [\".ax-tree-view{display:block;width:100%;--ax-comp-tree-view-indent-size: 12px;--ax-comp-tree-view-node-hover-bg: rgba(var(--ax-sys-color-on-lightest-surface), .04);--ax-comp-tree-view-node-selected-bg: rgba(var(--ax-sys-color-primary-500), .12);--ax-comp-tree-view-node-active-bg: rgba(var(--ax-sys-color-on-lighter-surface), .04);--ax-comp-tree-view-node-border-radius: 6px;--ax-comp-tree-view-node-margin: .25rem;--ax-comp-tree-view-line-color: rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity: .9;--ax-comp-tree-view-drag-placeholder-bg: rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg: rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline: rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding: 0;--ax-comp-tree-view-content-gap: .5rem;--ax-comp-tree-view-drop-list-min-height: 2rem;--ax-comp-tree-view-drag-handle-padding: .25rem;--ax-comp-tree-view-badge-padding: .25rem;--ax-comp-tree-view-expand-toggle-padding: .25rem;--ax-comp-tree-view-outline-offset: 2px;--ax-comp-tree-view-outline-offset-negative: -2px}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{position:relative;margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move}.ax-tree-view-node.ax-tree-view-node-active{background:var(--ax-comp-tree-view-node-active-bg)}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed currentColor!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{display:flex;align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{background:none;border:none;cursor:pointer;padding:var(--ax-comp-tree-view-expand-toggle-padding);min-width:1.5rem;height:1.5rem}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{font-size:1.125rem;flex-shrink:0}.ax-tree-view-node-label{flex:1;font-size:.875rem;line-height:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed}.ax-tree-view-node-disabled .ax-tree-view-node-content{pointer-events:none}.ax-tree-view-node-disabled .ax-tree-view-expand-toggle{pointer-events:auto;cursor:pointer}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{position:relative;padding-inline-start:var(--ax-tree-view-indent-size, var(--ax-comp-tree-view-indent-size))}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\\\"\\\";position:absolute;inset-inline-start:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));top:0;height:calc(100% - .875rem);width:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\\\"\\\";position:absolute;inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2)));top:60%;width:var(--ax-tree-view-line-offset, calc(var(--ax-comp-tree-view-indent-size) / 2));height:1px;background:var(--ax-tree-view-line-color, var(--ax-comp-tree-view-line-color))}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}\\n\"] }]\n }], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: \"datasource\", required: true }] }, { type: i0.Output, args: [\"datasourceChange\"] }], selectMode: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectMode\", required: false }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectionBehavior\", required: false }] }], dragArea: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dragArea\", required: false }] }], dragBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dragBehavior\", required: false }] }], showIcons: [{ type: i0.Input, args: [{ isSignal: true, alias: \"showIcons\", required: false }] }], showChildrenBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: \"showChildrenBadge\", required: false }] }], expandedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: \"expandedIcon\", required: false }] }], collapsedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: \"collapsedIcon\", required: false }] }], indentSize: [{ type: i0.Input, args: [{ isSignal: true, alias: \"indentSize\", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: \"look\", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: \"nodeTemplate\", required: false }] }], idField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"idField\", required: false }] }], titleField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"titleField\", required: false }] }], tooltipField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"tooltipField\", required: false }] }], iconField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"iconField\", required: false }] }], expandedField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"expandedField\", required: false }] }], selectedField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"selectedField\", required: false }] }], indeterminateField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"indeterminateField\", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"disabledField\", required: false }] }], hiddenField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"hiddenField\", required: false }] }], childrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"childrenField\", required: false }] }], childrenCountField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"childrenCountField\", required: false }] }], dataField: [{ type: i0.Input, args: [{ isSignal: true, alias: \"dataField\", required: false }] }], inheritDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: \"inheritDisabled\", required: false }] }], onBeforeDrop: [{ type: i0.Output, args: [\"onBeforeDrop\"] }], onNodeToggle: [{ type: i0.Output, args: [\"onNodeToggle\"] }], onNodeSelect: [{ type: i0.Output, args: [\"onNodeSelect\"] }], onNodeDoubleClick: [{ type: i0.Output, args: [\"onNodeDoubleClick\"] }], onNodeClick: [{ type: i0.Output, args: [\"onNodeClick\"] }], onSelectionChange: [{ type: i0.Output, args: [\"onSelectionChange\"] }], onOrderChange: [{ type: i0.Output, args: [\"onOrderChange\"] }], onMoveChange: [{ type: i0.Output, args: [\"onMoveChange\"] }], onItemsChange: [{ type: i0.Output, args: [\"onItemsChange\"] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUVuQixlQUFlLEVBQ2YsaUJBQWlCLEdBQ2xCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixF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QU87d0JBQ25DLG9DQUFvQyxFQUFFLHFCQUFxQjt3QkFDM0Qsb0NBQW9DLEVBQUUsMkJBQTJCO3dCQUNqRSxtQkFBbUIsRUFBRSxtQkFBbUI7d0JBQ3hDLFdBQVcsRUFBRSx1QkFBdUI7d0JBQ3BDLFNBQVMsRUFBRSxxQkFBcUI7d0JBQ2hDLFFBQVEsRUFBRSxvQkFBb0I7cUJBQy9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhWYWx1ZUNoYW5nZWRFdmVudCB9IGZyb20gJ0BhY29yZXgvY2RrL2NvbW1vbic7XG5pbXBvcnQge1xuICBBWERyYWdEaXJlY3RpdmUsXG4gIEFYRHJhZ0hhbmRsZURpcmVjdGl2ZSxcbiAgQVhEcm9wTGlzdERpcmVjdGl2ZSxcbiAgQVhEcm9wTGlzdERyb3BwZWRFdmVudCxcbiAgbW92ZUl0ZW1JbkFycmF5LFxuICB0cmFuc2ZlckFycmF5SXRlbSxcbn0gZnJvbSAnQGFjb3JleC9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEFYRm9jdXNUcmFwRGlyZWN0aXZlIH0gZnJvbSAnQGFjb3JleC9jZGsvZm9jdXMtdHJhcCc7XG5pbXBvcnQgeyBBWEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2JhZGdlJztcbmltcG9ydCB7IEFYQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBWENoZWNrQm94Q29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NoZWNrLWJveCc7XG5pbXBvcnQgeyBBWERlY29yYXRvckljb25Db21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBBWFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvdG9vbHRpcCc7XG5pbXBvcnQgeyBBWFBsYXRmb3JtIH0gZnJvbSAnQGFjb3JleC9jb3JlL3BsYXRmb3JtJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQVhUcmVlVmlld1NlcnZpY2UgfSBmcm9tICcuL3RyZWUtdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEFYVHJlZVZpZXdCZWZvcmVEcm9wRXZlbnQsXG4gIEFYVHJlZVZpZXdDYWxsYmFjayxcbiAgQVhUcmVlVmlld0RhdGFTb3VyY2UsXG4gIEFYVHJlZVZpZXdEcmFnQXJlYSxcbiAgQVhUcmVlVmlld0RyYWdCZWhhdmlvcixcbiAgQVhUcmVlVmlld0Ryb3BFdmVudCxcbiAgQVhUcmVlVmlld0ZsYXROb2RlLFxuICBBWFRyZWVWaWV3Tm9kZSxcbiAgQVhUcmVlVmlld05vZGVDbGlja0V2ZW50LFxuICBBWFRyZWVWaWV3Tm9kZURvdWJsZUNsaWNrRXZlbnQsXG4gIEFYVHJlZVZpZXdOb2RlU2VsZWN0RXZlbnQsXG4gIEFYVHJlZVZpZXdJdGVtVGVtcGxhdGVDb250ZXh0IGFzIEFYVHJlZVZpZXdOb2RlVGVtcGxhdGVDb250ZXh0LFxuICBBWFRyZWVWaWV3Tm9kZVRvZ2dsZUV2ZW50LFxuICBBWFRyZWVWaWV3U2VsZWN0aW9uQmVoYXZpb3IsXG4gIEFYVHJlZVZpZXdTZWxlY3Rpb25DaGFuZ2VFdmVudCxcbiAgQVhUcmVlVmlld1NlbGVjdE1vZGUsXG4gIEFYVHJlZVZpZXdWaWV3TG9vayxcbn0gZnJvbSAnLi90cmVlLXZpZXcudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC10cmVlLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHJlZS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtBWFRyZWVWaWV3U2VydmljZV0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQVhEcmFnRGlyZWN0aXZlLFxuICAgIEFYRHJhZ0hhbmRsZURpcmVjdGl2ZSxcbiAgICBBWERyb3BMaXN0RGlyZWN0aXZlLFxuICAgIEFYRm9jdXNUcmFwRGlyZWN0aXZlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgQVhCdXR0b25Db21wb25lbnQsXG4gICAgQVhDaGVja0JveENvbXBvbmVudCxcbiAgICBBWEJhZGdlQ29tcG9uZW50LFxuICAgIEFYRGVjb3JhdG9ySWNvbkNvbXBvbmVudCxcbiAgICBBWFRvb2x0aXBEaXJlY3RpdmUsXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2F4LXRyZWUtdmlldycsXG4gICAgcm9sZTogJ3RyZWUnLFxuICAgIHRhYmluZGV4OiAnMCcsXG4gICAgJ1tjbGFzcy5heC10cmVlLXZpZXctZGVmYXVsdF0nOiBcImxvb2soKSA9PT0gJ2RlZmF1bHQnXCIsXG4gICAgJ1tjbGFzcy5heC10cmVlLXZpZXctY2FyZF0nOiBcImxvb2soKSA9PT0gJ2NhcmQnXCIsXG4gICAgJ1tjbGFzcy5heC10cmVlLXZpZXctd2l0aC1saW5lXSc6IFwibG9vaygpID09PSAnd2l0aC1saW5lJ1wiLFxuICAgICdbY2xhc3MuYXgtdHJlZS12aWV3LXJ0bF0nOiAnaXNSdGwnLFxuICAgICdbc3R5bGUuLS1heC10cmVlLXZpZXctaW5kZW50LXNpemVdJzogXCJpbmRlbnRTaXplKCkgKyAncHgnXCIsXG4gICAgJ1tzdHlsZS4tLWF4LXRyZWUtdmlldy1saW5lLW9mZnNldF0nOiBcIihpbmRlbnRTaXplKCkgLyAyKSArICdweCdcIixcbiAgICAnW2F0dHIuYXJpYS1sYWJlbF0nOiAnXCJUcmVlIG5hdmlnYXRpb25cIicsXG4gICAgJyhrZXlkb3duKSc6ICdoYW5kbGVLZXlEb3duKCRldmVudCknLFxuICAgICcoZm9jdXMpJzogJ29uVHJlZUZvY3VzKCRldmVudCknLFxuICAgICcoYmx1ciknOiAnb25UcmVlQmx1cigkZXZlbnQpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQVhUcmVlVmlld0NvbXBvbmVudCB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09IERlcGVuZGVuY2llcyA9PT09PT09PT09PT09PT09PT09PVxuICBwcml2YXRlIHJlYWRvbmx5IHRyZWVTZXJ2aWNlID0gaW5qZWN0KEFYVHJlZVZpZXdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybVNlcnZpY2UgPSBpbmplY3QoQVhQbGF0Zm9ybSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnB1dHMgPT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFRyZWUgZGF0YSBzb3VyY2UgLSBjYW4gYmUgc3RhdGljIGFycmF5IG9yIGxhenkgbG9hZGluZyBmdW5jdGlvbiAqL1xuICByZWFkb25seSBkYXRhc291cmNlID0gbW9kZWwucmVxdWlyZWQ8QVhUcmVlVmlld0RhdGFTb3VyY2U+KCk7XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlOiAnc2luZ2xlJyAoY2xpY2sgdG8gc2VsZWN0KSBvciAnbXVsdGlwbGUnIChjaGVja2JveCBzZWxlY3Rpb24pLiBEZWZhdWx0OiBgJ3NpbmdsZSdgLiBJbiBtdWx0aXBsZSBtb2RlLCBjaGVja2JveGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNob3duLiAqL1xuICByZWFkb25seSBzZWxlY3RNb2RlID0gaW5wdXQ8QVhUcmVlVmlld1NlbGVjdE1vZGU+KCdzaW5nbGUnKTtcblxuICAvKiogU2VsZWN0aW9uIGJlaGF2aW9yOiAnYWxsJyAoc2VsZWN0IGFueXRoaW5nLCBubyBzcGVjaWFsIGJlaGF2aW9yKSwgJ2ludGVybWVkaWF0ZScgKHBhcmVudCBpbmRldGVybWluYXRlIHN0YXRlIHdoZW4gY2hpbGRyZW4gc2VsZWN0ZWQpLCAnbGVhZicgKG9ubHkgbGVhZiBub2RlcyBzZWxlY3RhYmxlKSwgJ25lc3RlZCcgKHNlbGVjdGluZyBwYXJlbnQgc2VsZWN0cyBhbGwgY2hpbGRyZW4pLiBEZWZhdWx0OiBgJ2ludGVybWVkaWF0ZSdgICovXG4gIHJlYWRvbmx5IHNlbGVjdGlvbkJlaGF2aW9yID0gaW5wdXQ8QVhUcmVlVmlld1NlbGVjdGlvbkJlaGF2aW9yPignaW50ZXJtZWRpYXRlJyk7XG5cbiAgLyoqIERyYWcgYXJlYTogJ2hhbmRsZXInIChkcmFnIGhhbmRsZSksICdpdGVtJyAoZW50aXJlIGl0ZW0pLiBEZWZhdWx0OiBgJ2hhbmRsZXInYCAqL1xuICByZWFkb25seSBkcmFnQXJlYSA9IGlucHV0PEFYVHJlZVZpZXdEcmFnQXJlYT4oJ2hhbmRsZXInKTtcblxuICAvKiogRHJhZyBiZWhhdmlvcjogJ25vbmUnIChkaXNhYmxlZCksICdvcmRlci1vbmx5JyAocmVvcmRlciBvbmx5KSwgJ21vdmUnIChtb3ZlIGJldHdlZW4gcGFyZW50cyksICdib3RoJyAoYWxsb3cgYm90aCkuIERlZmF1bHQ6IGAnbm9uZSdgICovXG4gIHJlYWRvbmx5IGRyYWdCZWhhdmlvciA9IGlucHV0PEFYVHJlZVZpZXdEcmFnQmVoYXZpb3I+KCdub25lJyk7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyBpY29ucy4gRGVmYXVsdDogYHRydWVgICovXG4gIHJlYWRvbmx5IHNob3dJY29ucyA9IGlucHV0KHRydWUpO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgY2hpbGRyZW4gY291bnQgYmFkZ2UuIERlZmF1bHQ6IGB0cnVlYCAqL1xuICByZWFkb25seSBzaG93Q2hpbGRyZW5CYWRnZSA9IGlucHV0KHRydWUpO1xuXG4gIC8qKiBDdXN0b20gaWNvbiBmb3IgZXhwYW5kZWQgbm9kZXMuIERlZmF1bHQ6IGAnZmEtc29saWQgZmEtY2hldnJvbi1kb3duJ2AgKi9cbiAgcmVhZG9ubHkgZXhwYW5kZWRJY29uID0gaW5wdXQoJ2ZhLXNvbGlkIGZhLWNoZXZyb24tZG93bicpO1xuXG4gIC8qKiBDdXN0b20gaWNvbiBmb3IgY29sbGFwc2VkIG5vZGVzLiBEZWZhdWx0OiBgJ2ZhLXNvbGlkIGZhLWNoZXZyb24tcmlnaHQnYCAqL1xuICByZWFkb25seSBjb2xsYXBzZWRJY29uID0gaW5wdXQoJ2ZhLXNvbGlkIGZhLWNoZXZyb24tcmlnaHQnKTtcblxuICAvKiogSW5kZW50IHNpemUgaW4gcGl4ZWxzIGZvciBlYWNoIGxldmVsLiBEZWZhdWx0OiBgMTZgICovXG4gIHJlYWRvbmx5IGluZGVudFNpemUgPSBpbnB1dCgxNik7XG5cbiAgLyoqIFZpc3VhbCBzdHlsZSB2YXJpYW50LiBEZWZhdWx0OiBgJ2RlZmF1bHQnYCAqL1xuICByZWFkb25seSBsb29rID0gaW5wdXQ8QVhUcmVlVmlld1ZpZXdMb29rPignZGVmYXVsdCcpO1xuXG4gIC8qKiBDdXN0b20gdGVtcGxhdGUgZm9yIHRyZWUgaXRlbXMuIERlZmF1bHQ6IGB1bmRlZmluZWRgICovXG4gIHJlYWRvbmx5IG5vZGVUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPEFYVHJlZVZpZXdOb2RlVGVtcGxhdGVDb250ZXh0Pj4oKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3Igbm9kZSBJRC4gRGVmYXVsdDogYCdpZCdgICovXG4gIHJlYWRvbmx5IGlkRmllbGQgPSBpbnB1dCgnaWQnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3Igbm9kZSB0aXRsZS4gRGVmYXVsdDogYCd0aXRsZSdgICovXG4gIHJlYWRvbmx5IHRpdGxlRmllbGQgPSBpbnB1dCgndGl0bGUnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3Igbm9kZSB0b29sdGlwLiBEZWZhdWx0OiBgJ3Rvb2x0aXAnYCAqL1xuICByZWFkb25seSB0b29sdGlwRmllbGQgPSBpbnB1dCgndG9vbHRpcCcpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBub2RlIGljb24uIERlZmF1bHQ6IGAnaWNvbidgICovXG4gIHJlYWRvbmx5IGljb25GaWVsZCA9IGlucHV0KCdpY29uJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGV4cGFuZGVkIHN0YXRlLiBEZWZhdWx0OiBgJ2V4cGFuZGVkJ2AgKi9cbiAgcmVhZG9ubHkgZXhwYW5kZWRGaWVsZCA9IGlucHV0KCdleHBhbmRlZCcpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBzZWxlY3RlZCBzdGF0ZS4gRGVmYXVsdDogYCdzZWxlY3RlZCdgICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkRmllbGQgPSBpbnB1dCgnc2VsZWN0ZWQnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3IgaW5kZXRlcm1pbmF0ZSBzdGF0ZS4gRGVmYXVsdDogYCdpbmRldGVybWluYXRlJ2AgKi9cbiAgcmVhZG9ubHkgaW5kZXRlcm1pbmF0ZUZpZWxkID0gaW5wdXQoJ2luZGV0ZXJtaW5hdGUnKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3IgZGlzYWJsZWQgc3RhdGUuIERlZmF1bHQ6IGAnZGlzYWJsZWQnYCAqL1xuICByZWFkb25seSBkaXNhYmxlZEZpZWxkID0gaW5wdXQoJ2Rpc2FibGVkJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGhpZGRlbiBzdGF0ZS4gRGVmYXVsdDogYCdoaWRkZW4nYCAqL1xuICByZWFkb25seSBoaWRkZW5GaWVsZCA9IGlucHV0KCdoaWRkZW4nKTtcblxuICAvKiogRmllbGQgbmFtZSBmb3IgY2hpbGRyZW4gYXJyYXkuIERlZmF1bHQ6IGAnY2hpbGRyZW4nYCAqL1xuICByZWFkb25seSBjaGlsZHJlbkZpZWxkID0gaW5wdXQoJ2NoaWxkcmVuJyk7XG5cbiAgLyoqIEZpZWxkIG5hbWUgZm9yIGNoaWxkcmVuIGNvdW50LiBEZWZhdWx0OiBgJ2NoaWxkcmVuQ291bnQnYCAqL1xuICByZWFkb25seSBjaGlsZHJlbkNvdW50RmllbGQgPSBpbnB1dCgnY2hpbGRyZW5Db3VudCcpO1xuXG4gIC8qKiBGaWVsZCBuYW1lIGZvciBjdXN0b20gZGF0YS4gRGVmYXVsdDogYCdkYXRhJ2AgKi9cbiAgcmVhZG9ubHkgZGF0YUZpZWxkID0gaW5wdXQoJ2RhdGEnKTtcblxuICAvKiogV2hldGhlciBkaXNhYmxlZCBzdGF0ZSBpcyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgbm9kZXMuIERlZmF1bHQ6IGB0cnVlYC4gKi9cbiAgcmVhZG9ubHkgaW5oZXJpdERpc2FibGVkID0gaW5wdXQodHJ1ZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gT3V0cHV0cyA9PT09PT09PT09PT09PT09PT09PVxuICAvKiogRW1pdHRlZCBiZWZvcmUgYSBkcm9wIG9wZXJhdGlvbiAtIHNldCBjYW5jZWxlZCB0byB0cnVlIHRvIHByZXZlbnQgZHJvcCAqL1xuICByZWFkb25seSBvbkJlZm9yZURyb3AgPSBvdXRwdXQ8QVhUcmVlVmlld0JlZm9yZURyb3BFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgbm9kZSBpcyB0b2dnbGVkIChleHBhbmRlZC9jb2xsYXBzZWQpICovXG4gIHJlYWRvbmx5IG9uTm9kZVRvZ2dsZSA9IG91dHB1dDxBWFRyZWVWaWV3Tm9kZVRvZ2dsZUV2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWQgKi9cbiAgcmVhZG9ubHkgb25Ob2RlU2VsZWN0ID0gb3V0cHV0PEFYVHJlZVZpZXdOb2RlU2VsZWN0RXZlbnQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgZG91YmxlLWNsaWNrZWQgKi9cbiAgcmVhZG9ubHkgb25Ob2RlRG91YmxlQ2xpY2sgPSBvdXRwdXQ8QVhUcmVlVmlld05vZGVEb3VibGVDbGlja0V2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIGRvdWJsZS1jbGlja2VkICovXG4gIHJlYWRvbmx5IG9uTm9kZUNsaWNrID0gb3V0cHV0PEFYVHJlZVZpZXdOb2RlQ2xpY2tFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIC0gcmV0dXJucyBhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzICovXG4gIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PEFYVHJlZVZpZXdTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIG5vZGVzIGFyZSByZW9yZGVyZWQgd2l0aGluIHRoZSBzYW1lIHBhcmVudCAqL1xuICByZWFkb25seSBvbk9yZGVyQ2hhbmdlID0gb3V0cHV0PEFYVHJlZVZpZXdEcm9wRXZlbnQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFyZW50ICovXG4gIHJlYWRvbmx5IG9uTW92ZUNoYW5nZSA9IG91dHB1dDxBWFRyZWVWaWV3RHJvcEV2ZW50PigpO1xuXG4gIC8qKiBFbWl0dGVkIGZvciBhbnkgaXRlbSBjaGFuZ2UgKG9yZGVyIG9yIG1vdmUpICovXG4gIHJlYWRvbmx5IG9uSXRlbXNDaGFuZ2UgPSBvdXRwdXQ8QVhUcmVlVmlld0Ryb3BFdmVudD4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnRlcm5hbCBTdGF0ZSA9PT09PT09PT09PT09PT09PT09PVxuICAvKiogSW50ZXJuYWwgc2lnbmFsIGZvciB0cmVlIG5vZGVzICovXG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlcyA9IHNpZ25hbDxBWFRyZWVWaWV3Tm9kZVtdPihbXSk7XG5cbiAgLyoqIEludGVybmFsIHNpZ25hbCBmb3IgdHJhY2tpbmcgbG9hZGluZyBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGluZ05vZGVzID0gc2lnbmFsPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXG4gIC8qKiBDdXJyZW50bHkgZm9jdXNlZCBub2RlIElEIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCByZWFkb25seSBmb2N1c2VkTm9kZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBSVEwgZGV0ZWN0aW9uIHNpZ25hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNSdGwgPSBzaWduYWwodGhpcy5wbGF0Zm9ybVNlcnZpY2UuaXNSdGwoKSk7XG5cbiAgLyoqIGFjdGl2ZSBub2RlIGlkICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVOb2RlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIENvbXB1dGVkIGNoZXZyb24gaWNvbnMgdGhhdCBmbGlwIGZvciBSVEwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpcmVjdGlvbkV4cGFuZGVkSWNvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZXhwYW5kZWRJY29uKCkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkaXJlY3Rpb25Db2xsYXBzZWRJY29uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGlzUnRsRGlyZWN0aW9uID0gdGhpcy5pc1J0bCgpO1xuICAgIGNvbnN0IGRlZmF1bHRJY29uID0gdGhpcy5jb2xsYXBzZWRJY29uKCk7XG5cbiAgICBpZiAoaXNSdGxEaXJlY3Rpb24gJiYgZGVmYXVsdEljb24gPT09ICdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0Jykge1xuICAgICAgcmV0dXJuICdmYS1zb2xpZCBmYS1jaGV2cm9uLWxlZnQnO1xuICAgIH1cbiAgICBpZiAoIWlzUnRsRGlyZWN0aW9uICYmIGRlZmF1bHRJY29uID09PSAnZmEtc29saWQgZmEtY2hldnJvbi1sZWZ0Jykge1xuICAgICAgcmV0dXJuICdmYS1zb2xpZCBmYS1jaGV2cm9uLXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRJY29uO1xuICB9KTtcblxuICAvKiogRmxhZyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZW4gc3luY2luZyBkYXRhc291cmNlICovXG4gIHByaXZhdGUgaXNVcGRhdGluZ0Zyb21EYXRhc291cmNlID0gZmFsc2U7XG5cbiAgLyoqIENvbXB1dGVkIHRvIGNoZWNrIGlmIGRhdGFzb3VyY2UgaXMgYSBmdW5jdGlvbiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGlzTGF6eURhdGFTb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB0eXBlb2YgdGhpcy5kYXRhc291cmNlKCkgPT09ICdmdW5jdGlvbicpO1xuXG4gIC8qKiBDb21wdXRlZDogUmV0dXJucyB0cnVlIHdoZW4gc2VsZWN0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gbGVhZiBub2RlcyBvbmx5ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0xlYWZPbmx5TW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uQmVoYXZpb3IoKSA9PT0gJ2xlYWYnKTtcblxuICAvKiogQ29tcHV0ZWQ6IFJldHVybnMgdHJ1ZSB3aGVuIHNlbGVjdGluZyBhIHBhcmVudCBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgYWxsIGl0cyBjaGlsZHJlbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FzY2FkZXNUb0NoaWxkcmVuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJlaGF2aW9yID0gdGhpcy5zZWxlY3Rpb25CZWhhdmlvcigpO1xuICAgIHJldHVybiBiZWhhdmlvciA9PT0gJ25lc3RlZCcgfHwgYmVoYXZpb3IgPT09ICdpbnRlcm1lZGlhdGUtbmVzdGVkJztcbiAgfSk7XG5cbiAgLyoqIENvbXB1dGVkOiBSZXR1cm5zIHRydWUgd2hlbiBwYXJlbnQgbm9kZXMgc2hvdyBpbmRldGVybWluYXRlIHN0YXRlIGJhc2VkIG9uIGNoaWxkcmVuIHNlbGVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW50ZXJtZWRpYXRlU3RhdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmVoYXZpb3IgPSB0aGlzLnNlbGVjdGlvbkJlaGF2aW9yKCk7XG4gICAgcmV0dXJuIGJlaGF2aW9yID09PSAnaW50ZXJtZWRpYXRlJyB8fCBiZWhhdmlvciA9PT0gJ2ludGVybWVkaWF0ZS1uZXN0ZWQnO1xuICB9KTtcblxuICAvKiogQ29tcHV0ZWQ6IFJldHVybnMgdHJ1ZSB3aGVuIGRyYWcgaGFuZGxlIHNob3VsZCBiZSBzaG93biAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkU2hvd0RyYWdIYW5kbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0FyZWEoKSA9PT0gJ2hhbmRsZXInICYmIHRoaXMuZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJztcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTm9kZSBQcm9wZXJ0eSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBHZXQgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGEgbm9kZSB1c2luZyB0aGUgY29uZmlndXJlZCBmaWVsZCBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZVByb3A8VCA9IHVua25vd24+KG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBmaWVsZE5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQge1xuICAgIHJldHVybiAobm9kZVtmaWVsZE5hbWVdIGFzIFQpID8/IChkZWZhdWx0VmFsdWUgYXMgVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcHJvcGVydHkgdmFsdWUgb24gYSBub2RlIHVzaW5nIHRoZSBjb25maWd1cmVkIGZpZWxkIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBzZXROb2RlUHJvcChub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgbm9kZVtmaWVsZE5hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlSWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGVQcm9wPHN0cmluZz4obm9kZSwgdGhpcy5pZEZpZWxkKCksICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSB0aXRsZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVUaXRsZShub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nPihub2RlLCB0aGlzLnRpdGxlRmllbGQoKSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIHRvb2x0aXBcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlVG9vbHRpcChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLnRvb2x0aXBGaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGljb25cbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlSWNvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8c3RyaW5nIHwgdW5kZWZpbmVkPihub2RlLCB0aGlzLmljb25GaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGV4cGFuZGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZUV4cGFuZGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVByb3A8Ym9vbGVhbj4obm9kZSwgdGhpcy5leHBhbmRlZEZpZWxkKCksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbm9kZSBleHBhbmRlZCBzdGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldE5vZGVFeHBhbmRlZChub2RlOiBBWFRyZWVWaWV3Tm9kZSwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldE5vZGVQcm9wKG5vZGUsIHRoaXMuZXhwYW5kZWRGaWVsZCgpLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgc2VsZWN0ZWQgc3RhdGVcbiAgICovXG4gIHByb3RlY3RlZCBnZXROb2RlU2VsZWN0ZWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxib29sZWFuPihub2RlLCB0aGlzLnNlbGVjdGVkRmllbGQoKSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBub2RlIHNlbGVjdGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0Tm9kZVNlbGVjdGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5zZWxlY3RlZEZpZWxkKCksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBpbmRldGVybWluYXRlIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxib29sZWFuPihub2RlLCB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG5vZGUgaW5kZXRlcm1pbmF0ZSBzdGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldE5vZGVJbmRldGVybWluYXRlKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlJ3Mgb3duIGRpc2FibGVkIHN0YXRlICh3aXRob3V0IGluaGVyaXRhbmNlKVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVEaXNhYmxlZChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGVQcm9wPGJvb2xlYW4+KG5vZGUsIHRoaXMuZGlzYWJsZWRGaWVsZCgpLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbm9kZSBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAoY29uc2lkZXJpbmcgaW5oZXJpdGFuY2UgZnJvbSBwYXJlbnRzKVxuICAgKiBXaGVuIGluaGVyaXREaXNhYmxlZCBpcyB0cnVlOlxuICAgKiAtIFJldHVybnMgdHJ1ZSBpZiBub2RlIGl0c2VsZiBpcyBkaXNhYmxlZFxuICAgKiAtIFJldHVybnMgdHJ1ZSBpZiBhbnkgYW5jZXN0b3IgaXMgZGlzYWJsZWQgQU5EIG5vZGUgZG9lc24ndCBoYXZlIGV4cGxpY2l0IGBkaXNhYmxlZDogZmFsc2VgXG4gICAqIFdoZW4gaW5oZXJpdERpc2FibGVkIGlzIGZhbHNlOlxuICAgKiAtIE9ubHkgcmV0dXJucyBub2RlJ3Mgb3duIGRpc2FibGVkIHN0YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNOb2RlRWZmZWN0aXZlbHlEaXNhYmxlZChub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIG5vZGUgaXRzZWxmIGlzIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURpc2FibGVkKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBub3QgaW5oZXJpdGluZyBkaXNhYmxlZCBzdGF0ZSwganVzdCByZXR1cm4gZmFsc2UgKG5vZGUgaXMgbm90IGRpc2FibGVkKVxuICAgIGlmICghdGhpcy5pbmhlcml0RGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG5vZGUgZXhwbGljaXRseSBoYXMgZGlzYWJsZWQ6IGZhbHNlIChvdmVycmlkZSBpbmhlcml0YW5jZSlcbiAgICBjb25zdCBub2RlRGlzYWJsZWRWYWx1ZSA9IG5vZGVbdGhpcy5kaXNhYmxlZEZpZWxkKCldO1xuICAgIGlmIChub2RlRGlzYWJsZWRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbmNlc3RvcnMgZm9yIGRpc2FibGVkIHN0YXRlXG4gICAgcmV0dXJuIHRoaXMuaXNBbnlBbmNlc3RvckRpc2FibGVkKG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBhbmNlc3RvciBvZiB0aGUgbm9kZSBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0FueUFuY2VzdG9yRGlzYWJsZWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnRyZWVTZXJ2aWNlLmZpbmRQYXJlbnROb2RlKHRoaXMubm9kZXMoKSwgbm9kZSwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURpc2FibGVkKHBhcmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzQW55QW5jZXN0b3JEaXNhYmxlZChwYXJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub2RlIGhpZGRlbiBzdGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVIaWRkZW4obm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxib29sZWFuPihub2RlLCB0aGlzLmhpZGRlbkZpZWxkKCksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBjaGlsZHJlbiBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVDaGlsZHJlbihub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGVQcm9wPEFYVHJlZVZpZXdOb2RlW10gfCB1bmRlZmluZWQ+KG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBub2RlIGNoaWxkcmVuIGFycmF5XG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0Tm9kZUNoaWxkcmVuKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCB2YWx1ZTogQVhUcmVlVmlld05vZGVbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5jaGlsZHJlbkZpZWxkKCksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBjaGlsZHJlbiBjb3VudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlUHJvcDxudW1iZXIgfCB1bmRlZmluZWQ+KG5vZGUsIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG5vZGUgY2hpbGRyZW4gY291bnRcbiAgICovXG4gIHByb3RlY3RlZCBzZXROb2RlQ2hpbGRyZW5Db3VudChub2RlOiBBWFRyZWVWaWV3Tm9kZSwgdmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Tm9kZVByb3Aobm9kZSwgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSwgdmFsdWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRWZmZWN0cyA9PT09PT09PT09PT09PT09PT09PVxuICAvKiogRWZmZWN0IHRvIGhhbmRsZSBkYXRhc291cmNlIGNoYW5nZXMgKi9cbiAgcmVhZG9ubHkgI2RhdGFzb3VyY2VFZmZlY3QgPSBlZmZlY3QoYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmdGcm9tRGF0YXNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhc291cmNlKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHMpKSB7XG4gICAgICB0aGlzLm5vZGVzLnNldChbLi4uZHNdKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUm9vdEl0ZW1zKGRzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHJvb3QgaXRlbXMnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvKiogSW5pdGlhbGl6ZSBkaXJlY3Rpb24gY2hhbmdlIGxpc3RlbmVyICovXG4gIHJlYWRvbmx5ICNpbml0RGlyZWN0aW9uTGlzdGVuZXIgPSBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgIHRoaXMucGxhdGZvcm1TZXJ2aWNlLmRpcmVjdGlvbkNoYW5nZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50LmRhdGEgPT09ICdydGwnKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChpc1J0bCkgPT4gdGhpcy5pc1J0bC5zZXQoaXNSdGwpKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUHVibGljIEFQSSA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogRXhwYW5kIGFsbCBub2RlcyBpbiB0aGUgdHJlZSAod2l0aCBsYXp5IGxvYWRpbmcgc3VwcG9ydClcbiAgICovXG4gIGFzeW5jIGV4cGFuZEFsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyZWVTZXJ2aWNlLnNldEV4cGFuZGVkU3RhdGUoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5pc0xhenlEYXRhU291cmNlKCksXG4gICAgICAobm9kZSkgPT4gdGhpcy5sb2FkTm9kZUNoaWxkcmVuKG5vZGUpLFxuICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgKTtcbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlIGFsbCBub2RlcyBpbiB0aGUgdHJlZVxuICAgKi9cbiAgY29sbGFwc2VBbGwoKTogdm9pZCB7XG4gICAgdGhpcy50cmVlU2VydmljZS5zZXRFeHBhbmRlZFN0YXRlKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgZmFsc2UsXG4gICAgICB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSxcbiAgICAgIChub2RlKSA9PiB0aGlzLmxvYWROb2RlQ2hpbGRyZW4obm9kZSksXG4gICAgICB0aGlzLmV4cGFuZGVkRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSxcbiAgICApO1xuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvdW50IG9mIHNlbGVjdGVkIG5vZGVzXG4gICAqL1xuICBnZXRTZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuY291bnRTZWxlY3RlZCh0aGlzLm5vZGVzKCksIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IG5vZGVzIGFyZSBzZWxlY3RlZFxuICAgKi9cbiAgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGVkQ291bnQoKSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWROb2RlcygpOiBBWFRyZWVWaWV3Tm9kZVtdIHtcbiAgICBjb25zdCBzZWxlY3RlZDogQVhUcmVlVmlld05vZGVbXSA9IFtdO1xuICAgIHRoaXMudHJlZVNlcnZpY2UuY29sbGVjdFNlbGVjdGVkKHRoaXMubm9kZXMoKSwgc2VsZWN0ZWQsIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBzZWxlY3RlZCBub2RlcyBmcm9tIHRoZSB0cmVlXG4gICAqL1xuICBkZWxldGVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnJlbW92ZVNlbGVjdGVkKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVBbGxQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbGwgbm9kZXMgaW4gdGhlIHRyZWUgKHJlc3BlY3RzIGRpc2FibGVkIHN0YXRlKVxuICAgKi9cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUoKSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIC8vIE9ubHkgc2VsZWN0IGxlYWYgbm9kZXMgdGhhdCBhcmUgbm90IGRpc2FibGVkXG4gICAgICBjb25zdCBzZWxlY3RMZWFmcyA9IChub2RlczogQVhUcmVlVmlld05vZGVbXSk6IHZvaWQgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0xlYWZOb2RlKG5vZGUpICYmICF0aGlzLmlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBzZWxlY3RMZWFmcyhjaGlsZHJlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2VsZWN0TGVhZnModGhpcy5ub2RlcygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VsZWN0IGFsbCBub2RlcyB0aGF0IGFyZSBub3QgZGlzYWJsZWRcbiAgICAgIGNvbnN0IHNlbGVjdEFsbE5vbkRpc2FibGVkID0gKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgIGlmICghdGhpcy5pc05vZGVFZmZlY3RpdmVseURpc2FibGVkKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgc2VsZWN0QWxsTm9uRGlzYWJsZWQoY2hpbGRyZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNlbGVjdEFsbE5vbkRpc2FibGVkKHRoaXMubm9kZXMoKSk7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgYWxsIG5vZGVzIGluIHRoZSB0cmVlXG4gICAqL1xuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnNldEFsbFNlbGVjdGlvbihcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBub2RlIGJ5IElEIGluIHRoZSB0cmVlXG4gICAqL1xuICBmaW5kTm9kZShpZDogc3RyaW5nKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5maW5kTm9kZUJ5SWQodGhpcy5ub2RlcygpLCBpZCwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB0cmVlIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgKi9cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBpcyBjdXJyZW50bHkgbG9hZGluZ1xuICAgKi9cbiAgaXNOb2RlTG9hZGluZyhub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdOb2RlcygpLmhhcyhub2RlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2FkaW5nIHN0YXRlIGZvciBhIG5vZGUgKGludGVybmFsIHN0YXRlKVxuICAgKi9cbiAgZ2V0Tm9kZUxvYWRpbmcobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nTm9kZXMoKS5oYXModGhpcy5nZXROb2RlSWQobm9kZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQvdXBkYXRlIGEgbm9kZSdzIHByb3BlcnRpZXNcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBlZGl0XG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUGFydGlhbCBub2RlIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSB3YXMgZm91bmQgYW5kIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgZWRpdE5vZGUobm9kZUlkOiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8QVhUcmVlVmlld05vZGU+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMudHJlZVNlcnZpY2UuZWRpdE5vZGUoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICBub2RlSWQsXG4gICAgICB1cGRhdGVzLFxuICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAodXBkYXRlZCkge1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY2hpbGQgbm9kZSB0byBhIHBhcmVudCBub2RlXG4gICAqIEBwYXJhbSBwYXJlbnRJZCAtIFRoZSBJRCBvZiB0aGUgcGFyZW50IG5vZGVcbiAgICogQHBhcmFtIGNoaWxkTm9kZSAtIFRoZSBjaGlsZCBub2RlIHRvIGFkZFxuICAgKiBAcGFyYW0gaW5kZXggLSBPcHRpb25hbCBpbmRleCB0byBpbnNlcnQgYXQgKGRlZmF1bHQ6IGFwcGVuZCB0byBlbmQpXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcGFyZW50IHdhcyBmb3VuZCBhbmQgY2hpbGQgd2FzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGFkZENoaWxkKHBhcmVudElkOiBzdHJpbmcsIGNoaWxkTm9kZTogQVhUcmVlVmlld05vZGUsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50cmVlU2VydmljZS5hZGRDaGlsZChcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIHBhcmVudElkLFxuICAgICAgY2hpbGROb2RlLFxuICAgICAgaW5kZXgsXG4gICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSxcbiAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSB0cmVlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIG5vZGUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICByZW1vdmVOb2RlKG5vZGVJZDogc3RyaW5nKTogQVhUcmVlVmlld05vZGUgfCBudWxsIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy50cmVlU2VydmljZS5yZW1vdmVOb2RlKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgbm9kZUlkLFxuICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgLy8gVXBkYXRlIHBhcmVudCBzdGF0ZXMgaWYgbmVlZGVkXG4gICAgICBpZiAodGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpKSB7XG4gICAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlQWxsUGFyZW50U3RhdGVzKFxuICAgICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgICB0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCBhIHNwZWNpZmljIG5vZGVcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBleHBhbmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhwYW5zaW9uIGlzIGNvbXBsZXRlIChpZiBsYXp5IGxvYWRpbmcpXG4gICAqL1xuICBhc3luYyBleHBhbmROb2RlKG5vZGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuaGFzQ2hpbGRyZW4obm9kZSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy50cmVlU2VydmljZS5jYW5MYXp5TG9hZChcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuIHx8IGNhbkxhenlMb2FkKSB7XG4gICAgICBpZiAoY2FuTGF6eUxvYWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkTm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXROb2RlRXhwYW5kZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgICAgdGhpcy5vbk5vZGVUb2dnbGUuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgbm9kZSwgbmF0aXZlRXZlbnQ6IG5ldyBFdmVudCgnZXhwYW5kJykgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlIGEgc3BlY2lmaWMgbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIGNvbGxhcHNlXG4gICAqL1xuICBjb2xsYXBzZU5vZGUobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdldE5vZGVFeHBhbmRlZChub2RlKSkge1xuICAgICAgdGhpcy5zZXROb2RlRXhwYW5kZWQobm9kZSwgZmFsc2UpO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHRoaXMub25Ob2RlVG9nZ2xlLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBuZXcgRXZlbnQoJ2NvbGxhcHNlJykgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBleHBhbnNpb24gc3RhdGUgb2YgYSBzcGVjaWZpYyBub2RlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gdG9nZ2xlXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRvZ2dsZSBpcyBjb21wbGV0ZSAoaWYgbGF6eSBsb2FkaW5nKVxuICAgKi9cbiAgYXN5bmMgdG9nZ2xlTm9kZUV4cGFuc2lvbihub2RlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpKSB7XG4gICAgICB0aGlzLmNvbGxhcHNlTm9kZShub2RlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmV4cGFuZE5vZGUobm9kZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBzZWxlY3QgYSBub2RlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gc2VsZWN0XG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSB3YXMgZm91bmQgYW5kIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHNlbGVjdE5vZGUobm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlKCkgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIGlmICghbm9kZSB8fCB0aGlzLmlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSkgfHwgIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGUgPSB0aGlzLnNlbGVjdE1vZGUoKTtcbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuZGVzZWxlY3RBbGxOb2RlcyhcbiAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZVBhcmVudFN0YXRlcyhcbiAgICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCksXG4gICAgICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IGRlc2VsZWN0IGEgbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlIHRvIGRlc2VsZWN0XG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSB3YXMgZm91bmQgYW5kIGRlc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgZGVzZWxlY3ROb2RlKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCBmYWxzZSk7XG4gICAgdGhpcy5zZXROb2RlSW5kZXRlcm1pbmF0ZShub2RlLCBmYWxzZSk7XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2Uuc2VsZWN0QWxsQ2hpbGRyZW4oXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlUGFyZW50U3RhdGVzKFxuICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSxcbiAgICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLm9uTm9kZVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogZmFsc2UsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmVudCBub2RlIG9mIGEgZ2l2ZW4gbm9kZVxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlXG4gICAqIEByZXR1cm5zIFRoZSBwYXJlbnQgbm9kZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGdldFBhcmVudChub2RlSWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlIHwgbnVsbCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5maW5kUGFyZW50Tm9kZSh0aGlzLm5vZGVzKCksIG5vZGUsIHRoaXMuaWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hpbGRyZW4gb2YgYSBub2RlXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIHBhcmVudCBub2RlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNoaWxkIG5vZGVzLCBvciBudWxsIGlmIG5vZGUgbm90IGZvdW5kXG4gICAqL1xuICBnZXRDaGlsZHJlbihub2RlSWQ6IHN0cmluZyk6IEFYVHJlZVZpZXdOb2RlW10gfCBudWxsIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZShub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJvb3Qgbm9kZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygcm9vdCBub2Rlc1xuICAgKi9cbiAgZ2V0Um9vdE5vZGVzKCk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5ub2RlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIG5vZGVzIGluIGEgZmxhdCBhcnJheVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcbiAgICovXG4gIGdldEFsbE5vZGVzKCk6IEFYVHJlZVZpZXdOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmdldEFsbE5vZGVzKHRoaXMubm9kZXMoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB0byBhIG5vZGUgKGFycmF5IG9mIHBhcmVudCBJRHMgZnJvbSByb290IHRvIG5vZGUpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9kZSBJRHMgcmVwcmVzZW50aW5nIHRoZSBwYXRoLCBvciBlbXB0eSBhcnJheSBpZiBub2RlIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0Tm9kZVBhdGgobm9kZUlkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9kZVBhdGggPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVQYXRoKHRoaXMubm9kZXMoKSwgbm9kZUlkLCB0aGlzLmlkRmllbGQoKSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIHJldHVybiBub2RlUGF0aC5tYXAoKG5vZGUpID0+IHRoaXMuZ2V0Tm9kZUlkKG5vZGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxldmVsL2RlcHRoIG9mIGEgbm9kZSAoMCA9IHJvb3QgbGV2ZWwpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGVcbiAgICogQHJldHVybnMgVGhlIGxldmVsIG9mIHRoZSBub2RlLCBvciAtMSBpZiBub2RlIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0Tm9kZUxldmVsKG5vZGVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5nZXROb2RlTGV2ZWwodGhpcy5ub2RlcygpLCBub2RlSWQsIHRoaXMuaWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBtb3ZlIGEgbm9kZSB0byBhIG5ldyBwYXJlbnRcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBtb3ZlXG4gICAqIEBwYXJhbSBuZXdQYXJlbnRJZCAtIFRoZSBJRCBvZiB0aGUgbmV3IHBhcmVudCAodW5kZWZpbmVkIGZvciByb290IGxldmVsKVxuICAgKiBAcGFyYW0gaW5kZXggLSBPcHRpb25hbCBpbmRleCB0byBpbnNlcnQgYXQgKGRlZmF1bHQ6IGFwcGVuZCB0byBlbmQpXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbW92ZSB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBtb3ZlTm9kZShub2RlSWQ6IHN0cmluZywgbmV3UGFyZW50SWQ/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cmVlU2VydmljZS5tb3ZlTm9kZShcbiAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgIG5vZGVJZCxcbiAgICAgIG5ld1BhcmVudElkLFxuICAgICAgaW5kZXgsXG4gICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkNvdW50RmllbGQoKSxcbiAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICk7XG5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0Lm1vdmVkTm9kZSkge1xuICAgICAgLy8gRW1pdCBkcm9wIGV2ZW50c1xuICAgICAgdGhpcy5lbWl0RHJvcEV2ZW50cyhcbiAgICAgICAgcmVzdWx0Lm1vdmVkTm9kZSxcbiAgICAgICAgcmVzdWx0LnByZXZpb3VzUGFyZW50LFxuICAgICAgICByZXN1bHQubmV3UGFyZW50LFxuICAgICAgICByZXN1bHQucHJldmlvdXNJbmRleCxcbiAgICAgICAgcmVzdWx0LmN1cnJlbnRJbmRleCxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSBhIG5vZGUgKGNyZWF0ZXMgYSBkZWVwIGNvcHkpXG4gICAqIEBwYXJhbSBub2RlSWQgLSBUaGUgSUQgb2YgdGhlIG5vZGUgdG8gY2xvbmVcbiAgICogQHJldHVybnMgVGhlIGNsb25lZCBub2RlLCBvciBudWxsIGlmIG5vZGUgbm90IGZvdW5kXG4gICAqL1xuICBjbG9uZU5vZGUobm9kZUlkOiBzdHJpbmcpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5jbG9uZU5vZGUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICB0aGlzLnRpdGxlRmllbGQoKSxcbiAgICAgIHRoaXMudG9vbHRpcEZpZWxkKCksXG4gICAgICB0aGlzLmljb25GaWVsZCgpLFxuICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaGlkZGVuRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmRhdGFGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyBhIHNwZWNpZmljIG5vZGUgYnkgSURcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBmb2N1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgd2FzIGZvdW5kIGFuZCBmb2N1c2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGZvY3VzTm9kZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlIHx8IHRoaXMuZ2V0Tm9kZUhpZGRlbihub2RlKSA9PT0gdHJ1ZSB8fCB0aGlzLmlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5mb2N1c05vZGVCeUlkKG5vZGVJZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBleHBhbmRlZCBub2Rlc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBleHBhbmRlZCBub2Rlc1xuICAgKi9cbiAgZ2V0RXhwYW5kZWROb2RlcygpOiBBWFRyZWVWaWV3Tm9kZVtdIHtcbiAgICBjb25zdCBleHBhbmRlZDogQVhUcmVlVmlld05vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzOiBBWFRyZWVWaWV3Tm9kZVtdKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpKSB7XG4gICAgICAgICAgZXhwYW5kZWQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICB0cmF2ZXJzZShjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRyYXZlcnNlKHRoaXMubm9kZXMoKSk7XG4gICAgcmV0dXJuIGV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY29sbGFwc2VkIG5vZGVzIHRoYXQgaGF2ZSBjaGlsZHJlblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBjb2xsYXBzZWQgbm9kZXMgd2l0aCBjaGlsZHJlblxuICAgKi9cbiAgZ2V0Q29sbGFwc2VkTm9kZXMoKTogQVhUcmVlVmlld05vZGVbXSB7XG4gICAgY29uc3QgY29sbGFwc2VkOiBBWFRyZWVWaWV3Tm9kZVtdID0gW107XG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXM6IEFYVHJlZVZpZXdOb2RlW10pOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5nZXROb2RlQ2hpbGRyZW5Db3VudChub2RlKTtcbiAgICAgICAgaWYgKCF0aGlzLmdldE5vZGVFeHBhbmRlZChub2RlKSAmJiAoY2hpbGRyZW4/Lmxlbmd0aCB8fCBjaGlsZHJlbkNvdW50KSkge1xuICAgICAgICAgIGNvbGxhcHNlZC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgIHRyYXZlcnNlKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdHJhdmVyc2UodGhpcy5ub2RlcygpKTtcbiAgICByZXR1cm4gY29sbGFwc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBpcyBleHBhbmRlZFxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBleHBhbmRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc05vZGVFeHBhbmRlZChub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgcmV0dXJuIG5vZGUgPyB0aGlzLmdldE5vZGVFeHBhbmRlZChub2RlKSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBpcyBzZWxlY3RlZFxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIElEIG9mIHRoZSBub2RlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc05vZGVTZWxlY3RlZChub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgcmV0dXJuIG5vZGUgPyB0aGlzLmdldE5vZGVTZWxlY3RlZChub2RlKSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBoYXMgY2hpbGRyZW5cbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgaGFzIGNoaWxkcmVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGhhc0NoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZE5vZGUobm9kZUlkKTtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5oYXNDaGlsZHJlbihub2RlID8/IHt9LCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGlzIGRpc2FibGVkIChjb25zaWRlcmluZyBpbmhlcml0YW5jZSBmcm9tIHBhcmVudCBub2RlcylcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBJRCBvZiB0aGUgbm9kZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgZGlzYWJsZWQgKGRpcmVjdGx5IG9yIGluaGVyaXRlZCksIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaXNEaXNhYmxlZChub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlKG5vZGVJZCk7XG4gICAgcmV0dXJuIG5vZGUgPyB0aGlzLmlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGVtcGxhdGUgY29udGV4dCBmb3IgYSBub2RlXG4gICAqL1xuICBnZXRUZW1wbGF0ZUNvbnRleHQobm9kZTogQVhUcmVlVmlld05vZGUsIGxldmVsID0gMCk6IEFYVHJlZVZpZXdOb2RlVGVtcGxhdGVDb250ZXh0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIGNvbnN0IGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpO1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IG5vZGUsXG4gICAgICBub2RlLFxuICAgICAgbGV2ZWwsXG4gICAgICBleHBhbmRlZDogdGhpcy5nZXROb2RlRXhwYW5kZWQobm9kZSksXG4gICAgICBjaGlsZHJlbkNvdW50OiBjaGlsZHJlbkNvdW50ID8/IGNoaWxkcmVuPy5sZW5ndGggPz8gMCxcbiAgICAgIGxvYWRpbmc6IHRoaXMuZ2V0Tm9kZUxvYWRpbmcobm9kZSksXG4gICAgICBkaXNhYmxlZDogdGhpcy5pc05vZGVFZmZlY3RpdmVseURpc2FibGVkKG5vZGUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHBhZGRpbmctaW5saW5lIGZvciBhIG5vZGUgYmFzZWQgb24gaXRzIGxldmVsXG4gICAqL1xuICBnZXROb2RlUGFkZGluZ0lubGluZShsZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBpbmRlbnQgPSB0aGlzLmluZGVudFNpemUoKTtcbiAgICBjb25zdCBjdXJyZW50TG9vayA9IHRoaXMubG9vaygpO1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBjdXJyZW50TG9vayA9PT0gJ3dpdGgtbGluZScgPyAxIC8gMyA6IDE7XG4gICAgcmV0dXJuIGxldmVsICogaW5kZW50ICogbXVsdGlwbGllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBub2RlIHNob3VsZCBzaG93IGV4cGFuZCB0b2dnbGVcbiAgICovXG4gIHNob3VsZFNob3dFeHBhbmRUb2dnbGUobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy50cmVlU2VydmljZS5oYXNDaGlsZHJlbihub2RlLCB0aGlzLmNoaWxkcmVuRmllbGQoKSkgfHxcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY2FuTGF6eUxvYWQobm9kZSwgdGhpcy5pc0xhenlEYXRhU291cmNlKCksIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2hlY2tib3hlcyBzaG91bGQgYmUgc2hvd24gKG9ubHkgZm9yIG11bHRpcGxlIG1vZGUpXG4gICAqL1xuICBzaG91bGRTaG93Q2hlY2tib3goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbXVsdGlwbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBpcyBhIGxlYWYgKGhhcyBubyBjaGlsZHJlbilcbiAgICogQSBub2RlIGlzIGEgbGVhZiBpZiBpdCBoYXMgbm8gbG9hZGVkIGNoaWxkcmVuIEFORCBubyBjaGlsZHJlbkNvdW50IChvciBjaGlsZHJlbkNvdW50IGlzIDApXG4gICAqL1xuICBpc0xlYWZOb2RlKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSB0aGlzLnRyZWVTZXJ2aWNlLmhhc0NoaWxkcmVuKG5vZGUsIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5nZXROb2RlQ2hpbGRyZW5Db3VudChub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkNvdW50ID0gY2hpbGRyZW5Db3VudCAmJiBjaGlsZHJlbkNvdW50ID4gMDtcbiAgICBjb25zdCBjYW5MYXp5TG9hZCA9IHRoaXMudHJlZVNlcnZpY2UuY2FuTGF6eUxvYWQoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5pc0xhenlEYXRhU291cmNlKCksXG4gICAgICB0aGlzLmNoaWxkcmVuQ291bnRGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcblxuICAgIC8vIEEgbm9kZSBpcyBhIGxlYWYgaWY6XG4gICAgLy8gMS4gSXQgaGFzIG5vIGxvYWRlZCBjaGlsZHJlblxuICAgIC8vIDIuIEFORCBpdCBoYXMgbm8gY2hpbGRyZW5Db3VudCAob3IgY2hpbGRyZW5Db3VudCBpcyAwKVxuICAgIC8vIDMuIEFORCBpdCBjYW5ub3QgYmUgbGF6eSBsb2FkZWRcbiAgICByZXR1cm4gIWhhc0NoaWxkcmVuICYmICFoYXNDaGlsZHJlbkNvdW50ICYmICFjYW5MYXp5TG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgY2FuIGJlIHNlbGVjdGVkIChjb25zaWRlcmluZyBzZWxlY3RNb2RlIGFuZCBpc0xlYWZPbmx5TW9kZSlcbiAgICovXG4gIGNhblNlbGVjdE5vZGUobm9kZTogQVhUcmVlVmlld05vZGUpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlKCkgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjaGVja2JveCBzaG91bGQgYmUgc2hvd24gZm9yIGEgc3BlY2lmaWMgbm9kZVxuICAgKi9cbiAgc2hvdWxkU2hvd0NoZWNrYm94Rm9yTm9kZShub2RlOiBBWFRyZWVWaWV3Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zaG91bGRTaG93Q2hlY2tib3goKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgbGlzdCBJRCBmb3IgZWFjaCBub2RlXG4gICAqL1xuICBnZXRMaXN0SWQobm9kZT86IEFYVHJlZVZpZXdOb2RlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5nZXRMaXN0SWQobm9kZSwgdGhpcy5pZEZpZWxkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBpcyBjdXJyZW50bHkgZm9jdXNlZFxuICAgKi9cbiAgaXNOb2RlRm9jdXNlZChub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvY3VzZWROb2RlSWQoKSA9PT0gbm9kZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBUklBIGxldmVsIGZvciBhIG5vZGVcbiAgICovXG4gIGdldE5vZGVBcmlhTGV2ZWwobGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxldmVsICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVJJQSBleHBhbmRlZCBzdGF0ZSBmb3IgYSBub2RlXG4gICAqL1xuICBnZXROb2RlQXJpYUV4cGFuZGVkKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFNob3dFeHBhbmRUb2dnbGUobm9kZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXROb2RlRXhwYW5kZWQobm9kZSkgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBUklBIHNlbGVjdGVkIHN0YXRlIGZvciBhIG5vZGVcbiAgICovXG4gIGdldE5vZGVBcmlhU2VsZWN0ZWQobm9kZTogQVhUcmVlVmlld05vZGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlKCkgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5nZXROb2RlU2VsZWN0ZWQobm9kZSk7XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgd2l0aCBhbGwgc2VsZWN0ZWQgbm9kZXNcbiAgICovXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZE5vZGVzID0gdGhpcy5nZXRTZWxlY3RlZE5vZGVzKCk7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIHNlbGVjdGVkTm9kZXMsXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBFdmVudCBIYW5kbGVycyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbm9kZSBkb3VibGUgY2xpY2tcbiAgICovXG4gIG9uTm9kZURvdWJsZUNsaWNrSGFuZGxlKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc05vZGVFZmZlY3RpdmVseURpc2FibGVkKG5vZGUpKSByZXR1cm47XG5cbiAgICB0aGlzLm9uTm9kZURvdWJsZUNsaWNrLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSGFuZGxlIG5vZGUgY2xpY2sgaGFuZGxlXG4gICAqL1xuICBvbk5vZGVDbGlja0hhbmRsZShub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNOb2RlRWZmZWN0aXZlbHlEaXNhYmxlZChub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuXG4gICAgdGhpcy5hY3RpdmVOb2RlSWQuc2V0KHRoaXMuZ2V0Tm9kZUlkKG5vZGUpKTtcbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMuaGFuZGxlU2luZ2xlU2VsZWN0aW9uKG5vZGUsIGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm9uTm9kZUNsaWNrLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBldmVudCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgbm9kZSBleHBhbnNpb24gc3RhdGUgd2l0aCBsYXp5IGxvYWRpbmcgc3VwcG9ydFxuICAgKiBOb3RlOiBEaXNhYmxlZCBub2RlcyBjYW4gc3RpbGwgYmUgdG9nZ2xlZCAoZXhwYW5kZWQvY29sbGFwc2VkKSBmb3IgYmV0dGVyIFVYXG4gICAqL1xuICBhc3luYyB0b2dnbGVOb2RlKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0V2ZW50KGV2ZW50KSAmJiB0eXBlb2YgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuaGFzQ2hpbGRyZW4obm9kZSwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpO1xuICAgIGNvbnN0IGNhbkxhenlMb2FkID0gdGhpcy50cmVlU2VydmljZS5jYW5MYXp5TG9hZChcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5Db3VudEZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuIHx8IGNhbkxhenlMb2FkKSB7XG4gICAgICBjb25zdCB3aWxsRXhwYW5kID0gIXRoaXMuZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpO1xuXG4gICAgICBpZiAod2lsbEV4cGFuZCAmJiBjYW5MYXp5TG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG5vZGUsIHdpbGxFeHBhbmQpO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICAgIHRoaXMub25Ob2RlVG9nZ2xlLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIG5vZGUsIG5hdGl2ZUV2ZW50OiBldmVudCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIG5vZGUgc2VsZWN0aW9uIHN0YXRlIHdpdGggaW5kZXRlcm1pbmF0ZSBzdXBwb3J0IChmb3IgbXVsdGlwbGUgbW9kZSlcbiAgICovXG4gIHRvZ2dsZVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEFYVmFsdWVDaGFuZ2VkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmlzVXNlckludGVyYWN0aW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSgpID09PSAnbm9uZScpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuICAgIGlmIChtb2RlICE9PSAnbXVsdGlwbGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50LnZhbHVlID09PSBudWxsID8gdHJ1ZSA6IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgaWYgKHRoaXMuY2FzY2FkZXNUb0NoaWxkcmVuKCkgJiYgY2hpbGRyZW4gJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiBldmVudC5pc1VzZXJJbnRlcmFjdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZHJvcCBldmVudHMgZm9yIHRyZWUgbm9kZXNcbiAgICovXG4gIG9uRHJvcChldmVudDogQVhEcm9wTGlzdERyb3BwZWRFdmVudCwgcGFyZW50Tm9kZT86IEFYVHJlZVZpZXdOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBwYXJlbnROb2RlID8gKHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKHBhcmVudE5vZGUpID8/IFtdKSA6IHRoaXMubm9kZXMoKTtcbiAgICBjb25zdCBpc1Jlb3JkZXJpbmcgPSBldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyO1xuXG4gICAgaWYgKGlzUmVvcmRlcmluZykge1xuICAgICAgdGhpcy5oYW5kbGVSZW9yZGVyKGV2ZW50LCB0YXJnZXRBcnJheSwgcGFyZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlTW92ZShldmVudCwgdGFyZ2V0QXJyYXksIHBhcmVudE5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyb3AgZXZlbnRzIHdoZW4gZHJvcHBpbmcgZGlyZWN0bHkgb250byBhIG5vZGUgKHRvIG1ha2UgaXQgYSBjaGlsZClcbiAgICovXG4gIG9uRHJvcE9udG9Ob2RlKGV2ZW50OiBBWERyb3BMaXN0RHJvcHBlZEV2ZW50LCB0YXJnZXROb2RlOiBBWFRyZWVWaWV3Tm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Nb3ZlVG9QYXJlbnQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc291cmNlTGlzdElkID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZWxlbWVudC5pZDtcbiAgICBjb25zdCBzb3VyY2VBcnJheSA9IHRoaXMuZ2V0QXJyYXlCeUxpc3RJZChzb3VyY2VMaXN0SWQpO1xuICAgIGlmICghc291cmNlQXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmVkTm9kZSA9IHNvdXJjZUFycmF5W2V2ZW50LnByZXZpb3VzSW5kZXhdO1xuXG4gICAgaWYgKCF0aGlzLnRyZWVTZXJ2aWNlLmlzVmFsaWREcm9wVGFyZ2V0KG1vdmVkTm9kZSwgdGFyZ2V0Tm9kZSwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbWl0QmVmb3JlRHJvcEV2ZW50KG1vdmVkTm9kZSwgc291cmNlTGlzdElkLCB0YXJnZXROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCAwKSkgcmV0dXJuO1xuXG4gICAgbGV0IHRhcmdldENoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4odGFyZ2V0Tm9kZSk7XG4gICAgaWYgKCF0YXJnZXRDaGlsZHJlbikge1xuICAgICAgdGFyZ2V0Q2hpbGRyZW4gPSBbXTtcbiAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKHRhcmdldE5vZGUsIHRhcmdldENoaWxkcmVuKTtcbiAgICB9XG4gICAgc291cmNlQXJyYXkuc3BsaWNlKGV2ZW50LnByZXZpb3VzSW5kZXgsIDEpO1xuICAgIHRhcmdldENoaWxkcmVuLnVuc2hpZnQobW92ZWROb2RlKTtcbiAgICB0aGlzLnNldE5vZGVFeHBhbmRlZCh0YXJnZXROb2RlLCB0cnVlKTtcblxuICAgIHRoaXMuZW1pdERyb3BFdmVudHMobW92ZWROb2RlLCB0aGlzLmZpbmRQYXJlbnRCeUxpc3RJZChzb3VyY2VMaXN0SWQpLCB0YXJnZXROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCAwLCBmYWxzZSk7XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub2RlIGZvY3VzIGV2ZW50XG4gICAqL1xuICBvbk5vZGVGb2N1cyhub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNlZE5vZGVJZC5zZXQobm9kZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdHJlZSBjb250YWluZXIgZm9jdXMgLSBmb2N1cyBmaXJzdCBub2RlIGlmIG5vbmUgaXMgZm9jdXNlZFxuICAgKi9cbiAgb25UcmVlRm9jdXMoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBjb25zdCBmbGF0TGlzdCA9IHRoaXMudHJlZVNlcnZpY2UuYnVpbGRGbGF0Tm9kZUxpc3QoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgdGhpcy5oaWRkZW5GaWVsZCgpLFxuICAgICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5leHBhbmRlZEZpZWxkKCksXG4gICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgKTtcbiAgICAgIGlmIChmbGF0TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRJZCA9IHRoaXMuZm9jdXNlZE5vZGVJZCgpO1xuICAgICAgICBpZiAoZm9jdXNlZElkKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvY3VzZWQgbm9kZSBzdGlsbCBleGlzdHMgYW5kIGlzIG5vdCBoaWRkZW5cbiAgICAgICAgICBjb25zdCBmb2N1c2VkTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZmluZE5vZGVCeUlkKFxuICAgICAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICAgICAgZm9jdXNlZElkLFxuICAgICAgICAgICAgdGhpcy5pZEZpZWxkKCksXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmb2N1c2VkTm9kZSAmJiB0aGlzLmdldE5vZGVIaWRkZW4oZm9jdXNlZE5vZGUpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzTm9kZUJ5SWQoZm9jdXNlZElkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9jdXNlZCBub2RlIG5vIGxvbmdlciBleGlzdHMsIGZvY3VzIGZpcnN0IG5vZGVcbiAgICAgICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZCh0aGlzLmdldE5vZGVJZChmbGF0TGlzdFswXS5ub2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIG5vZGUgaXMgZm9jdXNlZCwgZm9jdXMgZmlyc3Qgbm9kZVxuICAgICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZCh0aGlzLmdldE5vZGVJZChmbGF0TGlzdFswXS5ub2RlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRyZWUgY29udGFpbmVyIGJsdXJcbiAgICovXG4gIG9uVHJlZUJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAmJiAhKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZE5vZGVJZC5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAqL1xuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZmxhdExpc3QgPSB0aGlzLnRyZWVTZXJ2aWNlLmJ1aWxkRmxhdE5vZGVMaXN0KFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgdGhpcy5oaWRkZW5GaWVsZCgpLFxuICAgICAgdGhpcy5kaXNhYmxlZEZpZWxkKCksXG4gICAgICB0aGlzLmV4cGFuZGVkRmllbGQoKSxcbiAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICk7XG4gICAgaWYgKGZsYXRMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudEZvY3VzZWQgPSB0aGlzLmdldEZvY3VzZWROb2RlKCk7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IGN1cnJlbnRGb2N1c2VkXG4gICAgICA/IGZsYXRMaXN0LmZpbmRJbmRleCgoaXRlbSkgPT4gdGhpcy5nZXROb2RlSWQoaXRlbS5ub2RlKSA9PT0gdGhpcy5nZXROb2RlSWQoY3VycmVudEZvY3VzZWQpKVxuICAgICAgOiAtMTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xICYmIGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xuICAgICAgY3VycmVudEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpZ2F0aW9uUmVzdWx0ID0gdGhpcy5oYW5kbGVOYXZpZ2F0aW9uS2V5KGV2ZW50LCBmbGF0TGlzdCwgY3VycmVudEluZGV4LCBjdXJyZW50Rm9jdXNlZCk7XG4gICAgaWYgKG5hdmlnYXRpb25SZXN1bHQuaGFuZGxlZCkge1xuICAgICAgaWYgKG5hdmlnYXRpb25SZXN1bHQuc2hvdWxkUHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIG5hdmlnYXRpb25SZXN1bHQudGFyZ2V0SW5kZXggIT09IG51bGwgJiZcbiAgICAgICAgbmF2aWdhdGlvblJlc3VsdC50YXJnZXRJbmRleCA+PSAwICYmXG4gICAgICAgIG5hdmlnYXRpb25SZXN1bHQudGFyZ2V0SW5kZXggPCBmbGF0TGlzdC5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmZvY3VzTm9kZUJ5SWQodGhpcy5nZXROb2RlSWQoZmxhdExpc3RbbmF2aWdhdGlvblJlc3VsdC50YXJnZXRJbmRleF0ubm9kZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgTWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogTG9hZCByb290IGl0ZW1zIHdoZW4gZGF0YXNvdXJjZSBpcyBhIGZ1bmN0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRSb290SXRlbXMobG9hZEZuOiBBWFRyZWVWaWV3Q2FsbGJhY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbG9hZEZuKCk7XG4gICAgICBjb25zdCByb290Tm9kZXMgPSByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcmVzdWx0IDogcmVzdWx0O1xuICAgICAgdGhpcy5ub2Rlcy5zZXQocm9vdE5vZGVzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcignRmFpbGVkIHRvIGxvYWQgcm9vdCBpdGVtcycsIGVycm9yKTtcbiAgICAgIHRoaXMubm9kZXMuc2V0KFtdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjaGlsZHJlbiBmb3IgYSBub2RlIHVzaW5nIGxhenkgbG9hZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTm9kZUNoaWxkcmVuKG5vZGU6IEFYVHJlZVZpZXdOb2RlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9kZUlkID0gdGhpcy5nZXROb2RlSWQobm9kZSk7XG4gICAgaWYgKCF0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSB8fCB0aGlzLmxvYWRpbmdOb2RlcygpLmhhcyhub2RlSWQpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy50cmVlU2VydmljZS5oYXNDaGlsZHJlbihub2RlLCB0aGlzLmNoaWxkcmVuRmllbGQoKSkpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuQ291bnQgPSB0aGlzLmdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpO1xuICAgICAgaWYgKCFjaGlsZHJlbkNvdW50IHx8IGNoaWxkcmVuQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhc291cmNlKCk7XG4gICAgaWYgKHR5cGVvZiBkcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ05vZGVzLnVwZGF0ZSgoc2V0KSA9PiBuZXcgU2V0KHNldCkuYWRkKG5vZGVJZCkpO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gZHMobm9kZUlkKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IHJlc3VsdCA6IHJlc3VsdDtcbiAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKTtcbiAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuQ291bnQobm9kZSwgY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcignRmFpbGVkIHRvIGxvYWQgY2hpbGRyZW4nLCBlcnJvcik7XG4gICAgICB0aGlzLnNldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUsIDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmdOb2Rlcy51cGRhdGUoKHNldCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdTZXQgPSBuZXcgU2V0KHNldCk7XG4gICAgICAgIG5ld1NldC5kZWxldGUobm9kZUlkKTtcbiAgICAgICAgcmV0dXJuIG5ld1NldDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHJlZnJlc2ggbm9kZXMgc2lnbmFsIGFuZCBzeW5jIGJhY2sgdG8gZGF0YXNvdXJjZSBpZiBpdCdzIGFuIGFycmF5XG4gICAqIENyZWF0ZXMgbmV3IGFycmF5IHJlZmVyZW5jZXMgZm9yIGFsbCBuZXN0ZWQgY2hpbGRyZW4gdG8gZW5zdXJlIHJlYWN0aXZpdHlcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaE5vZGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnROb2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICAvLyBDcmVhdGUgbmV3IGFycmF5IHJlZmVyZW5jZXMgZm9yIGFsbCBuZXN0ZWQgY2hpbGRyZW4gdG8gZW5zdXJlIHJlYWN0aXZpdHlcbiAgICAvLyBUaGlzIGVuc3VyZXMgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gcGlja3MgdXAgY2hhbmdlcyBldmVuIHdpdGggY2FsbGJhY2sgZGF0YXNvdXJjZVxuICAgIHRoaXMuZW5zdXJlTmV3QXJyYXlSZWZlcmVuY2VzKGN1cnJlbnROb2Rlcyk7XG4gICAgdGhpcy5ub2Rlcy5zZXQoWy4uLmN1cnJlbnROb2Rlc10pO1xuXG4gICAgaWYgKCF0aGlzLmlzTGF6eURhdGFTb3VyY2UoKSAmJiAhdGhpcy5pc1VwZGF0aW5nRnJvbURhdGFzb3VyY2UpIHtcbiAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21EYXRhc291cmNlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YXNvdXJjZS5zZXQoWy4uLmN1cnJlbnROb2Rlc10pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21EYXRhc291cmNlID0gZmFsc2U7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZW5zdXJlIGFsbCBjaGlsZHJlbiBhcnJheXMgaGF2ZSBuZXcgcmVmZXJlbmNlcyB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogTXV0YXRlcyB0aGUgdHJlZSBzdHJ1Y3R1cmUgYnkgcmVwbGFjaW5nIGNoaWxkcmVuIGFycmF5cyB3aXRoIG5ldyBhcnJheSByZWZlcmVuY2VzXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZU5ld0FycmF5UmVmZXJlbmNlcyhub2RlczogQVhUcmVlVmlld05vZGVbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgYXJyYXkgcmVmZXJlbmNlIGZvciBjaGlsZHJlblxuICAgICAgICB0aGlzLnNldE5vZGVDaGlsZHJlbihub2RlLCBbLi4uY2hpbGRyZW5dKTtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBuZXN0ZWQgY2hpbGRyZW5cbiAgICAgICAgdGhpcy5lbnN1cmVOZXdBcnJheVJlZmVyZW5jZXMoY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2luZ2xlIHNlbGVjdGlvbiBtb2RlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNpbmdsZVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy50cmVlU2VydmljZS5kZXNlbGVjdEFsbE5vZGVzKFxuICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkKCksXG4gICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgKTtcbiAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCB0cnVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSAodXNlZCBpbnRlcm5hbGx5LCBidXQgaW4gbXVsdGlwbGUgbW9kZSBzZWxlY3Rpb24gaXMgcHJpbWFyaWx5IGhhbmRsZWQgYnkgY2hlY2tib3hlcylcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24obm9kZTogQVhUcmVlVmlld05vZGUsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXRoaXMuZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgaWYgKHRoaXMuY2FzY2FkZXNUb0NoaWxkcmVuKCkgJiYgY2hpbGRyZW4gJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhcnJheSByZWZlcmVuY2UgYnkgZHJvcCBsaXN0IElEXG4gICAqL1xuICBwcml2YXRlIGdldEFycmF5QnlMaXN0SWQobGlzdElkOiBzdHJpbmcpOiBBWFRyZWVWaWV3Tm9kZVtdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuZ2V0QXJyYXlCeUxpc3RJZCh0aGlzLm5vZGVzKCksIGxpc3RJZCwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHBhcmVudCBub2RlIGJ5IGxpc3QgSURcbiAgICovXG4gIHByaXZhdGUgZmluZFBhcmVudEJ5TGlzdElkKGxpc3RJZDogc3RyaW5nKTogQVhUcmVlVmlld05vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyZWVTZXJ2aWNlLmZpbmRQYXJlbnRCeUxpc3RJZCh0aGlzLm5vZGVzKCksIGxpc3RJZCwgdGhpcy5pZEZpZWxkKCksIHRoaXMuY2hpbGRyZW5GaWVsZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb3ZlIG9wZXJhdGlvbiBpcyBhbGxvd2VkIGJhc2VkIG9uIGRyYWdCZWhhdmlvclxuICAgKi9cbiAgcHJpdmF0ZSBjYW5Nb3ZlVG9QYXJlbnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVoYXZpb3IgPSB0aGlzLmRyYWdCZWhhdmlvcigpO1xuICAgIHJldHVybiBiZWhhdmlvciAhPT0gJ25vbmUnICYmIGJlaGF2aW9yICE9PSAnb3JkZXItb25seSc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVvcmRlciBvcGVyYXRpb24gaXMgYWxsb3dlZCBiYXNlZCBvbiBkcmFnQmVoYXZpb3JcbiAgICovXG4gIHByaXZhdGUgY2FuUmVvcmRlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBiZWhhdmlvciA9IHRoaXMuZHJhZ0JlaGF2aW9yKCk7XG4gICAgcmV0dXJuIGJlaGF2aW9yICE9PSAnbm9uZScgJiYgYmVoYXZpb3IgIT09ICdtb3ZlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVvcmRlcmluZyB3aXRoaW4gdGhlIHNhbWUgbGlzdCAgICovXG4gIHByaXZhdGUgaGFuZGxlUmVvcmRlcihcbiAgICBldmVudDogQVhEcm9wTGlzdERyb3BwZWRFdmVudCxcbiAgICB0YXJnZXRBcnJheTogQVhUcmVlVmlld05vZGVbXSxcbiAgICBwYXJlbnROb2RlPzogQVhUcmVlVmlld05vZGUsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZW9yZGVyKCkpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmVkTm9kZSA9IHRhcmdldEFycmF5W2V2ZW50LnByZXZpb3VzSW5kZXhdO1xuICAgIG1vdmVJdGVtSW5BcnJheSh0YXJnZXRBcnJheSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcblxuICAgIHRoaXMuZW1pdERyb3BFdmVudHMobW92ZWROb2RlLCBwYXJlbnROb2RlLCBwYXJlbnROb2RlLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3ZpbmcgYmV0d2VlbiBkaWZmZXJlbnQgbGlzdHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTW92ZShldmVudDogQVhEcm9wTGlzdERyb3BwZWRFdmVudCwgdGFyZ2V0QXJyYXk6IEFYVHJlZVZpZXdOb2RlW10sIHBhcmVudE5vZGU/OiBBWFRyZWVWaWV3Tm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Nb3ZlVG9QYXJlbnQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc291cmNlTGlzdElkID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZWxlbWVudC5pZDtcbiAgICBjb25zdCBzb3VyY2VBcnJheSA9IHRoaXMuZ2V0QXJyYXlCeUxpc3RJZChzb3VyY2VMaXN0SWQpO1xuICAgIGlmICghc291cmNlQXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmVkTm9kZSA9IHNvdXJjZUFycmF5W2V2ZW50LnByZXZpb3VzSW5kZXhdO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgJiYgIXRoaXMudHJlZVNlcnZpY2UuaXNWYWxpZERyb3BUYXJnZXQobW92ZWROb2RlLCBwYXJlbnROb2RlKSkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmVtaXRCZWZvcmVEcm9wRXZlbnQobW92ZWROb2RlLCBzb3VyY2VMaXN0SWQsIHBhcmVudE5vZGUsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cmFuc2ZlckFycmF5SXRlbShzb3VyY2VBcnJheSwgdGFyZ2V0QXJyYXksIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG5cbiAgICB0aGlzLmVtaXREcm9wRXZlbnRzKFxuICAgICAgbW92ZWROb2RlLFxuICAgICAgdGhpcy5maW5kUGFyZW50QnlMaXN0SWQoc291cmNlTGlzdElkKSxcbiAgICAgIHBhcmVudE5vZGUsXG4gICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgZXZlbnQuY3VycmVudEluZGV4LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGJlZm9yZURyb3AgZXZlbnQgYW5kIHJldHVybiB3aGV0aGVyIHRvIGNvbnRpbnVlXG4gICAqL1xuICBwcml2YXRlIGVtaXRCZWZvcmVEcm9wRXZlbnQoXG4gICAgbW92ZWROb2RlOiBBWFRyZWVWaWV3Tm9kZSxcbiAgICBzb3VyY2VMaXN0SWQ6IHN0cmluZyxcbiAgICBjdXJyZW50UGFyZW50OiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCxcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXIsXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZURyb3BFdmVudDogQVhUcmVlVmlld0JlZm9yZURyb3BFdmVudCA9IHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG1vdmVkTm9kZSxcbiAgICAgIHByZXZpb3VzUGFyZW50OiB0aGlzLmZpbmRQYXJlbnRCeUxpc3RJZChzb3VyY2VMaXN0SWQpLFxuICAgICAgY3VycmVudFBhcmVudCxcbiAgICAgIHByZXZpb3VzSW5kZXgsXG4gICAgICBjdXJyZW50SW5kZXgsXG4gICAgICBjYW5jZWxlZDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLm9uQmVmb3JlRHJvcC5lbWl0KGJlZm9yZURyb3BFdmVudCk7XG5cbiAgICByZXR1cm4gIWJlZm9yZURyb3BFdmVudC5jYW5jZWxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGRyb3AgZXZlbnRzIGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlXG4gICAqL1xuICBwcml2YXRlIGVtaXREcm9wRXZlbnRzKFxuICAgIG5vZGU6IEFYVHJlZVZpZXdOb2RlLFxuICAgIHByZXZpb3VzUGFyZW50OiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCxcbiAgICBjdXJyZW50UGFyZW50OiBBWFRyZWVWaWV3Tm9kZSB8IHVuZGVmaW5lZCxcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXIsXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgaXNSZW9yZGVyOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkcm9wRXZlbnQ6IEFYVHJlZVZpZXdEcm9wRXZlbnQgPSB7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgcHJldmlvdXNQYXJlbnQsXG4gICAgICBjdXJyZW50UGFyZW50LFxuICAgICAgcHJldmlvdXNJbmRleCxcbiAgICAgIGN1cnJlbnRJbmRleCxcbiAgICB9O1xuXG4gICAgaWYgKGlzUmVvcmRlcikge1xuICAgICAgdGhpcy5vbk9yZGVyQ2hhbmdlLmVtaXQoZHJvcEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk1vdmVDaGFuZ2UuZW1pdChkcm9wRXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLm9uSXRlbXNDaGFuZ2UuZW1pdChkcm9wRXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGZvY3VzZWQgbm9kZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb2N1c2VkTm9kZSgpOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwge1xuICAgIGNvbnN0IGZvY3VzZWRJZCA9IHRoaXMuZm9jdXNlZE5vZGVJZCgpO1xuICAgIGlmICghZm9jdXNlZElkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy50cmVlU2VydmljZS5maW5kTm9kZUJ5SWQodGhpcy5ub2RlcygpLCBmb2N1c2VkSWQsIHRoaXMuaWRGaWVsZCgpLCB0aGlzLmNoaWxkcmVuRmllbGQoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGZvY3VzIHRvIGEgbm9kZSBieSBJRFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c05vZGVCeUlkKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkTm9kZUlkLnNldChub2RlSWQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS10cmVlLW5vZGUtaWQ9XCIke25vZGVJZH1cIl1gKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBrZXlzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRpb25LZXkoXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZmxhdExpc3Q6IEFYVHJlZVZpZXdGbGF0Tm9kZVtdLFxuICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRGb2N1c2VkOiBBWFRyZWVWaWV3Tm9kZSB8IG51bGwsXG4gICk6IHsgaGFuZGxlZDogYm9vbGVhbjsgc2hvdWxkUHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHRhcmdldEluZGV4OiBudW1iZXIgfCBudWxsIH0ge1xuICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IGN1cnJlbnRJbmRleDtcbiAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIGxldCBoYW5kbGVkID0gdHJ1ZTtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IGZsYXRMaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICBpZiAoY3VycmVudEZvY3VzZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5nZXROb2RlRXhwYW5kZWQoY3VycmVudEZvY3VzZWQpICYmIHRoaXMuc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTm9kZShjdXJyZW50Rm9jdXNlZCwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gZmxhdExpc3RbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbT8ucGFyZW50KSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gZmxhdExpc3QuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmdldE5vZGVJZChpdGVtLm5vZGUpID09PSB0aGlzLmdldE5vZGVJZChjdXJyZW50SXRlbS5wYXJlbnQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZCkge1xuICAgICAgICAgIGlmICghdGhpcy5nZXROb2RlRXhwYW5kZWQoY3VycmVudEZvY3VzZWQpICYmIHRoaXMuc2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTm9kZShjdXJyZW50Rm9jdXNlZCwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUV4cGFuZGVkKGN1cnJlbnRGb2N1c2VkKSAmJlxuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5oYXNDaGlsZHJlbihjdXJyZW50Rm9jdXNlZCwgdGhpcy5jaGlsZHJlbkZpZWxkKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKGN1cnJlbnRGb2N1c2VkKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0TGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IHRoaXMuZ2V0Tm9kZUlkKGl0ZW0ubm9kZSkgPT09IHRoaXMuZ2V0Tm9kZUlkKGZpcnN0Q2hpbGQpKTtcbiAgICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRGbGF0TGlzdCA9IHRoaXMudHJlZVNlcnZpY2UuYnVpbGRGbGF0Tm9kZUxpc3QoXG4gICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzKCksXG4gICAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbkZpZWxkKCksXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkRmllbGQoKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWRGaWVsZCgpLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHVwZGF0ZWRGbGF0TGlzdC5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5nZXROb2RlSWQoaXRlbS5ub2RlKSA9PT0gdGhpcy5nZXROb2RlSWQoZmlyc3RDaGlsZCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gMCAmJiB0YXJnZXRJbmRleCA8IHVwZGF0ZWRGbGF0TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOb2RlQnlJZCh0aGlzLmdldE5vZGVJZCh1cGRhdGVkRmxhdExpc3RbdGFyZ2V0SW5kZXhdLm5vZGUpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIHNob3VsZFByZXZlbnREZWZhdWx0OiB0cnVlLCB0YXJnZXRJbmRleDogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIHRhcmdldEluZGV4ID0gZmxhdExpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgICBpZiAoY3VycmVudEZvY3VzZWQgJiYgdGhpcy5zZWxlY3RNb2RlKCkgIT09ICdub25lJyAmJiB0aGlzLmNhblNlbGVjdE5vZGUoY3VycmVudEZvY3VzZWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNwYWNlS2V5U2VsZWN0aW9uKGN1cnJlbnRGb2N1c2VkLCBldmVudCk7XG4gICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgc2hvdWxkUHJldmVudERlZmF1bHQ6IHRydWUsIHRhcmdldEluZGV4OiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGN1cnJlbnRGb2N1c2VkICYmIHRoaXMuY2FuU2VsZWN0Tm9kZShjdXJyZW50Rm9jdXNlZCkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRW50ZXJLZXlTZWxlY3Rpb24oY3VycmVudEZvY3VzZWQsIGV2ZW50KTtcbiAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBzaG91bGRQcmV2ZW50RGVmYXVsdDogdHJ1ZSwgdGFyZ2V0SW5kZXg6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZCAmJiB0aGlzLnNlbGVjdE1vZGUoKSA9PT0gJ211bHRpcGxlJyAmJiB0aGlzLmNhblNlbGVjdE5vZGUoY3VycmVudEZvY3VzZWQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDdHJsRW50ZXJTZWxlY3Rpb24oY3VycmVudEZvY3VzZWQsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIHNob3VsZFByZXZlbnREZWZhdWx0OiB0cnVlLCB0YXJnZXRJbmRleDogbnVsbCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB7IGhhbmRsZWQsIHNob3VsZFByZXZlbnREZWZhdWx0LCB0YXJnZXRJbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBTcGFjZSBrZXkgc2VsZWN0aW9uXG4gICAqIEluIHNpbmdsZSBtb2RlOiByZXBsYWNlcyBzZWxlY3Rpb24gKGRlc2VsZWN0cyBhbGwsIHNlbGVjdHMgdGhpcyBub2RlKVxuICAgKiBJbiBtdWx0aXBsZSBtb2RlOiB0b2dnbGVzIHNlbGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTcGFjZUtleVNlbGVjdGlvbihub2RlOiBBWFRyZWVWaWV3Tm9kZSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Tm9kZShub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0TW9kZSgpO1xuXG4gICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAvLyBTaW5nbGUgbW9kZTogcmVwbGFjZSBzZWxlY3Rpb25cbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuZGVzZWxlY3RBbGxOb2RlcyhcbiAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROb2RlU2VsZWN0ZWQobm9kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGlwbGUgbW9kZTogdG9nZ2xlIHNlbGVjdGlvblxuICAgICAgY29uc3QgbmV3VmFsdWUgPSAhdGhpcy5nZXROb2RlU2VsZWN0ZWQobm9kZSk7XG4gICAgICB0aGlzLnNldE5vZGVTZWxlY3RlZChub2RlLCBuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldE5vZGVDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgICAgdGhpcy5ub2RlcygpLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICAgIHRoaXMuaWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuY2hpbGRyZW5GaWVsZCgpLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoTm9kZXMoKTtcbiAgICB0aGlzLm9uTm9kZVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBuYXRpdmVFdmVudDogZXZlbnQsXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgRW50ZXIga2V5IHNlbGVjdGlvblxuICAgKiBJbiBzaW5nbGUgbW9kZTogcmVwbGFjZXMgc2VsZWN0aW9uIChkZXNlbGVjdHMgYWxsLCBzZWxlY3RzIHRoaXMgbm9kZSlcbiAgICogSW4gbXVsdGlwbGUgbW9kZTogcmVwbGFjZXMgc2VsZWN0aW9uIChkZXNlbGVjdHMgYWxsLCBzZWxlY3RzIHRoaXMgbm9kZSBhbmQgcmVzcGVjdHMgc2VsZWN0aW9uQmVoYXZpb3IpXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUVudGVyS2V5U2VsZWN0aW9uKG5vZGU6IEFYVHJlZVZpZXdOb2RlLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3ROb2RlKG5vZGUpKSByZXR1cm47XG5cbiAgICBjb25zdCBtb2RlID0gdGhpcy5zZWxlY3RNb2RlKCk7XG5cbiAgICAvLyBFbnRlciBrZXkgYWx3YXlzIHJlcGxhY2VzIHNlbGVjdGlvbiAoZGVzZWxlY3RzIGFsbCBmaXJzdClcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlc2VsZWN0QWxsTm9kZXMoXG4gICAgICB0aGlzLm5vZGVzKCksXG4gICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICApO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIHRydWUpO1xuICAgIHRoaXMuc2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSwgZmFsc2UpO1xuXG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgICAvLyBSZXNwZWN0IHNlbGVjdGlvbkJlaGF2aW9yOiBjYXNjYWRlIHRvIGNoaWxkcmVuIGlmIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmNhc2NhZGVzVG9DaGlsZHJlbigpICYmIGNoaWxkcmVuICYmICF0aGlzLmlzTGVhZk9ubHlNb2RlKCkpIHtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUZpZWxkKCksXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBSZXNwZWN0IHNlbGVjdGlvbkJlaGF2aW9yOiB1cGRhdGUgcGFyZW50IHN0YXRlcyBpZiBpbnRlcm1lZGlhdGUgbW9kZVxuICAgICAgaWYgKHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSAmJiAhdGhpcy5pc0xlYWZPbmx5TW9kZSgpKSB7XG4gICAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlUGFyZW50U3RhdGVzKFxuICAgICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMuaGFzSW50ZXJtZWRpYXRlU3RhdGUoKSxcbiAgICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuRmllbGQoKSxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaE5vZGVzKCk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3QuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEN0cmwvQ21kICsgRW50ZXIga2V5IHNlbGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVDdHJsRW50ZXJTZWxlY3Rpb24obm9kZTogQVhUcmVlVmlld05vZGUsIGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNlbGVjdE5vZGUobm9kZSkpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXRoaXMuZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpO1xuICAgIHRoaXMuc2V0Tm9kZVNlbGVjdGVkKG5vZGUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldE5vZGVJbmRldGVybWluYXRlKG5vZGUsIGZhbHNlKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4obm9kZSk7XG4gICAgaWYgKHRoaXMuY2FzY2FkZXNUb0NoaWxkcmVuKCkgJiYgY2hpbGRyZW4gJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZWxlY3RBbGxDaGlsZHJlbihcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQoKSxcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGVybWVkaWF0ZVN0YXRlKCkgJiYgIXRoaXMuaXNMZWFmT25seU1vZGUoKSkge1xuICAgICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVQYXJlbnRTdGF0ZXMoXG4gICAgICAgIHRoaXMubm9kZXMoKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgdGhpcy5oYXNJbnRlcm1lZGlhdGVTdGF0ZSgpLFxuICAgICAgICB0aGlzLmlkRmllbGQoKSxcbiAgICAgICAgdGhpcy5jaGlsZHJlbkZpZWxkKCksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCgpLFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVGaWVsZCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hOb2RlcygpO1xuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdmFsdWUgaXMgYW4gRXZlbnRcbiAgICovXG4gIHByaXZhdGUgaXNFdmVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEV2ZW50IHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFdmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIGNvbnNpc3RlbnRseVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bWVzc2FnZX06YCwgZXJyb3IubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bWVzc2FnZX06YCwgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBSb290IGRyb3AgbGlzdCAtLT5cbjxkaXZcbiAgYXhGb2N1c1RyYXBcbiAgW2F4RHJvcExpc3RdPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gIFtzb3J0aW5nRGlzYWJsZWRdPVwiZmFsc2VcIlxuICBbaWRdPVwiZ2V0TGlzdElkKClcIlxuICBbYXR0ci5kYXRhLW5vZGUtaWRdPVwibnVsbFwiXG4gIGRyb3BMaXN0R3JvdXA9XCJheC10cmVlLXZpZXctbm9kZXNcIlxuICAoZHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgY2xhc3M9XCJheC10cmVlLXZpZXctZHJvcC1saXN0XCJcbiAgW2NsYXNzLmF4LXRyZWUtdmlldy1jYXJkXT1cImxvb2soKSA9PT0gJ2NhcmQnXCJcbiAgW2NsYXNzLmF4LXRyZWUtdmlldy13aXRoLWxpbmVzXT1cImxvb2soKSA9PT0gJ3dpdGgtbGluZSdcIlxuICByb2xlPVwiZ3JvdXBcIlxuPlxuICBAZm9yIChub2RlIG9mIG5vZGVzKCk7IHRyYWNrIGdldE5vZGVJZChub2RlKSkge1xuICAgIEBpZiAoZ2V0Tm9kZUhpZGRlbihub2RlKSAhPT0gdHJ1ZSkge1xuICAgICAgPGRpdlxuICAgICAgICBbYXhEcmFnXT1cImRyYWdCZWhhdmlvcigpICE9PSAnbm9uZSdcIlxuICAgICAgICBbZHJhZ0Rpc2FibGVkXT1cImlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSlcIlxuICAgICAgICBbZHJhZ0RhdGFdPVwibm9kZVwiXG4gICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LW5vZGVcIlxuICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtYWN0aXZlXT1cImFjdGl2ZU5vZGVJZCgpID09PSBnZXROb2RlSWQobm9kZSlcIlxuICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtc2VsZWN0ZWRdPVwiZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpXCJcbiAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWRpc2FibGVkXT1cImlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSlcIlxuICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtbG9hZGluZ109XCJnZXROb2RlTG9hZGluZyhub2RlKVwiXG4gICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1mb2N1c2VkXT1cImlzTm9kZUZvY3VzZWQoZ2V0Tm9kZUlkKG5vZGUpKVwiXG4gICAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGV2ZWxdPVwiZ2V0Tm9kZUFyaWFMZXZlbCgwKVwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZ2V0Tm9kZUFyaWFFeHBhbmRlZChub2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZ2V0Tm9kZUFyaWFTZWxlY3RlZChub2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiXG4gICAgICAgICAgaXNOb2RlRWZmZWN0aXZlbHlEaXNhYmxlZChub2RlKSB8fCAoaXNMZWFmT25seU1vZGUoKSAmJiAhaXNMZWFmTm9kZShub2RlKSkgPyAndHJ1ZScgOiBudWxsXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWNvbnRlbnRcIlxuICAgICAgICAgIFtheERyb3BMaXN0XT1cImRyYWdCZWhhdmlvcigpICE9PSAnbm9uZSdcIlxuICAgICAgICAgIFtpZF09XCInYXgtdHJlZS12aWV3LW5vZGUtZHJvcC0nICsgZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLW5vZGUtaWRdPVwiZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRyZWUtbm9kZS1pZF09XCJnZXROb2RlSWQobm9kZSlcIlxuICAgICAgICAgIFthdHRyLmRhdGEtZHJvcC10eXBlXT1cIidvbnRvLW5vZGUnXCJcbiAgICAgICAgICBkcm9wTGlzdEdyb3VwPVwiYXgtdHJlZS12aWV3LW5vZGVzXCJcbiAgICAgICAgICAoZHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcE9udG9Ob2RlKCRldmVudCwgbm9kZSlcIlxuICAgICAgICAgIChjbGljayk9XCJvbk5vZGVDbGlja0hhbmRsZShub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAoZGJsY2xpY2spPVwib25Ob2RlRG91YmxlQ2xpY2tIYW5kbGUobm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgKGZvY3VzKT1cIm9uTm9kZUZvY3VzKGdldE5vZGVJZChub2RlKSlcIlxuICAgICAgICAgIChibHVyKT1cImZvY3VzZWROb2RlSWQuc2V0KG51bGwpXCJcbiAgICAgICAgICBbdGFiaW5kZXhdPVwiaXNOb2RlRm9jdXNlZChnZXROb2RlSWQobm9kZSkpID8gMCA6IC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd0RyYWdIYW5kbGUoKSkge1xuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctZHJhZy1oYW5kbGVcIlxuICAgICAgICAgICAgICBheERyYWdIYW5kbGVcbiAgICAgICAgICAgICAgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAg4ouu4ouuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxheC1idXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LWV4cGFuZC10b2dnbGUgYXgtc21cIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlTm9kZShub2RlLCAkYW55KCRldmVudCkpXCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1oYXMtY2hpbGRyZW5dPVwic2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShub2RlKVwiXG4gICAgICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LWV4cGFuZGVkXT1cImdldE5vZGVFeHBhbmRlZChub2RlKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0Tm9kZUxvYWRpbmcobm9kZSlcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvdWxkU2hvd0V4cGFuZFRvZ2dsZShub2RlKSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGdldE5vZGVMb2FkaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAgIDxheC1pY29uPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtc3Bpbm5lciBmYS1zcGluIGF4LXRyZWUtdmlldy1sb2FkaW5nLXNwaW5uZXJcIj48L2k+XG4gICAgICAgICAgICAgIDwvYXgtaWNvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8YXgtaWNvbj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldE5vZGVFeHBhbmRlZChub2RlKSA/IGRpcmVjdGlvbkV4cGFuZGVkSWNvbigpIDogZGlyZWN0aW9uQ29sbGFwc2VkSWNvbigpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LXRvZ2dsZS1pY29uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2F4LWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9heC1idXR0b24+XG4gICAgICAgICAgQGlmIChub2RlVGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGUoKSFcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0VGVtcGxhdGVDb250ZXh0KG5vZGUsIDApXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd0NoZWNrYm94Rm9yTm9kZShub2RlKSkge1xuICAgICAgICAgICAgICA8YXgtY2hlY2stYm94XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldE5vZGVJbmRldGVybWluYXRlKG5vZGUpID8gbnVsbCA6IGdldE5vZGVTZWxlY3RlZChub2RlKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJ0b2dnbGVTZWxlY3Rpb24obm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2F4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoc2hvd0ljb25zKCkgJiYgZ2V0Tm9kZUljb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImdldE5vZGVJY29uKG5vZGUpXCIgY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1pY29uXCI+PC9pPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1sYWJlbFwiXG4gICAgICAgICAgICAgIFtheFRvb2x0aXBdPVwiZ2V0Tm9kZVRvb2x0aXAobm9kZSkgfHwgJydcIlxuICAgICAgICAgICAgICBbYXhUb29sdGlwRGlzYWJsZWRdPVwiIWdldE5vZGVUb29sdGlwKG5vZGUpXCJcbiAgICAgICAgICAgICAgW2F4VG9vbHRpcFBsYWNlbWVudF09XCIndG9wLXN0YXJ0J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldE5vZGVUaXRsZShub2RlKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgQGlmIChzaG93Q2hpbGRyZW5CYWRnZSgpICYmIChnZXROb2RlQ2hpbGRyZW5Db3VudChub2RlKSB8fCBnZXROb2RlQ2hpbGRyZW4obm9kZSk/Lmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1iYWRnZVwiPlxuICAgICAgICAgICAgICAgIDxheC1iYWRnZVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctY2hpbGRyZW4tYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgW3RleHRdPVwiKGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpID8/IGdldE5vZGVDaGlsZHJlbihub2RlKT8ubGVuZ3RoID8/IDApLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgID48L2F4LWJhZGdlPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChnZXROb2RlRXhwYW5kZWQobm9kZSkgJiYgZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImF4LXRyZWUtdmlldy1jaGlsZHJlblwiIHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoaWxkcmVuTGlzdFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjaGlsZHJlbjogZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpLCBwYXJlbnQ6IG5vZGUsIGxldmVsOiAxIH1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICB9XG48L2Rpdj5cblxuPCEtLSBSZWN1cnNpdmUgY2hpbGRyZW4gdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2NoaWxkcmVuTGlzdCBsZXQtY2hpbGRyZW49XCJjaGlsZHJlblwiIGxldC1wYXJlbnQ9XCJwYXJlbnRcIiBsZXQtbGV2ZWw9XCJsZXZlbFwiPlxuICA8ZGl2XG4gICAgW2F4RHJvcExpc3RdPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gICAgW2lkXT1cImdldExpc3RJZChwYXJlbnQpXCJcbiAgICBbYXR0ci5kYXRhLW5vZGUtaWRdPVwiZ2V0Tm9kZUlkKHBhcmVudClcIlxuICAgIGRyb3BMaXN0R3JvdXA9XCJheC10cmVlLXZpZXctbm9kZXNcIlxuICAgIChkcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudCwgcGFyZW50KVwiXG4gICAgY2xhc3M9XCJheC10cmVlLXZpZXctZHJvcC1saXN0XCJcbiAgICByb2xlPVwiZ3JvdXBcIlxuICA+XG4gICAgQGZvciAobm9kZSBvZiBjaGlsZHJlbjsgdHJhY2sgZ2V0Tm9kZUlkKG5vZGUpKSB7XG4gICAgICBAaWYgKGdldE5vZGVIaWRkZW4obm9kZSkgIT09IHRydWUpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtheERyYWddPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gICAgICAgICAgW2RyYWdEaXNhYmxlZF09XCJpc05vZGVFZmZlY3RpdmVseURpc2FibGVkKG5vZGUpXCJcbiAgICAgICAgICBbZHJhZ0RhdGFdPVwibm9kZVwiXG4gICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZVwiXG4gICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWFjdGl2ZV09XCJhY3RpdmVOb2RlSWQoKSA9PT0gZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtc2VsZWN0ZWRdPVwiZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpXCJcbiAgICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LW5vZGUtZGlzYWJsZWRdPVwiaXNOb2RlRWZmZWN0aXZlbHlEaXNhYmxlZChub2RlKVwiXG4gICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1ub2RlLWxvYWRpbmddPVwiZ2V0Tm9kZUxvYWRpbmcobm9kZSlcIlxuICAgICAgICAgIFtjbGFzcy5heC10cmVlLXZpZXctbm9kZS1mb2N1c2VkXT1cImlzTm9kZUZvY3VzZWQoZ2V0Tm9kZUlkKG5vZGUpKVwiXG4gICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxldmVsXT1cImdldE5vZGVBcmlhTGV2ZWwobGV2ZWwpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImdldE5vZGVBcmlhRXhwYW5kZWQobm9kZSlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZ2V0Tm9kZUFyaWFTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJcbiAgICAgICAgICAgIGlzTm9kZUVmZmVjdGl2ZWx5RGlzYWJsZWQobm9kZSkgfHwgKGlzTGVhZk9ubHlNb2RlKCkgJiYgIWlzTGVhZk5vZGUobm9kZSkpID8gJ3RydWUnIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWNvbnRlbnRcIlxuICAgICAgICAgICAgW2F4RHJvcExpc3RdPVwiZHJhZ0JlaGF2aW9yKCkgIT09ICdub25lJ1wiXG4gICAgICAgICAgICBbaWRdPVwiJ2F4LXRyZWUtdmlldy1ub2RlLWRyb3AtJyArIGdldE5vZGVJZChub2RlKVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW5vZGUtaWRdPVwiZ2V0Tm9kZUlkKG5vZGUpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHJlZS1ub2RlLWlkXT1cImdldE5vZGVJZChub2RlKVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWRyb3AtdHlwZV09XCInb250by1ub2RlJ1wiXG4gICAgICAgICAgICBkcm9wTGlzdEdyb3VwPVwiYXgtdHJlZS12aWV3LW5vZGVzXCJcbiAgICAgICAgICAgIChkcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wT250b05vZGUoJGV2ZW50LCBub2RlKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Ob2RlQ2xpY2tIYW5kbGUobm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoZGJsY2xpY2spPVwib25Ob2RlRG91YmxlQ2xpY2tIYW5kbGUobm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Ob2RlRm9jdXMoZ2V0Tm9kZUlkKG5vZGUpKVwiXG4gICAgICAgICAgICAoYmx1cik9XCJmb2N1c2VkTm9kZUlkLnNldChudWxsKVwiXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiaXNOb2RlRm9jdXNlZChnZXROb2RlSWQobm9kZSkpID8gMCA6IC0xXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHNob3VsZFNob3dEcmFnSGFuZGxlKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1kcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgYXhEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg4ouu4ouuXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxheC1idXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctZXhwYW5kLXRvZ2dsZSBheC1zbVwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZU5vZGUobm9kZSwgJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtdHJlZS12aWV3LWhhcy1jaGlsZHJlbl09XCJzaG91bGRTaG93RXhwYW5kVG9nZ2xlKG5vZGUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LXRyZWUtdmlldy1leHBhbmRlZF09XCJnZXROb2RlRXhwYW5kZWQobm9kZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0Tm9kZUxvYWRpbmcobm9kZSlcIlxuICAgICAgICAgICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJzaG91bGRTaG93RXhwYW5kVG9nZ2xlKG5vZGUpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKGdldE5vZGVMb2FkaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgPGF4LWljb24+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXNwaW5uZXIgZmEtc3BpbiBheC10cmVlLXZpZXctbG9hZGluZy1zcGlubmVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGF4LWljb24+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Tm9kZUV4cGFuZGVkKG5vZGUpID8gZGlyZWN0aW9uRXhwYW5kZWRJY29uKCkgOiBkaXJlY3Rpb25Db2xsYXBzZWRJY29uKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy10b2dnbGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9heC1idXR0b24+XG5cbiAgICAgICAgICAgIEBpZiAobm9kZVRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZSgpIVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFRlbXBsYXRlQ29udGV4dChub2RlLCBsZXZlbClcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgQGlmIChzaG91bGRTaG93Q2hlY2tib3hGb3JOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgPGF4LWNoZWNrLWJveFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cmVlLXZpZXctY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0Tm9kZUluZGV0ZXJtaW5hdGUobm9kZSkgPyBudWxsIDogZ2V0Tm9kZVNlbGVjdGVkKG5vZGUpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImdldE5vZGVJbmRldGVybWluYXRlKG5vZGUpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJ0b2dnbGVTZWxlY3Rpb24obm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvYXgtY2hlY2stYm94PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0ljb25zKCkgJiYgZ2V0Tm9kZUljb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZ2V0Tm9kZUljb24obm9kZSlcIiBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWljb25cIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRyZWUtdmlldy1ub2RlLWxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXhUb29sdGlwXT1cImdldE5vZGVUb29sdGlwKG5vZGUpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbYXhUb29sdGlwRGlzYWJsZWRdPVwiIWdldE5vZGVUb29sdGlwKG5vZGUpXCJcbiAgICAgICAgICAgICAgICBbYXhUb29sdGlwUGxhY2VtZW50XT1cIid0b3Atc3RhcnQnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGdldE5vZGVUaXRsZShub2RlKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0NoaWxkcmVuQmFkZ2UoKSAmJiAoZ2V0Tm9kZUNoaWxkcmVuQ291bnQobm9kZSkgfHwgZ2V0Tm9kZUNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC10cmVlLXZpZXctbm9kZS1iYWRnZVwiPlxuICAgICAgICAgICAgICAgICAgPGF4LWJhZGdlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtdHJlZS12aWV3LWNoaWxkcmVuLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiKGdldE5vZGVDaGlsZHJlbkNvdW50KG5vZGUpID8/IGdldE5vZGVDaGlsZHJlbihub2RlKT8ubGVuZ3RoID8/IDApLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICAgPjwvYXgtYmFkZ2U+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGdldE5vZGVFeHBhbmRlZChub2RlKSAmJiBnZXROb2RlQ2hpbGRyZW4obm9kZSk/Lmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC10cmVlLXZpZXctY2hpbGRyZW5cIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpbGRyZW5MaXN0XCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY2hpbGRyZW46IGdldE5vZGVDaGlsZHJlbihub2RlKSwgcGFyZW50OiBub2RlLCBsZXZlbDogbGV2ZWwgKyAxIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=","import { NgModule } from '@angular/core';\nimport { AXTreeViewComponent } from './tree-view.component';\nimport * as i0 from \"@angular/core\";\nexport class AXTreeViewModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.9\", ngImport: i0, type: AXTreeViewModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [AXTreeViewComponent],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvdHJlZS12aWV3L3NyYy9saWIvdHJlZS12aWV3Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUs1RCxNQUFNLE9BQU8sZ0JBQWdCOzhHQUFoQixnQkFBZ0I7K0dBQWhCLGdCQUFnQixZQUZqQixtQkFBbUI7K0dBRWxCLGdCQUFnQixZQUZqQixtQkFBbUI7OzJGQUVsQixnQkFBZ0I7a0JBSDVCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQy9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYVHJlZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RyZWUtdmlldy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQVhUcmVlVmlld0NvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJlZVZpZXdNb2R1bGUge31cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvbXBvbmVudHMtdHJlZS12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcG9uZW50cy90cmVlLXZpZXcvc3JjL2Fjb3JleC1jb21wb25lbnRzLXRyZWUtdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}