@ninebone/datagrid 0.1.3 โ 0.1.6
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.
- package/README.md +5 -0
- package/dist/css/nine-table.css +5 -0
- package/dist/nine-table.js +170 -159
- package/dist/nine-table.js.map +1 -1
- package/dist/nine-table.umd.js +8 -8
- package/dist/nine-table.umd.js.map +1 -1
- package/package.json +4 -9
package/dist/nine-table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","$el","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","#updateRowCount","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","sanitize","val","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","colEl","resolve","$trs","matrixRows","n","callback","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","activeParent","$parent","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#updateRowState","#cell","#tr","#attr","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","#grd","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","formattedData","keyName","multi","selectedKeys","#separator","kIndex","chkIndex","#selectRow","currentValue","$btn","btnRect","isDropDown","#isOpen","separator","#isPanelBelow","#calculatePanelHeight","#calculatePanelLeft","#initData","#checkRow","#returnRow","#onKeydown_input","#onKeydown","CellCombo","#targetBtn","#getDisplayText","#validateInput","#multi","keys","#multiSeparator","list","#togglePanel","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","panelHeight","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value, updateState = true) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && updateState && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ ์์ ID ๋งคํ ๊ด๋ฆฌ์ฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐ก ์ฐ์ฐ์ ์์ ๋ฐ์\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n this.#sheet.querySelectorAll(\"cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ ์ ์ฒด totalCount์์ ์ฐจ์งํ๋ ๋น์จ(ratio)๋งํผ ์ค์ ์คํฌ๋กค ์ต๋ ๋์ด์ ๊ณฑํด์ค\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n this.#updateRowCount();\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#host;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\n\t\tif (this.#host.tagName === \"NINE-TABLE-SIMPLE\") {\n\t\t\tc1 = 1;\n\t\t\tc2 = 10;\n\t\t}\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst colEl = this.#sheet.querySelector(`col[data-col=\"${col}\"]`);\n\t\t\t\t\t\tif (colEl.style.display !== 'none') {\n\t\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst sanitize = (val) => (!Number.isFinite(val) ? -1 : val);\n\n\t\tthis.#range = {\n\t\t\tstartRow: sanitize(r1),\n\t\t\tstartCol: sanitize(c1),\n\t\t\tendRow: sanitize(r2),\n\t\t\tendCol: sanitize(c2)\n\t\t};\n\n\t\t//trace.log(this.#range);\n\n\t\tthis.render();\n\t}\n\n\tclear = () => {\n\t\tthis.#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\t};\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell) || !this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\n\t\t\tconst cell = e.target.closest('td,th');\n\t\t\tif (!cell || !this.#sheet.contains(cell)) return;\n\n\t\t\tif (this.#host.tagName === 'NINE-TABLE-SIMPLE') {\n\t\t\t\tif ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t} else if ([\"Space\"].includes(e.code)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n //cell.style.width = `${w}px`;\n //cell.style.minWidth = `${w}px`;\n //cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.selection.clear();\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 4;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n //cell.style.width = widthVal;\n //cell.style.minWidth = widthVal;\n //cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n col = {\n // 1. ํน์ ์ปฌ๋ผ์ ๋๋น ์ค์ (ColResizer ํ์ฉ)\n setWidth: (colIndex, width, containerType = null) => {\n const targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"]`));\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n },\n\n // 2. ํน์ ์ปฌ๋ผ์ ํ์ฌ ๋๋น ๊ฐ์ ธ์ค๊ธฐ\n getWidth: (colIndex) => {\n const colEl = this.#sheet.querySelector(`table colgroup col[data-col=\"${colIndex}\"]`);\n if (!colEl) return 0;\n return parseInt(colEl.getAttribute('width') || colEl.style.width, 10) || 0;\n },\n measureAutoFitColumnWidth: (cell, tbodyCell) => {\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n let maxTextWidth = 32;\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n return maxTextWidth;\n },\n // 3. ํน์ ์ปฌ๋ผ ์๋ ๋ง์ถค (์๊น ๋ถ๋ฆฌํ measureAutoFitColumnWidth ์ฐ๋)\n autoFit: (colIndex) => {\n const cell = this.#sheet.querySelector(`thead th[data-col=\"${colIndex}\"]`);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${colIndex}\"]`);\n\n if (!cell || !tbodyCell) return;\n\n this.#host.execute(() => {\n const calculatedWidth = this.col.measureAutoFitColumnWidth(cell, tbodyCell);\n if (calculatedWidth !== null) {\n this.col.setWidth(colIndex, calculatedWidth);\n }\n });\n },\n\n // 4. ์ปฌ๋ผ ํ์/์จ๊น ์ฒ๋ฆฌ\n setVisible: (colIndex, isVisible) => {\n const targets = this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"], th[data-col=\"${colIndex}\"], td[data-col=\"${colIndex}\"]`);\n targets.forEach(el => {\n el.style.display = isVisible ? '' : 'none';\n });\n this.#sheet.rowManager?.refresh();\n }\n };\n\n row = {\n at: () => {\n if (this.#sheet.selection.minRow < 0) return -1;\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length);\n },\n focus: async (index, callback) => {\n // 1. ํ๋ฉด์ ์ ๋ณด์ด๋ฉด moveTo ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ\n if (!this.#sheet.row.isVisible(index)) {\n await new Promise((resolve) => {\n this.#sheet.row.moveTo(index, () => {\n resolve();\n });\n });\n } else {\n // 2. ์ด๋ฏธ ๋ณด์ด๋๋ผ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ ํ ํ
ํฌ ์๋ณด (requestAnimationFrame)\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n // 3. ๋ ๋๋ง์ด ์์ ํ ์์ ํ๋ ์์ ์ DOM ์กฐํ ๋ฐ ์ ํ ์ฒ๋ฆฌ\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n if (matrixRows.length === 0 || cols.length === 0) return;\n\n const result = this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n\n if (typeof callback === 'function') {\n callback();\n }\n\n return result;\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n if (typeof callback === 'function') callback();\n } else {\n this.#sheet.scrollTo(index, () => {\n if (typeof callback === 'function') callback();\n });\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n const activeParent = (v) => {\n\n if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n const $parent = this.#host.closest(\"nine-table-filter-panel, cell-combo-panel\");\n if ($parent) {\n v ? $parent.classList.add('active') : $parent.classList.remove('active');\n }\n }\n };\n\n activeParent(true);\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += Math.max($tr.offsetHeight || 0, 28);\n this.#template.heights.push($tr.offsetHeight || 0);\n //if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n // trace.log(this.#host, $tr.offsetHeight, $tr.clientHeight);\n //}\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n });\n\n this.querySelector(`.ng-container-body table`).remove();\n\n activeParent(false);\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n if (this.#host.classList.contains(\"combo-list\")) return;\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', (e) => {\n this.querySelectorAll(\"nine-table-filter-panel,cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.setAttribute(\"tabindex\", \"0\");\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ ๋์ด๋ฅผ ๊ธฐ์ตํ ๋ณ์\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์คํ์ผ ๋ฐ์ดํฐ๋ฅผ provider ๊ฐ์ฒด ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ (์ผ๋ฐ ๋ฉ์๋ ์ถ์ฝํ ์ฌ์ฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด๋ฆฌํ ๋ค์์คํ์ด์ค๋ค์ ๋ฐฐ์ด๋ก ์ ์\n const namespaces = [\"col\", \"row\"]; // ๋์ค์ \"col\", \"cell\" ๋ฑ๋ง ์ถ๊ฐํ๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget #updateRowState() {\n\t\treturn this.#cell.getAttribute(\"update-row-state\") === \"false\";\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\t//update-row-state\n\t\tthis.#host.data.setValue(row, bindKey, v, this.#updateRowState);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\nimport {NINE_TABLE} from \"@\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\t#grd;\n\t#sheet;\n\t#separator;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\n\t\tthis.#grd = this.querySelector(\"nine-table-simple\");\n\t\tsetTimeout(() => {\n\t\t\tthis.#sheet = this.#grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\tthis.#initEvents();\n\t\t})\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi) => {\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.closest(\"th,td\").getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\t//grd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tconst sheet = grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\n\t\tsheet.source.table.querySelectorAll('colgroup col, tbody td').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n\t\t\tsetTimeout(() => {\n\n\t\t\t\tthis.style.opacity = \"\";\n\t\t\t\tthis.classList.add(\"active\");\n\n\t\t\t\tgrd.shadowRoot.querySelectorAll('colgroup col').forEach(($el, idx) => {\n\t\t\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\t\t\tif (col >= 2 && $el.style.display !== \"none\") {\n\t\t\t\t\t\tsheet.col.autoFit(col);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\t\tif (multi) {\n\t\t\t\t\tconst selectedKeys = this.#parent.value ? String(this.#parent.value).split(this.#separator).map(s => s.trim()) : [];\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\t\t\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\t\t\t\trecord.v[chkIndex] = (selectedKeys.includes(String(record.v[kIndex]))) ? \"Y\" : \"N\";\n\t\t\t\t\t});\n\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === selectedKeys[0];\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t} else {\n\t\t\t\t\tconst currentValue = this.#parent.value;\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === currentValue;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t}\n\t\t\t})\n\t\t}, {once: true});\n\n\t\tif (multi && this.#parent.value) {\n\t\t\t/**\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t\t\t*/\n\t\t}\n\n\t\tif (formattedData.length * this.#sheet.template.height >= this.offsetHeight) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tgrd.data.set(formattedData);\n\n\n\t};\n\n\t#isPanelBelow = ($btn) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\t\tconst spaceBelow = sheetRect.bottom - btnRect.bottom;\n\t\tconst spaceAbove = btnRect.top - sheetRect.top;\n\n\t\treturn spaceBelow >= spaceAbove;\n\t};\n\n\t#calculatePanelHeight = ($btn, isDropDown = 0) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet h = (isDropDown ? (sheetRect.bottom - btnRect.bottom) : (btnRect.top - sheetRect.top)) - 5;\n\n\t\treturn h;\n\t}\n\n\t#calculatePanelLeft = ($btn) => {\n\n\t\tconst $cell = $btn.closest(\"th,td\");\n\t\tconst $sheet = $cell.closest(\".ng-sheet-body\");\n\n\n\t\tconst cellRect = $cell.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet left = cellRect.left - sheetRect.left;\n\n\t\tconst panelWidth = this.offsetWidth;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 2);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\treturn left;\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.#separator = separator;\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.style.opacity = \"0\";\n\n\t\tsetTimeout(() => {\n\t\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\t\tif (!grd || !dataSource) return;\n\n\t\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\t\tconst sheet = parent.closest(\".ng-sheet-body\");\n\t\t\tconst btnRect = parent.getBoundingClientRect();\n\t\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\t\tconst isDropDown = this.#isPanelBelow(parent);\n\t\t\tconst h = this.#calculatePanelHeight(parent, isDropDown);\n\t\t\tconst l = this.#calculatePanelLeft(parent);\n\t\t\tconst t = isDropDown ? (btnRect.bottom - sheetRect.top) : (btnRect.top - sheetRect.top - h);\n\n\t\t\tthis.style.height = `${h}px`;\n\t\t\tthis.style.left = `${l}px`;\n\t\t\tthis.style.top = `${t}px`;\n\t\t\t//this.style.opacity = \"\";\n\n\t\t\tif (multi) {\n\t\t\t\tthis.classList.add(\"multi\");\n\t\t\t\tthis.#grd.classList.add(\"multi\");\n\t\t\t} else {\n\t\t\t\tthis.classList.remove(\"multi\");\n\t\t\t\tthis.#grd.classList.remove(\"multi\");\n\t\t\t}\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi);\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\n\n\n\n\t#onClick = (e) => {\n\t\tconst $cell = e.target.closest(\"th,td\");\n\t\tif (this.#grd.classList.contains(\"multi\")) {\n\t\t\tconst index = parseInt($cell?.dataset.index, 10);\n\t\t\tthis.#checkRow(index);\n\t\t}\n\t\telse {\n\t\t\tconst col = parseInt($cell?.dataset.col, 10);\n\n\t\t\tif (col >= 2) {\n\t\t\t\tthis.#returnRow();\n\t\t\t}\n\t\t}\n\t}\n\n\t#onKeydown_input = (e) => {\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst index = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t} else {\n\t\t\t\t\tthis.#selectRow(index)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tthis.#selectRow(this.#grd.row.at());\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t#onKeydown = (e) => {\n\t\tlet index;\n\t\tswitch (e.code) {\n\t\t\tcase \"Escape\":\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (this.classList.contains(\"multi\")) {\n\t\t\t\t\tthis.#onOk();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#returnRow();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tif (this.classList.contains(\"expand\")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.querySelector(\"input[type='text']\").focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tindex = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\te.preventDefault();\n\t\t\t\tif ([\"TH\",\"TD\"].includes(e.target.tagName)) {\n\t\t\t\t\tthis.#checkRow(this.#grd.row.at());\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#onOk = () => {\n\n\t\tconst fields = this.#grd.fields.get();\n\t\tconst kIndex = fields.indexOf(\"k\");\n\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\tconst arr = [];\n\t\tthis.#sheet.view.getArray().forEach(o => {\n\t\t\tif (o.v[chkIndex] === \"Y\") {\n\t\t\t\tarr.push(o.v[kIndex]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = arr.join(this.#separator);\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\tthis.close();\n\t}\n\n\t#returnRow = () => {\n\t\tconst index = this.#grd.row.at();\n\n\t\tif (index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#parent.value = record.k;\n\t\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t#checkRow = (index) => {\n\n\t\tif (this.#grd.classList.contains(\"multi\") && index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#grd.data.setValue(record.m._[NINE_TABLE.META.INDEX.ROWID], \"CHK\", record.CHK === \"Y\" ? \"N\" : \"Y\");\n\n\t\t\tthis.#grd.refresh();\n\t\t}\n\t};\n\n\t#selectRow = (index) => {\n\t\tif (index !== -1) {\n\t\t\tthis.#sheet.row.focus(index, () => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst cell = this.#sheet.querySelector(`tr[data-index=\"${index}\"] td[data-col=\"2\"]`);\n\t\t\t\t\tthis.#sheet.navigation.currentCell = cell;\n\t\t\t\t\tcell.focus();\n\t\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sheet.row.focus(-1, () => {\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#sheet.selection.clear();\n\n\t\t\t\tthis.#sheet.navigation.currentCell = this.#sheet.querySelector(`tr[data-index=\"0\"] td[data-col=\"2\"]`);\n\t\t\t\tthis.#sheet.focus();\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t});\n\t\t}\n\t}\n\n\t#onSelectAll = (e) => {\n\n\t\tconst chkIdx = this.#grd.fields.get().indexOf(\"CHK\");\n\n\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\trecord.v[chkIdx] = e.target.checked ? \"Y\" : \"N\";\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t};\n\n\n\t#onInput = (e) => {\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#sheet.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#grd.data.getArray();\n\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\tconst colnm = \"tmp1\";\n\t\t\tconst data2Idx = fields.indexOf(colnm);\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#sheet.filtering.set({\n\t\t\t\t[colnm]: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\".search-input\").addEventListener(\"keydown\", this.#onKeydown_input);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tthis.#sheet.addEventListener(\"keydown\", this.#onKeydown);\n\t\tthis.#sheet.addEventListener(\"click\", this.#onClick);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <label for=\"chkAll\"><input id=\"chkAll\" type=\"checkbox\" checked><span>Select All</span></label>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t#init = () => {\n\t\tthis.#renderer();\n\n\t\tthis.#keyName = this.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = this.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = this.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = this.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\n\n\t\tthis.cell.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Space\"].includes(e.code)) {\n\t\t\t\tthis.#togglePanel();\n\t\t\t}\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","$el","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","#updateRowCount","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","sanitize","val","#range","root","elements","clientX","clientY","allCells","rect","targetCell","#getCellFromPoint","targetTr","#lastMatrixRow","#lastCol","#startRow","#startCol","#onMouseMove","mainZone","#onMouseUp","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","colEl","resolve","$trs","matrixRows","n","callback","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","activeParent","$parent","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#updateRowState","#cell","#tr","#attr","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","#grd","activeColumnCount","selectedKeys","kIndex","chkIndex","#selectRow","currentValue","formattedData","#EXPAND_ROW_COUNT","$btn","btnRect","h1","isDropDown","h2","items","#isPanelBelow","#calculatePanelHeight","#calculatePanelLeft","#initData","#checkRow","#returnRow","#onKeydown_input","#onKeydown","CellCombo","#getDisplayText","#validateInput","keys","list","#togglePanel","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","panelHeight","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value, updateState = true) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && updateState && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ ์์ ID ๋งคํ ๊ด๋ฆฌ์ฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐ก ์ฐ์ฐ์ ์์ ๋ฐ์\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n this.#sheet.querySelectorAll(\"cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ ์ ์ฒด totalCount์์ ์ฐจ์งํ๋ ๋น์จ(ratio)๋งํผ ์ค์ ์คํฌ๋กค ์ต๋ ๋์ด์ ๊ณฑํด์ค\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n this.#updateRowCount();\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#host;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\n\t\tif (this.#host.tagName === \"NINE-TABLE-SIMPLE\") {\n\t\t\tc1 = 1;\n\t\t\tc2 = 10;\n\t\t}\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst colEl = this.#sheet.querySelector(`col[data-col=\"${col}\"]`);\n\t\t\t\t\t\tif (colEl.style.display !== 'none') {\n\t\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst sanitize = (val) => (!Number.isFinite(val) ? -1 : val);\n\n\t\tthis.#range = {\n\t\t\tstartRow: sanitize(r1),\n\t\t\tstartCol: sanitize(c1),\n\t\t\tendRow: sanitize(r2),\n\t\t\tendCol: sanitize(c2)\n\t\t};\n\n\t\t//trace.log(this.#range);\n\n\t\tthis.render();\n\t}\n\n\tclear = () => {\n\t\tthis.#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\t};\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#lastMatrixRow;\n\t#lastCol;\n\t#startRow;\n\t#startCol;\n\t//#dragStart;\n\n\t#getCellFromPoint = (clientX, clientY) => {\n\t\tconst root = this.#sheet.getRootNode();\n\t\tif (root && typeof root.elementsFromPoint === 'function') {\n\t\t\tconst elements = root.elementsFromPoint(clientX, clientY);\n\t\t\tfor (const el of elements) {\n\t\t\t\tconst c = el.closest('td, th');\n\t\t\t\tif (c && this.#sheet.contains(c) && c.dataset.row !== undefined) {\n\t\t\t\t\treturn c;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\tfor (const c of allCells) {\n\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\tif (\n\t\t\t\tclientX >= rect.left &&\n\t\t\t\tclientX <= rect.right &&\n\t\t\t\tclientY >= rect.top &&\n\t\t\t\tclientY <= rect.bottom\n\t\t\t) {\n\t\t\t\treturn c;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\t#onMouseMove = (moveEvent) => {\n\n\t\t//if (!this.#dragStart) return;\n\n\t\tconst targetCell = this.#getCellFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\tif (!targetCell) return;\n\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\tconst targetTr = targetCell.closest('tr');\n\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\tif (endRow < 0) return;\n\t\tif (this.#lastMatrixRow === endRow && this.#lastCol === endCol) return;\n\n\t\t//trace.log(moveEvent);\n\n\t\tthis.#lastMatrixRow = endRow;\n\t\tthis.#lastCol = endCol;\n\n\t\tthis.setRange(this.#startRow, this.#startCol, endRow, endCol);\n\t};\n\n\t#onMouseUp = () => {\n\t\t//this.#dragStart = false;\n\n\t\tdocument.removeEventListener('mousemove', this.#onMouseMove);\n\n\t\t//this.#sheet.style.userSelect = '';\n\t\t//this.#sheet.style.webkitUserSelect = '';\n\n\n\t\t//document.removeEventListener('mouseup', this.#onMouseUp);\n\t};\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocument.addEventListener('mouseup', this.#onMouseUp);\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\n\t\t\tif (e.button !== 0) return;\n\n\t\t\t/**\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#dragStart = true;\n\t\t\t}, 100);\n\t\t\t*/\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tthis.#startRow = startRow;\n\t\t\tthis.#startCol = startCol;\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tthis.#lastMatrixRow = startRow;\n\t\t\tthis.#lastCol = startCol;\n\n\t\t\t// ๋๋๊ทธ๊ฐ ์์๋ ๋๋ง document์ move/up ๋ฆฌ์ค๋๋ฅผ ๋ถ์ฌ ๋ญ๋น๋ฅผ ์ค์ด๊ณ ํ์คํ๊ฒ ์ถ์ \n\t\t\tdocument.addEventListener('mousemove', this.#onMouseMove);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell) || !this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\n\t\t\tconst cell = e.target.closest('td,th');\n\t\t\tif (!cell || !this.#sheet.contains(cell)) return;\n\n\t\t\tif (this.#host.tagName === 'NINE-TABLE-SIMPLE') {\n\t\t\t\tif ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t} else if ([\"Space\"].includes(e.code)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n //cell.style.width = `${w}px`;\n //cell.style.minWidth = `${w}px`;\n //cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus({ preventScroll: true });\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.selection.clear();\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 4;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n //cell.style.width = widthVal;\n //cell.style.minWidth = widthVal;\n //cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n col = {\n // 1. ํน์ ์ปฌ๋ผ์ ๋๋น ์ค์ (ColResizer ํ์ฉ)\n setWidth: (colIndex, width, containerType = null) => {\n const targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"]`));\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n },\n\n // 2. ํน์ ์ปฌ๋ผ์ ํ์ฌ ๋๋น ๊ฐ์ ธ์ค๊ธฐ\n getWidth: (colIndex) => {\n const colEl = this.#sheet.querySelector(`table colgroup col[data-col=\"${colIndex}\"]`);\n if (!colEl) return 0;\n return parseInt(colEl.getAttribute('width') || colEl.style.width, 10) || 0;\n },\n measureAutoFitColumnWidth: (cell, tbodyCell) => {\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n let maxTextWidth = 32;\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n return maxTextWidth;\n },\n // 3. ํน์ ์ปฌ๋ผ ์๋ ๋ง์ถค (์๊น ๋ถ๋ฆฌํ measureAutoFitColumnWidth ์ฐ๋)\n autoFit: (colIndex) => {\n const cell = this.#sheet.querySelector(`thead th[data-col=\"${colIndex}\"]`);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${colIndex}\"]`);\n\n if (!cell || !tbodyCell) return;\n\n this.#host.execute(() => {\n const calculatedWidth = this.col.measureAutoFitColumnWidth(cell, tbodyCell);\n if (calculatedWidth !== null) {\n this.col.setWidth(colIndex, calculatedWidth);\n }\n });\n },\n\n // 4. ์ปฌ๋ผ ํ์/์จ๊น ์ฒ๋ฆฌ\n setVisible: (colIndex, isVisible) => {\n const targets = this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"], th[data-col=\"${colIndex}\"], td[data-col=\"${colIndex}\"]`);\n targets.forEach(el => {\n el.style.display = isVisible ? '' : 'none';\n });\n this.#sheet.rowManager?.refresh();\n }\n };\n\n row = {\n at: () => {\n if (this.#sheet.selection.minRow < 0) return -1;\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length);\n },\n focus: async (index, callback) => {\n // 1. ํ๋ฉด์ ์ ๋ณด์ด๋ฉด moveTo ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ\n if (!this.#sheet.row.isVisible(index)) {\n await new Promise((resolve) => {\n this.#sheet.row.moveTo(index, () => {\n resolve();\n });\n });\n } else {\n // 2. ์ด๋ฏธ ๋ณด์ด๋๋ผ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ ํ ํ
ํฌ ์๋ณด (requestAnimationFrame)\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n // 3. ๋ ๋๋ง์ด ์์ ํ ์์ ํ๋ ์์ ์ DOM ์กฐํ ๋ฐ ์ ํ ์ฒ๋ฆฌ\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n if (matrixRows.length === 0 || cols.length === 0) return;\n\n const result = this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n\n if (typeof callback === 'function') {\n callback();\n }\n\n return result;\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n if (typeof callback === 'function') callback();\n } else {\n this.#sheet.scrollTo(index, () => {\n if (typeof callback === 'function') callback();\n });\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n const activeParent = (v) => {\n\n if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n const $parent = this.#host.closest(\"nine-table-filter-panel, cell-combo-panel\");\n if ($parent) {\n v ? $parent.classList.add('active') : $parent.classList.remove('active');\n }\n }\n };\n\n activeParent(true);\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += Math.max($tr.offsetHeight || 0, 28);\n this.#template.heights.push($tr.offsetHeight || 0);\n //if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n // trace.log(this.#host, $tr.offsetHeight, $tr.clientHeight);\n //}\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n });\n\n this.querySelector(`.ng-container-body table`).remove();\n\n activeParent(false);\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n if (this.#host.classList.contains(\"combo-list\")) return;\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', (e) => {\n this.querySelectorAll(\"nine-table-filter-panel,cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.setAttribute(\"tabindex\", \"0\");\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ ๋์ด๋ฅผ ๊ธฐ์ตํ ๋ณ์\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์คํ์ผ ๋ฐ์ดํฐ๋ฅผ provider ๊ฐ์ฒด ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ (์ผ๋ฐ ๋ฉ์๋ ์ถ์ฝํ ์ฌ์ฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด๋ฆฌํ ๋ค์์คํ์ด์ค๋ค์ ๋ฐฐ์ด๋ก ์ ์\n const namespaces = [\"col\", \"row\"]; // ๋์ค์ \"col\", \"cell\" ๋ฑ๋ง ์ถ๊ฐํ๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget #updateRowState() {\n\t\treturn this.#cell.getAttribute(\"update-row-state\") === \"false\";\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\t//update-row-state\n\t\tthis.#host.data.setValue(row, bindKey, v, this.#updateRowState);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row) {\n\t\treturn super.getExprValue(expr, data, row);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#EXPAND_ROW_COUNT = 10;\n\n\t#parent;\n\t#grd;\n\t#sheet;\n\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\n\t\tthis.#grd = this.querySelector(\"nine-table-simple\");\n\t\tsetTimeout(() => {\n\t\t\tthis.#sheet = this.#grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\tthis.#initEvents();\n\t\t})\n\t}\n\n\t#initData = (formattedData) => {\n\n\t\tif (!this.#grd || !this.#parent.dataSource || this.#parent.dataSource.length === 0) return;\n\n\t\tconst activeColumnCount = this.#parent.items.length || 1;\n\n\t\tthis.#sheet.source.table.querySelectorAll('colgroup col, tbody td').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.querySelectorAll('table colgroup col').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\n\t\tthis.#grd.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n\t\t\tsetTimeout(() => {\n\n\t\t\t\tthis.style.opacity = \"\";\n\t\t\t\tthis.classList.add(\"active\");\n\n\t\t\t\tthis.#sheet.querySelectorAll('colgroup col').forEach(($el, idx) => {\n\t\t\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\t\t\tif (col >= 2 && $el.style.display !== \"none\") {\n\t\t\t\t\t\tthis.#sheet.col.autoFit(col);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\t\tif (this.#parent.multi) {\n\t\t\t\t\tconst selectedKeys = this.#parent.value ? String(this.#parent.value).split(this.#parent.separator).map(s => s.trim()) : [];\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\t\t\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\t\t\t\trecord.v[chkIndex] = (selectedKeys.includes(String(record.v[kIndex]))) ? \"Y\" : \"N\";\n\t\t\t\t\t});\n\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === selectedKeys[0];\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t} else {\n\t\t\t\t\tconst currentValue = this.#parent.value;\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === currentValue;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t}\n\t\t\t})\n\t\t}, {once: true});\n\n\t\tif (formattedData.length > this.#EXPAND_ROW_COUNT) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tthis.#grd.data.set(formattedData);\n\t};\n\n\t#isPanelBelow = ($btn) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\t\tconst spaceBelow = sheetRect.bottom - btnRect.bottom;\n\t\tconst spaceAbove = btnRect.top - sheetRect.top;\n\n\t\treturn spaceBelow >= spaceAbove;\n\t};\n\n\t#calculatePanelHeight = ($btn, isDropDown, rows) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tconst searchInputHeight = 32;\n\t\tconst h1 = (isDropDown ? (sheetRect.bottom - btnRect.bottom) : (btnRect.top - sheetRect.top)) - 5;\n\t\tconst h2 = (rows * this.#sheet.template.height) + (rows > this.#EXPAND_ROW_COUNT ? searchInputHeight : 0) + 2;\n\n\t\treturn Math.min(h1, h2);\n\t}\n\n\t#calculatePanelLeft = ($btn) => {\n\n\t\tconst $cell = $btn.closest(\"th,td\");\n\t\tconst $sheet = $cell.closest(\".ng-sheet-body\");\n\n\n\t\tconst cellRect = $cell.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet left = cellRect.left - sheetRect.left;\n\n\t\tconst panelWidth = this.offsetWidth;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 2);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\treturn left;\n\t};\n\n\topen = (parent) => {\n\t\tthis.#parent = parent;\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.style.opacity = \"0\";\n\n\t\tlet items = this.#parent.items;\n\t\tif (items.length === 0) {\n\t\t\titems.push(this.#parent.valueName);\n\t\t}\n\n\t\tconst formattedData = this.#parent.dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: this.#parent.keyName && item[this.#parent.keyName] !== undefined ? item[this.#parent.keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\titems.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tsetTimeout(() => {\n\n\t\t\tif (!this.#grd || !this.#parent.dataSource) return;\n\n\t\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\t\tconst sheet = parent.closest(\".ng-sheet-body\");\n\t\t\tconst btnRect = parent.getBoundingClientRect();\n\t\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\t\tconst isDropDown = this.#isPanelBelow(parent);\n\t\t\tconst h = this.#calculatePanelHeight(parent, isDropDown, formattedData.length);\n\t\t\tconst l = this.#calculatePanelLeft(parent);\n\t\t\tconst t = isDropDown ? (btnRect.bottom - sheetRect.top) : (btnRect.top - sheetRect.top - h);\n\n\t\t\tthis.style.height = `${h}px`;\n\t\t\tthis.style.left = `${l}px`;\n\t\t\tthis.style.top = `${t}px`;\n\t\t\t//this.style.opacity = \"\";\n\n\t\t\tif (this.#parent.multi) {\n\t\t\t\tthis.classList.add(\"multi\");\n\t\t\t\tthis.#grd.classList.add(\"multi\");\n\t\t\t} else {\n\t\t\t\tthis.classList.remove(\"multi\");\n\t\t\t\tthis.#grd.classList.remove(\"multi\");\n\t\t\t}\n\n\t\t\tthis.#initData(formattedData);\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus({ preventScroll: true });\n\t\t}\n\t}\n\n\n\t#onClick = (e) => {\n\t\tconst $cell = e.target.closest(\"th,td\");\n\t\tif (this.#grd.classList.contains(\"multi\")) {\n\t\t\tconst index = parseInt($cell?.dataset.index, 10);\n\t\t\tthis.#checkRow(index);\n\t\t}\n\t\telse {\n\t\t\tconst col = parseInt($cell?.dataset.col, 10);\n\n\t\t\tif (col >= 2) {\n\t\t\t\tthis.#returnRow();\n\t\t\t}\n\t\t}\n\t}\n\n\t#onKeydown_input = (e) => {\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst index = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t} else {\n\t\t\t\t\tthis.#selectRow(index)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tthis.#selectRow(this.#grd.row.at());\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t#onKeydown = (e) => {\n\t\tlet index;\n\t\tswitch (e.code) {\n\t\t\tcase \"Escape\":\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (this.classList.contains(\"multi\")) {\n\t\t\t\t\tthis.#onOk();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#returnRow();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tif (this.classList.contains(\"expand\")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.querySelector(\"input[type='text']\").focus({ preventScroll: true });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tindex = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\te.preventDefault();\n\t\t\t\tif ([\"TH\",\"TD\"].includes(e.target.tagName)) {\n\t\t\t\t\tthis.#checkRow(this.#grd.row.at());\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#onOk = () => {\n\n\t\tconst fields = this.#grd.fields.get();\n\t\tconst kIndex = fields.indexOf(\"k\");\n\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\tconst arr = [];\n\t\tthis.#sheet.view.getArray().forEach(o => {\n\t\t\tif (o.v[chkIndex] === \"Y\") {\n\t\t\t\tarr.push(o.v[kIndex]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = arr.join(this.#parent.separator);\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\tthis.close();\n\t}\n\n\t#returnRow = () => {\n\t\tconst index = this.#grd.row.at();\n\n\t\tif (index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#parent.value = record.k;\n\t\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t#checkRow = (index) => {\n\n\t\tif (this.#grd.classList.contains(\"multi\") && index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#grd.data.setValue(record.m._[NINE_TABLE.META.INDEX.ROWID], \"CHK\", record.CHK === \"Y\" ? \"N\" : \"Y\");\n\n\t\t\tthis.#grd.refresh();\n\t\t}\n\t};\n\n\t#selectRow = (index) => {\n\t\tif (index !== -1) {\n\t\t\tthis.#sheet.row.focus(index, () => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst cell = this.#sheet.querySelector(`tr[data-index=\"${index}\"] td[data-col=\"2\"]`);\n\t\t\t\t\tthis.#sheet.navigation.currentCell = cell;\n\t\t\t\t\tcell.focus({ preventScroll: true });\n\t\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sheet.row.focus(-1, () => {\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#sheet.selection.clear();\n\n\t\t\t\tthis.#sheet.navigation.currentCell = this.#sheet.querySelector(`tr[data-index=\"0\"] td[data-col=\"2\"]`);\n\t\t\t\tthis.#sheet.focus({ preventScroll: true });\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t});\n\t\t}\n\t}\n\n\t#onSelectAll = (e) => {\n\n\t\tconst chkIdx = this.#grd.fields.get().indexOf(\"CHK\");\n\n\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\trecord.v[chkIdx] = e.target.checked ? \"Y\" : \"N\";\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t};\n\n\n\t#onInput = (e) => {\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#sheet.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#grd.data.getArray();\n\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\tconst colnm = \"tmp1\";\n\t\t\tconst data2Idx = fields.indexOf(colnm);\n\n\t\t\tlet matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#sheet.filtering.set({\n\t\t\t\t[colnm]: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\".search-input\").addEventListener(\"keydown\", this.#onKeydown_input);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tthis.#sheet.addEventListener(\"keydown\", this.#onKeydown);\n\t\tthis.#sheet.addEventListener(\"click\", this.#onClick);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <label for=\"chkAll\"><input id=\"chkAll\" type=\"checkbox\" checked><span>Select All</span></label>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#target;\n\t#dataSource = [];\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\n\trefresh = () => {\n\t\tsuper.refresh();\n\n\t\tthis.#target.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.multi) {\n\t\t\tconst keys = String(this.value).split(this.multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.keyName])))\n\t\t\t\t.map(m => m[this.valueName])\n\t\t\t\t.join(this.multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.keyName]) === String(this.value));\n\t\t\treturn found ? found[this.valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.multi ? String(this.value).split(this.multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t#init = () => {\n\n\t\tthis.#renderer();\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\t#initData = () => {\n\t\t//if (!this.sheet || !this.cell) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (dataSource) {\n\t\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t\t}\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#target = this.querySelector(\".btn1\");\n\t};\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach($el => {\n\t\t\t$el.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\n\n\t\tthis.cell.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Space\"].includes(e.code)) {\n\t\t\t\tthis.#togglePanel();\n\t\t\t}\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = this.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tthis.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\t//if (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\tif (this.#panel.classList.contains(\"active\") && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.keyName, this.valueName, this.multi, this.multiSeparator);\n\t\t}\n\t}\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\tget keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\tget valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n\tget multi() {\n\t\treturn this.cell.getAttribute('multi') === \"true\";\n\t}\n\tget multiSeparator() {\n\t\treturn this.cell.getAttribute(\"multi-separator\") || \",\";\n\t}\n\tget items() {\n\t\treturn this.cell.getAttribute(\"items\")?.split(\",\").map(s => s.trim()) || [];\n\t}\n\tget separator() {\n\t\treturn this.multiSeparator;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":";;AAAA,MAAM,UAAU,mBAAmB,SAAS,GAAQ;CAGhD,IAAII,IAAQ,GACRC,IAAM,KAAK,SAAS,GACpBC;CAEJ,OAAOF,KAASC,IAAK;EAGjB,IAFA,IAAM,UAAUD,IAAQC,KAAO,CAAC,GAE5BE,MAAW,KAAKD,IAChB,OAAOA;EAEP,AAAIC,IAAS,KAAKD,KACd,IAAMA,IAAM,IAEZ,IAAQA,IAAM;CAG1B;CAEA,OAAO;AACX;AAEA,IAAME,oBAAuB,IAAI,QAAQ;AAEzC,YAAY,UAAU,2BAA2B,SAC7C,GACA,GACA,GACA,GACA,IAAe,KACjB;CACE,IAAMC,IAAK;CAEX,AAAKD,EAAqB,IAAIC,CAAE,KAC5BD,EAAqB,IAAIC,GAAI;EAAE,OAAO;EAAM,UAAU;CAAK,CAAC;CAEhE,IAAMC,IAAQF,EAAqB,IAAIC,CAAE;CAiBzC,AAfAA,EAAG,iBAAiBE,IAAe,MAAM;EASrC,AARA,EAAE,eAAe,EAAE,QAEnB,AAEID,EAAM,WADN,aAAaA,EAAM,KAAK,GACV,OAIlB,EAAM,QAAQ,iBAAiB;GAE3B,AADA,EAAM,QAAQ,MACd,EAAM,WAAWE,EAAU,KAAKH,GAAI,CAAC;EACzC,GAAGI,CAAY;CACnB,CAAC,GAEDJ,EAAG,iBAAiBK,IAAgB,MAAM;EAWtC,AAVA,AAEIJ,EAAM,WADN,aAAaA,EAAM,KAAK,GACV,OAGlB,AAEIA,EAAM,cADNA,EAAM,SAAS,GACE,OAGrBK,EAAW,KAAKN,GAAI,CAAC;CACzB,CAAC;AACL,GAGA,KAAK,mBAAmB,GAAO,IAAQ,sBAAsB;CAEzD,IADI,OAAOO,KAAU,aAAU,KAAgB,KAC3C,CAACA,GAAO,OAAO;EAAE,OAAO;EAAM,QAAQ;CAAK;CAE/C,IAAMC,KAAa,MAAS;EACxB,IAAMC,IAAM,SAAS,cAAc,KAAK;EAExC,OADA,EAAI,YAAYC,GACTD,EAAI,eAAeA,EAAI,aAAa;CAC/C;CAEA,IAAQF,EAAM,WAAW,MAAM,MAAM;CAErC,IAAII,IAAS,SAAS,KAAK,cAAc,8BAA8B;CACvE,AAAKA,MACD,IAAS,SAAS,cAAc,QAAQ,GACxC,EAAO,KAAK,yBACZ,EAAO,MAAM,UAAU,gFACvB,SAAS,KAAK,YAAYA,CAAM;CAGpC,IAAMC,IAAUD,EAAO,WAAW,IAAI;CACtC,EAAQ,OAAOE;CAEf,IAAIC,IAAI,GACJC,IAAI;CAER,KAAK,IAAIC,KAAKT,EAAM,MAAM,MAAM,GAAG;EAC/B,IAAMU,IAAYT,EAAUQ,CAAC,GACvBE,IAAUN,EAAQ,YAAYK,CAAS;EAE7C,IAAI,KAAK,IAAIH,GAAGI,EAAQ,KAAK;EAE7B,IAAMC,IAASD,EAAQ,yBAAyB,IAC1CE,IAAUF,EAAQ,0BAA0B;EAClD,KAAKC,IAASC;CAClB;CAEA,OAAO;EACH,OAAON;EACP,QAAQC;CACZ;AACJ;ACvGA,IAAavB,IAAQ,IAAI,cAPED,EAAY,YAAY;CAC/C,cAAc;EAEV,AADA,MAAM,GACN,KAAK,KAAK,cAAc,OAAO;CACnC;AACJ,EAE+B,GCTlBgC,IAAa;CACtB,MAAM,EACF,OAAO;EACH,OAAO;EACP,WAAW;EACX,QAAQ;EACR,OAAO;CAGX,EACJ;CACA,WAAW;EACP,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;CACZ;CACA,OAAO;EACH,MAAM;EACN,WAAW;EACX,aAAa;EACb,mBAAoB;CACxB;AACJ,GCrBaC,IAAb,MAAmB;CAClB;CACA,KAAU;CAEV,YAAY,GAAQ;EACnB,KAAKC,KAAUC;CAChB;CAEA,IAAI,KAAK;EACR,OAAO,KAAKC;CACb;CACA,IAAI,GAAG,GAAG;EACT,KAAKA,KAAU,SAASX,GAAG,EAAE;CAC9B;CAEA,cAAc,KAAKS,GAAQ,WAAW;AACvC,GAEaG,IAAb,MAAaA,EAAO;CACnB;CACA;CACA,KAAU;CACV,KAAiB,CAAC;CAElB,OAAO,aAAa,EACnB,QAAQ,EAIT;CAEA,OAAO,YAAY;EAClB,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;CACT;CAEA,YAAY,GAAM,GAAQ;EAGzB,AAFA,KAAKC,KAAQC,GACb,KAAKL,KAAUC,GACf,KAAKK,GAAY;CAClB;CAGA,YACoB,KAAKN,GAAQ,cAAc,CAAC,EAAA,CAC7B,QAAO,MAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAM;CAG3G,IAAI,QAAQ;EACX,OAAO,KAAK;CACb;CAEA,cACQ,KAAK;CAGb,YAAY,GAAI,MAAU;EACzB,IAAMU,IAAe,KAAKC,GAAiB;EAE3C,IAAIC,KAA2B,MAC9B,OAAOF;EAGR,IAAIE,IAAK,KAAKA,KAAMF,EAAa,QAAQ,OAAO;EAEhD,IAAMG,IAAeH,EAAaE;EAElC,IAAIE,KAAS,MAAM;GAElB,IAAMC,IADS,KAAK,cACH,CAAC,CAAC,QAAQD,CAAK;GAChC,OAAQC,KAAO,IAAKF,EAAa,EAAEE,KAAO;EAC3C;EAEA,OAAOF;CACR;CAEA,YAAY,GAAU,GAAU,MAAU;EAEzC,IAAMG,IADe,KAAKL,GACC,CAAC,CAACM;EAO7B,AALiBD,EAAQ,EAAEE,OACVC,KAASH,EAAQ,KAAK,aAAaX,EAAO,UAAU,WACpE,EAAQ,KAAK,WAAWA,EAAO,UAAU,SAG1C,EAAQ,EAAEa,KAAYC;CACvB;CAGA,OAAO,GAAI,MAAU;EACpB,IAAMT,IAAe,KAAKC,GAAiB;EAE3C,IAAIC,KAA2B,MAC9B,OAAO,KAAKQ,GAAMV,CAAY;EAG/B,IAAIE,IAAK,KAAKA,KAAMF,EAAa,QAAQ,OAAO;EAEhD,IAAMG,IAAeH,EAAaE,IAC5BS,IAAS,KAAK,cAAc;EAElC,IAAIP,KAAS,MAAM;GAClB,IAAMC,IAAMM,EAAO,QAAQP,CAAK;GAChC,OAAQC,KAAO,IAAKF,EAAa,EAAEE,KAAO;EAC3C;EAEA,OAAO,KAAKK,GAAMP,CAAY;CAC/B;CAEA,eACQ,KAAKX,GAAQ,cAAc,CAAC;CAGpC,sBACQ,OAAO,KAAKI,GAAM,QAAQ,OAAQ,aAAa,KAAKA,GAAM,OAAO,IAAI,IAAI,CAAC;CAGlF,WAAoB;EACnB,KAAKgB,KAAiB,CAAC;EACvB,IAAMC,IAAmB,KAAKjB,GAAM,YAAY,CAAC;EAKjD,AAJA,MAAM,KAAKiB,CAAgB,CAAC,CAAC,SAAQ,MAAM;GAC1C,KAAKD,GAAe,KAAK7C,EAAG,wBAAwB,CAAC,CAAC,UAAU,EAAE;EACnE,CAAC,IAEA,KAAKyB,GAAQ,cAAc,CAAC,EAAA,CAAG,SAAQ,MAAK;GAE5C,AADA,AAAaT,EAAE,SAAO,KAAK+B,GAAgB,GAC3C,EAAE,KAAK,SAAS,KAAKF,GAAe,MAAM;EAC3C,CAAC;CACF;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKF,GAAM,KAAKlB,GAAQ,UAAU;CAC1C;CACA,IAAI,OAAO,GAAG;EACb,KAAK,IAAIT,CAAC;CACX;CAEA,WAAoB;EAKnB,AAJA,KAAKa,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAQ,MAAO;GACzE,EAAI,WAAW;EAChB,CAAC,GAED,KAAKA,GAAM,WAAW,cAAc,0BAA0B,CAAC,EAAE,QAAQ;CAC1E;CAEA,OAAO,MAAe;EAErB,IAAMmB,UAAiB;GAEtB,AADA,KAAKnB,GAAM,UAAU,IACrB,iBAAiB;IAChB,IAAI;KAGH,AAFA,KAAK,MAAM,GACX,KAAK,IAAIoB,GAAY,EAAK,GAC1B,KAAKC,GAAY;IAClB,UAAU;KACT,KAAKrB,GAAM,UAAU;IACtB;GACD,CAAC;EACF;EAEA,AAAI,KAAKA,GAAM,SACdmB,EAAS,IAGT,KAAKnB,GAAM,iBAAiBN,EAAW,MAAM,OAAM,MAAK;GACvD,EAAS;EACV,GAAG,EAAE,MAAM,GAAK,CAAC;CAEnB;CAEA,IAAI,SAAS;EACZ,OAAO,KAAK4B;CACb;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKjB,GAAiB,CAAC,CAAC;CAChC;CAEA,IAAI,QAAQ;EACX,OAAO,KAAK;CACb;CAEA,cAAc;EACb,OAAO,KAAK;CACb;CAEA,MAAmB,IAAQ,OACnB;EACN,UAAUN,EAAO,UAAU;EAC3B,SAAS;EACT,UAAU;EACV,QAAQ,KAAKiB,GAAe,MAAM;EAClC,GAAG,CAAC;EACJ,GAAG,CAAC;EACJ,IAAI;GAAC;GAAG;GAAG;GAAG;GAAGjB,EAAO,UAAU;GAAO;GAAO;GAAO;GAAM;GAAO;GAAM;GAAM;GAAO,KAAKiB,GAAe,MAAM;GAAG;GAAI,CAAC;GAAG,CAAC;EAAC;EAC9H,GAAG;GAACO;GAAO7B,EAAW,UAAU;GAAO,CAAC;GAAG,CAAC;EAAC;CAC9C;CAGD,cAAc;EAEb,AADA,KAAKE,GAAQ,aAAa,CAAC,GAC3B,KAAKyB,GAAY;CAClB;CAEA,cAAc;EAQb,AAPA,KAAKzB,GAAQ,aAAa,CAAC,GACvB,KAAKA,GAAQ,aAAa,SAC7B,KAAKA,GAAQ,YAAY,MAAM,GAGhC,KAAK0B,KAAU,GAEf,KAAKD,GAAY;CAClB;CAEA,MAAe,MAAc;EAC5B,AAAK,MAAM,QAAQG,CAAS,MAAG,IAAY,CAACA,CAAS;EAErD,IAAMT,IAAS,KAAK,cAAc,CAAC,CAAC,SAAS,IAAI,KAAK,cAAc,IAAI,OAAO,KAAKS,EAAU,MAAM,CAAC,CAAC,GAChGC,IAAM,CAAC;EAUb,OARAD,EAAU,SAAQ,MAAQ;GACzB,IAAME,IAAI,EAAE,GAAG,CAAC,EAAE;GAIlB,AAHAX,EAAO,SAAQ,MAAS;IACvB,EAAE,EAAE,KAAKY,EAAKnB,OAAW,KAAA,KAAamB,EAAKnB,OAAW,OAAOmB,EAAKnB,KAAS,EAAE;GAC9E,CAAC,GACDiB,EAAI,KAAKC,CAAC;EACX,CAAC,GAEMD;CACR;CAEA,MAAkB,OACZ,MAAM,QAAQA,CAAG,MAAG,IAAM,CAACA,CAAG,IACnCA,EAAI,SAAQ,MAAK;EAChB,IAAMF,IAAQ,KAAK;EAQnB,AANA,EAAE,IAAI,KAAKL,GAAgBK,CAAK,GAChC,EAAE,OAAOG,EAAE,GACX,EAAE,KAAK,QAAQH,GAGf,EAAE,EAAE,EAAE7B,EAAW,KAAK,MAAM,SAAS6B,GACrC,EAAE,EAAE,EAAE7B,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;CAC/D,CAAC,GACM+B;CAGR,MAAoB,MACL,KAAK7B,GAAQ,WAAW,WAAU,MAC3C,CAACgC,KAAU,CAACA,EAAO,KAAK,CAACA,EAAO,EAAE,IAAU,KACzCA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,WAAW6B,CAGzC;CAGZ,OAAO,GAAY,IAAc,OAAS;EACzC,AAAIH,MAAe,KAAA,MAAW,IAAa,CAAC;EAC5C,IAAMK,IAAM,KAAKI,GAAYT,CAAU,GAEjCU,IAAe,KAAKC,GAAeN,CAAG;EAE5C,KAAK7B,GAAQ,aAAa,KAAKA,GAAQ,WAAW,OAAOkC,CAAY;EAErE,IAAME,IAAM,KAAK,MAAM,IAAI;EAe3B,OAdIC,KACHR,EAAI,SAAS,GAAG,MAAQ;GACvB,IAAMxD,IAAS,KAAK2B,GAAQ,WAAW,KAAKA,GAAQ,WAAW,SAAS,IAAIa;GAC5E,AAAIxC,MAAQ,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;EAChF,CAAC,GAGF,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,WAAW;GACpE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAO8B,EAAa,SAAS,IAAIA,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM,SAAS;GAAK;EACxH,CAAC,CAAC,GAEKsC;CACR;CAGA,UAAU,GAAO,GAAY,IAAc,OAAS;EAGnD,AAAIZ,MAAe,KAAA,MAAW,IAAa,CAAC;EAC5C,IAAMK,IAAM,KAAKI,GAAYT,CAAU;EACvC,IAAIK,EAAI,WAAW,GAAG,OAAO;EAE7B,IAAIS,IAAc,KAAKC,GAAiBZ,CAAK,GASvCO,IAAe,KAAKC,GAAeN,CAAG;EAyB5C,OAnBA,KAAK7B,GAAQ,WAAW,OAAOsC,GAAa,GAAG,GAAGJ,CAAY,GAE1DG,KACHH,EAAa,SAAS,GAAG,MAAQ;GAChC,IAAM7D,IAAS,KAAK2B,GAAQ,WAAWsC,IAAczB;GAErD,AAAIxC,KAAUA,EAAO,KAAKA,EAAO,EAAE,MAClC,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;EAErE,CAAC,GAGF,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,WAAW;GACpE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAO8B,EAAa,SAAS,IAAIA,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM,SAAS;GAAK;EACxH,CAAC,CAAC,GAEKoC,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM;CAClD;CAEA,UAAU,MAAM;EACf,IAAI+B,IAAM,CAAC;EACX,AAKCA,IALG,MAAM,QAAQtC,CAAC,IACZ,KAIA,CAAC,SAASA,GAAG,EAAE,CAAC;EAGvB,IAAIiD,IAAW,CAAC;EAChB,EAAI,SAAQ,MAAS;GACpB,EAAS,KAAK,KAAKD,GAAiBZ,CAAK,CAAC;EAC3C,CAAC;EAED,IAAMc,IAAU,KAAKzC,GAAQ;EAoB7B,AAlBAwC,EAAS,MAAM,GAAG,MAAME,IAAIC,CAAC,CAAC,CAAC,SAAQ,MAAS;GAE9C,IAAMC,IAAWH,EAAQI,EAAM,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM;GAE1D,AAAI2C,EAAQI,EAAM,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,SAChF,KAAKE,GAAQ,aAAa,KAAKA,GAAQ,WAAW,QAAO,MAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,WAAW8C,CAAQ,IAEnH,KAAK5C,GAAQ,WAAW,SAAQ,MAAQ;IACvC,AAAIO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,WAAW8C,MAC7C,EAAK,EAAE,EAAE9C,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;GAEnE,CAAC;EAGJ,CAAC,GAED,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,aAAa;GACtE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAOyB,EAAI,SAAS,IAAIA,EAAI,KAAK;GAAK;EACrE,CAAC,CAAC;CACH;CAEA,YAAY,GAAO,GAAO,GAAO,IAAc,OAAS;EAEvD,IAAQ,SAASF,GAAO,EAAE;EAE1B,IAAMmB,IADS,KAAK,cACC,CAAC,CAAC,QAAQlC,CAAK;EACpC,IAAIkC,IAAU,GAAG;EAEjB,IAAMD,IAAQ,KAAKN,GAAiBZ,CAAK,GAGnCb,IADU,KAAKd,GAAQ,WACL6C;EACxB,AAAK/B,MAEYA,EAAQ,EAAEgC,OACV7B,KAASoB,KAAevB,EAAQ,EAAE,EAAEhB,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,WAC9G,EAAQ,EAAE,EAAEA,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU,SAGrE,EAAQ,EAAEgD,KAAW7B;CACtB;CAEA,kBAAkB,MAAa;EAE9B,IAAMwB,IAAU,KAAKzC,GAAQ;EAM5B,OAJG+C,IACI,KAAK7B,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeiD,CAAY,CAAE,IAGxG;GACN,GAAG,KAAK7B,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;GAC9H,GAAG,KAAKoB,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;GAC9H,GAAG,KAAKoB,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;EAC/H;CAEF;CAEA,MAAS,MAAQ;EAChB,IAAI,CAAC+B,GAAK,OAAOA;EAEjB,IAAMmB,IAAW,CAAC,MAAM,QAAQnB,CAAG,GAC7BoB,IAAYD,IAAW,CAACnB,CAAG,IAAIA,GAC/BV,IAAS,KAAK,cAAc,GAE5B+B,IAASD,EAAU,QAAO,MAAK,CAACnB,EAAE,MAAM,OAAO,CAAC,CAAC,KAAI,MAAK;GAC/D,IAAM,IAAI,CAAC;GAKX,OAJAX,EAAO,SAAS,GAAO,MAAM;IAC5B,EAAEP,KAASkB,EAAE,IAAIA,EAAE,EAAEqB,KAAKrB,EAAElB;GAC7B,CAAC,GACD,EAAE,OAAOkB,EAAE,MACJ;EACR,CAAC;EAED,OAAOkB,IAAWE,EAAO,KAAKA;CAC/B;AACD,GC5aaE,IAAb,MAA2B;CAC1B;CAEA,YAAY,GAAM;EA0CjB,AAzCA,KAAKhD,KAAQC,GAEb,KAAK,MAAM,IAAIN,EAAM,IAAI,GACzB,KAAK,OAAO,IAAII,EAAO,KAAKC,IAAO,IAAI,GAEvC,KAAK,aAAa,CAAC,GACnB,KAAK,cAAc,CAAC,GACpB,KAAK,aAAa,CAAC,GACnB,KAAK,UAAU,IAEf,KAAK,YAAY,cAAc;GAC9B,AAAI,KAAKA,GAAM,MAAM,UAAQ,KAAKA,GAAM,KAAK,OAAO;EACrD,GAEA,KAAK,iBAAiB,MAAO;GAO5B,AANI,KAAK,QAAM,KAAK,KAAK,MAAM,GAE/B,KAAK,aAAa,CAAC,GACnB,KAAK,cAAc,CAAC,GACpB,KAAK,aAAa,CAAC,GAEnB,KAAK,KAAK,IAAIiD,KAAM,CAAC,CAAC;EACvB,GAEA,KAAK,eAAe,MAAS;GAC5B,IAAMC,IAAS,SAASC,GAAM,EAAE;GAChC,IAAI,OAAU,KAAK,KAAK,MAAM,IAC9B,OAAO,KAAK,KAAK,aAAa,CAAC,CAACD,EAAO,EAAE,MAAM;EAChD,GAEA,KAAK,uBAAuB,KAAK,IAAI,IACrC,KAAK,kBAAkB,MAAS;GAAE,KAAK,IAAI,KAAKC;EAAM,GAEtD,KAAK,aAAa,GAAQ,MAAU,KAAK,KAAK,IAAIC,GAAQ5C,CAAK,GAE/D,KAAK,aAAa,GAAQ,GAAO,MAAM;GAEtC,AADA,IAAS,SAAS4C,GAAQ,EAAE,GAC5B,KAAK,KAAK,SAASA,GAAQ5C,GAAOrB,CAAC;EACpC,GAGA,KAAK,cAAc,CAAC,CAAC;CACtB;AACD,GC/Ca4B,IAAb,MAAoB;CACnB;CACA,KAAU,CAAC;CAEX,YAAY,GAAM;EAEjB,AADA,KAAKf,KAAQC,GACb,KAAKoD,GAAM;CACZ;CAEA,MAAM;EACL,OAAO,KAAKC,GAAQ,KAAI,MAAKC,EAAE,IAAI;CACpC;CAEA,YAAY;EACX,OAAO,KAAKD;CACb;CAEA,QAAQ,GAAW;EAClB,IAAME,IAAQ,KAAKF,GAAQ,MAAK,MAAKC,EAAE,SAASE,CAAS;EACzD,OAAOD,IAAQA,EAAM,OAAO;CAC7B;CAEA,OAAO,GAAK,IAAO,aAAa;EAM/B,AALA/B,EAAI,SAAQ,MAAS;GACpB,AAAK,KAAK6B,GAAQ,MAAK,MAAKC,EAAE,SAASG,CAAK,KAC3C,KAAKJ,GAAQ,KAAK;IAAE,MAAMI;IAAa;GAAK,CAAC;EAE/C,CAAC,GACD,KAAKC,GAAQ;CACd;CAEA,QAAQ,GAAG;EACV,OAAO,KAAKL,GAAQ,WAAU,MAAKC,EAAE,SAASpE,CAAC;CAChD;CAEA,SAAS,GAAG;EACX,OAAO,KAAKmE,GAAQ,MAAK,MAAKC,EAAE,SAASpE,CAAC;CAC3C;CAEA,WAAgB;EACf,IAAMyE,oBAAM,IAAI,IAAI;EASpB,AARA,KAAKN,GAAQ,SAAQ,MAAK;GACzB,EAAI,IAAIC,EAAE,MAAMA,EAAE,IAAI;EACvB,CAAC,GAED,KAAKD,KAAU,MAAM,KAAKM,IAAM,CAACC,GAAMC,QAAW;GAAE;GAAM;EAAK,EAAE,GAEjE,KAAKR,KAAU,KAAKA,GAAQ,QAAO,MAAKC,EAAE,SAAS,MAAMA,EAAE,SAAS,MAAM,GAE1E,KAAKD,GAAQ,MAAM,GAAG,MAAgBf,EAAE,KAAK,SAASD,EAAE,KAAK,SAAU,IAAI,EAAK;CACjF;CAEA,WAAc;EACb,KAAKgB,KAAU,CAAC;EAEhB,IAAMS,IAAY,MAAM,KAAK,KAAK/D,GAAM,iBAAiB,OAAO,CAAC;EAEjE,IAAK+D,KAAaA,EAAU,WAAW,GAEvC;QAAK,IAAMC,KAAOD,GAiBjB,AAfAC,EAAI,iBAAiB,aAAa,CAAC,CAAC,SAAS,MAAO;IACnD,IAAMP,IAAYtF,EAAG,QAAQ,MACvB8F,IAAY9F,EAAG,aAAa,WAAW,KAAK;IAElD,AAAIsF,KACH,KAAKH,GAAQ,KAAK;KAAE,MAAMG;KAAW,MAAMQ;IAAU,CAAC;GAExD,CAAC,GAQD;IALC;IAAa;IAAoB;IAAS;IAC1C;IAAW;IAAY;IAAiB;IACxC;IAAc;IAAc;GAGrB,CAAC,CAAC,SAAQ,MAAQ;IACzB,EAAI,iBAAiB,IAAIC,EAAK,EAAE,CAAC,CAAC,SAAS,MAAO;KACjD,IAAIC,IAAOhG,EAAG,aAAa+F,CAAI;KAC/B,IAAKC,GAEL;UAAIA,EAAK,QAAQ,OAAO,IAAI,GAAG;OAC9B,IAAMC,IAAYD,EAAK,OAAO,MAAM;OAEpC,IAAIC,IAAY,GACf,IAAI;QACH,IAAO,OAAO,OAAOD,EAAK,UAAU,GAAGC,CAAS,CAAC,CAAC,KAAK,EAAE;OAC1D,QAAY;QACX,IAAO;OACR;MAEF;MAEA,EAAK,MAAM,OAAO,CAAC,CAAC,SAAQ,MAAK;OAChC,IAAIjF,EAAE,KAAK,KAAK,IAAI;QACnB,IAAMiF,IAAYjF,EAAE,OAAO,gBAAgB,GACvCkF,IAAc;QAQlB,AANID,KAAa,IAChB,IAAcjF,EAAE,UAAU,GAAGiF,CAAS,IAC5BD,EAAK,WAAW,OAAO,MACjC,IAAchF,EAAE,QAAQ,SAAS,EAAE,IAGhCkF,KACH,KAAKf,GAAQ,KAAK;SAAE,MAAMe;SAAa,MAAM;QAAS,CAAC;OAEzD;MACD,CAAC;KAjBD;IAkBD,CAAC;GACF,CAAC;GAGF,KAAKV,GAAQ;EAFb;CAGD;AACD,GCrHaW,IAAb,cAAqC,YAAY;CAC7C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAChB,KAAKjB,GAAM;CACf;CAEA,WAAc,CAEd;AAEJ;AAEK,eAAe,IAAI,mBAAmB,KACvC,eAAe,OAAO,qBAAqBiB,CAAe;;AChB9D,IAAaC,IAAb,cAA2C,YAAY;CACnD;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAChB,KAAKlB,GAAM;CACf;CAEA,gBAAgB;EACZ,KAAK,cAAc,YAAY,CAAC,CAAC,YAAY,KAAKrD,GAAM,KAAK,MAAM,CAAC,CAAC,eAAe;CACxF;CAEA,WAAc;EAeV,AAdA,KAAKA,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAKwE,GAAQ,GAEb,KAAK,cAAc,eAAe,CAAC,EAAE,iBAAiB,UAAU,MAAM;GAClE,IAAMC,IAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAC5CC,IAAU,EAAE,OAAO,QAAQ,oBAAoB;GAErD,IAAI,CAACA,GAAS;GAEd,IAAMjC,IAAQ,SAASiC,EAAQ,QAAQ,OAAO,EAAE;GAChD,KAAKC,GAAalC,GAAOgC,CAAa;EAC1C,CAAC,GAED,iBAAiB;GACb,KAAKE,GAAa,GAAG,EAAK;EAC9B,CAAC;CACL;CAEA,MAAgB,GAAO,IAAgB,OAAU;EAE7C,IAAMC,UAAwB;GAC1B,IAAMC,IAAS,MAAM,KAAK,KAAK7E,GAAM,WAAW,iBAAiB,kBAAkB,CAAC;GAGpF,MAFwB,KAAK,KAAKA,GAAM,WAAW,iBAAiB,eAAe,CAE3E,CAAC,CAAC,SAAQ,MAAK8E,EAAE,MAAM,YAAY,WAAW,MAAM,CAAC;GAE7D,IAAMC,IAAeF,EAChB,KAAK,GAAO,OAAS;IAAE;IAAO;GAAI,EAAE,CAAC,CACrC,QAAQ,EAAE,eAAYG,EAAM,UAAU,SAAS,QAAQ,CAAC;GAE7D,IAAI,IAAa,SAAS,IAE1B,KAAK,IAAIjC,IAAI,GAAGA,IAAIgC,EAAa,SAAS,GAAG,KAAK;IAC9C,IAAME,IAAaF,EAAahC,EAAE,CAAC,KAE7BmC,IAAiB,KAAKlF,GAAM,WAAW,cAAc,mCAAmCiF,EAAW,GAAG;IAC5G,AAAIC,KACAA,EAAe,MAAM,YAAY,WAAW,EAAE;GAEtD;EACJ,GAEMC,IAAS,KAAK,cAAc,eAAe,GAC3CC,IAAO,KAAKpF,GAAM,WAAW,cAAc,wBAAwB,GACnEqF,IAAWF,EAAO,iBAAiB,oBAAoB,GACvDG,IAAgBF,EAAK,iBAAiB,kBAAkB;EAE9D,IAAI,CAACC,EAAS5C,IAAQ;EAEtB,IAAI,CAACgC,GAKD,AAJAY,EAAS,SAAS,GAAK,MAAQ;GAC3B,EAAI,UAAU5E,MAAQgC,CAAK;EAC/B,CAAC,GAED6C,EAAc,SAAS,GAAO,MAAQ;GAClC,IAAMC,IAAW9E,MAAQgC;GAEzB,AADAuC,EAAM,UAAU,OAAO,UAAUO,CAAQ,GACzC,EAAM,MAAM,OAAOA,IAAW,aAAa;EAC/C,CAAC;OACE;GACH,IAAMC,IAAaH,EAAS5C,IACtBgD,IAAaN,EAAO,iBAAiB,2BAA2B;GAEtE,IAAIK,EAAW,UAAU,SAAS,QAAQ,KAAKC,EAAW,UAAU,GAChE;GAGJ,EAAW,UAAU,OAAO,QAAQ;GACpC,IAAMC,IAAcN,EAAK,cAAc,gCAAgC3C,EAAM,GAAG;GAChF,AAAIiD,MACAA,EAAY,UAAU,OAAO,QAAQ,GAChCA,EAAY,UAAU,SAAS,QAAQ,MACxC,EAAY,MAAM,OAAO;EAGrC;EAEA,IAAMX,IAAeK,EAAK,iBAAiB,yBAAyB;EAYpE,AAVAL,GAAc,SAAQ,MAAS;GAG3B,AAFA,EAAM,MAAM,OAAQA,EAAa,SAAS,IAAK,WAAW,YAEtD,OAAOC,EAAM,iBAAkB,aAC/BA,EAAM,cAAc,IAEpBA,EAAM,aAAa;EAE3B,CAAC,GAEDJ,EAAgB;CACpB;CAEA,KAAU;EAIN,IAAMe,IAHc,MAAM,KAAK,KAAK3F,GAAM,QACd,CAAC,CAAC,QAAO,MAAO7B,EAAG,QAAQ,YAAY,MAAM,OAEhD,CAAC,CAAC,KAAK,GAAO,MAI5B,8BAHWsC,MAAQ,IAAI,WAAW,GAGM,gBAAgBA,EAAI,IAFnDmF,EAAM,aAAa,SAAS,KAAK,SAASnF,IAAM,IAEe,sBAClF,CAAC,CAAC,KAAK,EAAE;EAEV,KAAK,YAAY;wCACekF,EAAS;;;CAG7C;AACJ,GAEaE,IAAb,cAAkC,YAAY;CAC1C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB,CAEpB;CAEA,UAAU,GAAU;EAChB,KAAK,UAAU,OAAO,UAAUN,CAAQ;CAC5C;AACJ;AAEK,eAAe,IAAI,oBAAoB,KACxC,eAAe,OAAO,sBAAsBM,CAAY,GAGvD,eAAe,IAAI,0BAA0B,KAC9C,eAAe,OAAO,4BAA4BtB,CAAqB;;AChJ3E,IAAauB,IAAb,cAA6B,YAAY;CACrC;CACA;CAEA,oBAAoB;EAGhB,AAFA,KAAK9F,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKwE,GAAQ,GACb,KAAKuB,GAAY;CACrB;CAEA,KAAU;EAiBN,AAhBA,KAAK,YAAY,8sBAejB,KAAKC,KAAmB,KAAK,cAAc,mBAAmB,GAC9D,KAAKC,GAAmB;CAC5B;CAEA,KAAqB;EACjB,IAAMC,IAAW,KAAKlG,GAAM,aAAa,OAAO,MAAM,YAAY,KAAKA,GAAM,UAAU,SAAS,QAAQ,GAClGmG,IAAc,KAAKnG,GAAM,aAAa,cAAc,MAAM,SAC1DoG,IAAW,KAAKpG,GAAM,aAAa,WAAW,MAAM,SACpDqG,IAAU,KAAKrG,GAAM,aAAa,SAAS,KAAK;EAStD,AAPIkG,KAAY,CAACC,IACb,KAAK,aAAa,UAAU,EAAE,IAE9B,KAAK,gBAAgB,QAAQ,GAGjC,KAAK,aAAa,aAAaC,IAAW,SAAS,OAAO,GAC1D,KAAK,cAAcC,CAAO;CAC9B;CAEA,KAAc;EACV,IAAMC,IAAU,KAAK,cAAc,mBAAmB;EACtD,AAAIA,KACAA,EAAQ,iBAAiB,kBAAkB;GACvC,IAAMC,IAAO,yDACPC,IAAiB,KAAKxG,GAAM,aAAa,SAAS,KAAK;GAC7D,EAAQ,YAAYsG,EAAQ,cAAcC,IAAOC,IAAiBD;EACtE,CAAC;EAGL,IAAME,IAAU,KAAK,cAAc,sBAAsB;EACzD,AAAIA,KACAA,EAAQ,iBAAiB,eAAe;GACpC,KAAKzG,GAAM,cAAc,IAAI,YAAY,sBAAsB;IAC3D,SAAS;IACT,UAAU;IACV,QAAQ,EAAE,aAAa,KAAKA,GAAM;GACtC,CAAC,CAAC;EACN,CAAC;CAET;CAEA,iBAAiB,GAAS;EACtB,AAAI,KAAKgG,MACL,KAAKA,GAAiB,OAAOU,CAAO;CAE5C;CAEA,cAAc,GAAM;EAChB,IAAMJ,IAAU,KAAK,cAAc,mBAAmB;EACtD,AAAIA,MAAS,EAAQ,cAAcK;CACvC;AACJ;AAEK,eAAe,IAAI,oBAAoB,KACxC,eAAe,OAAO,sBAAsBb,CAAO;;AChFvD,IAAac,IAAb,cAAyC,YAAY;CACjD;CACA,KAAY;CACZ;CACA;CACA;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAEhB,IADA,KAAKC,KAAS,KAAK,QAAQ,kBAAkB,KAAK,KAAK,YAAY,CAAC,CAAC,MACjE,CAAC,KAAKA,IAAQ;EAElB,KAAK,YAAY;EAMjB,IAAMC,UAAsB;GACxB,IAAM1B,IAAO,KAAKyB,GAAO,cAAc,mCAAmC;GAC1E,AAAKzB,KAKL,KAAK2B,KAAY;IACb,WAAY3B;IACZ,OAAY,KAAK,cAAc,eAAe;IAC9C,OAAY,KAAK,cAAc,eAAe;IAC9C,MAAY,KAAK,cAAc,cAAc;IAC7C,OAAY,KAAK,cAAc,eAAe;GAClD,GAEA,KAAK/B,GAAM,GACX,KAAK2D,GAAe,GACpB,KAAK,QAAQ,KAdT,WAAWF,GAAe,EAAE;EAepC;EAEA,EAAc;CAClB;CAEA,uBAAuB;EACnB,AAAI,KAAKG,MACL,KAAKA,GAAgB,WAAW;CAExC;CAEA,WAAuB;EACnB,IAAI,CAAC,KAAKJ,IAAQ;EAClB,IAAMzB,IAAO,KAAKyB,GAAO,cAAc,mCAAmC;EAC1E,AAAKzB,MAEL,KAAK6B,KAAkB,IAAI,qBAAqB;GAC5C,KAAK,QAAQ;EACjB,CAAC,GACD,KAAKA,GAAgB,QAAQ7B,CAAI;CACrC;CAEA,gBAAgB;EAEZ,IAAI,CAAC,KAAKyB,MAAU,CAAC,KAAKE,MAAa,KAAKG,IAAW;EAEvD,IAAM9B,IAAO,KAAK2B,GAAU,WACtBnB,IAAQR,EAAK,cAAc,OAAO;EACxC,IAAI,CAACQ,GAAO;EAEZ,IAAMuB,IAAQ,KAAKJ,GAAU,OACvBK,IAAQ,KAAKL,GAAU,OAEvBM,IAAYjC,EAAK,aACjBkC,IAAa1B,EAAM,aAEnB2B,IAAgBF,MAAc,KAAKC,IAAaD;EAGtD,IAFA,KAAKR,GAAO,UAAU,OAAO,mBAAmBU,CAAY,GAExD,CAACA,GACD;EAGJ,IAAMC,IAAaL,EAAM;EACzB,IAAIK,KAAc,GAAG;EAErB,IAAMC,IAAa,KAAK,IAAI,KAAK,IAAkBJ,IAAYC,IAA1BE,GAAuCA,CAAU,GAAG,EAAE;EAC3F,EAAM,MAAM,QAAQ,GAAGC,EAAW;EAElC,IAAMC,IAActC,EAAK,YACnBuC,IAAgBL,IAAaD,GAE/BO,IAAI;EAIR,AAHID,IAAgB,MAChB,IAAI,SAAUD,IAAcC,KAAkBH,IAAaC,IAAa,EAAE,IAE1EG,IAAI,MAAG,IAAI;EAEf,IAAMC,IAAeL,IAAaC;EAMlC,AALIG,IAAIC,MAAc,IAAIA,IAE1B,EAAM,MAAM,OAAO,GAAGD,EAAE,KAExB,KAAKb,GAAU,KAAK,WAAYa,MAAM,GACtC,KAAKb,GAAU,MAAM,WAAYa,KAAKC,IAAe;CACzD;CAEA,MAAgB,MAAM;EAClB,IAAI,CAAC,KAAKd,IAAW,OAAO;EAE5B,IAAM3B,IAAO,KAAK2B,GAAU,WACtBnB,IAAQR,EAAK,cAAc,OAAO;EACxC,IAAI,CAACQ,GAAO,OAAO;EAEnB,IAAMkC,IAAa,KAAKf,GAAU,MAAM,sBAAsB,GACxDU,IAAa,KAAKV,GAAU,MAAM,aAEpCgB,IAAUC;EACd,AAAID,IAAU,MAAG,IAAU;EAC3B,IAAMF,IAAeC,EAAW,QAAQL;EAOxC,AANIM,IAAUF,MAAc,IAAUA,IACtC,IAAU,SAASE,GAAS,EAAE,GAE9B,KAAKhB,GAAU,MAAM,MAAM,OAAO,GAAGgB,EAAQ,KAE7C,KAAKhB,GAAU,KAAK,WAAYgB,MAAY,GAC5C,KAAKhB,GAAU,MAAM,WAAYgB,KAAWF,IAAe;EAE3D,IAAMR,IAAYjC,EAAK,aAEjBuC,IADa/B,EAAM,cACUyB;EAOnC,OALIQ,IAAe,KAAKF,IAAgB,MAEpC,EAAK,aADkBI,IAAUF,IAAgBF,IAI7CI,IAAU,KAAKA,IAAUF,IAAe;CACpD;CAEA,WAAc;EACV,IAAMI,KAAe,MAAQ;GAEzB,AADA,cAAc,KAAKC,EAAU,GAC7B,cAAc,KAAKC,EAAU;GAE7B,IAAMC,IAAY,SAAS,KAAKrB,GAAU,MAAM,MAAM,QAAQ,GAAG,EAAE;GAGnE,AAFA,KAAKsB,GAAaD,IAAYE,CAAG,GAEjC,KAAKJ,KAAa,kBAAkB;IAGhC,AAFA,cAAc,KAAKA,EAAU,GAE7B,KAAKC,KAAa,kBAAkB;KAChC,IAAMI,IAAmB,SAAS,KAAKxB,GAAU,MAAM,MAAM,QAAQ,GAAG,EAAE;KAC1E,AAAK,KAAKsB,GAAaE,IAAmBD,CAAG,KACzC,cAAc,KAAKH,EAAU;IAErC,GAAG,EAAE;GACT,GAAG,GAAG;EACV,GAEMK,UAAmB;GAErB,AADA,cAAc,KAAKN,EAAU,GAC7B,cAAc,KAAKC,EAAU;EACjC;EAsBA,AAnBA,CAAC,WAAW,YAAY,CAAC,CAAC,SAAQ,MAAO;GAGrC,AAFA,KAAKpB,GAAU,KAAK,iBAAiB0B,GAAKD,CAAU,GACpD,KAAKzB,GAAU,MAAM,iBAAiB0B,GAAKD,CAAU,GACrD,KAAKzB,GAAU,MAAM,iBAAiB0B,GAAKD,CAAU;EACzD,CAAC,GAED,KAAKzB,GAAU,KAAK,iBAAiB,cAAa,MAAK;GAAE,AAAI2B,EAAE,WAAW,KAAWT,EAAY,GAAG;EAAG,CAAC,GACxG,KAAKlB,GAAU,MAAM,iBAAiB,cAAa,MAAK;GAAE,AAAI2B,EAAE,WAAW,KAAWT,EAAY,EAAE;EAAG,CAAC,GAIxG,KAAKlB,GAAU,MAAM,iBAAiB,cAAa,MAAK;GACpD,IAAI,EAAE,WAAW,GAAG;GACpB,EAAE,eAAe;GACjB,IAAM4B,IAAY,KAAK5B,GAAU,MAAM,sBAAsB,GACvDU,IAAa,KAAKV,GAAU,MAAM;GACxC,KAAKsB,GAAa,EAAE,UAAUM,EAAU,OAAQlB,IAAa,CAAE;EACnE,CAAC,GAED,KAAKV,GAAU,MAAM,iBAAiB,cAAa,MAAK;GACpD,IAAI,EAAE,WAAW,GAAG;GAIpB,AAHA,EAAE,gBAAgB,GAClB,EAAE,eAAe,GACjB,KAAKG,KAAY,IACjB,KAAK,SAAS,EAAE,UAAU,KAAKH,GAAU,MAAM,sBAAsB,CAAC,CAAC;GAEvE,IAAM6B,KAAe,MAAc;IAC/B,IAAI,CAAC,KAAK1B,IAAW;IACrB,IAAMyB,IAAY,KAAK5B,GAAU,MAAM,sBAAsB;IAC7D,KAAKsB,GAAaQ,EAAU,UAAUF,EAAU,OAAO,KAAK,MAAM;GACtE,GAEMG,UAAkB;IAKpB,AAJA,KAAK5B,KAAY,IACjBsB,EAAW,GACX,SAAS,oBAAoB,aAAaI,CAAW,GACrD,SAAS,oBAAoB,WAAWE,CAAS,GACjD,KAAK,QAAQ;GACjB;GAGA,AADA,SAAS,iBAAiB,aAAaF,CAAW,GAClD,SAAS,iBAAiB,WAAWE,CAAS;EAClD,CAAC;CACL;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBlC,CAAmB;;ACrNtE,IAAamC,IAAb,cAAyC,YAAY;CACjD;CACA;CACA,KAAY;CACZ;CACA,KAAU;CAEV,KAAiB;CAEjB,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAIhB,AAHA,KAAK/I,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKgJ,KAAS,KAAK,QAAQ,kBAAkB,GAE7C,KAAK,YAAY;EAMjB,IAAMlC,UAAsB;GACxB,IAAM1B,IAAO,KAAK4D,GAAO,cAAc,gBAAgB;GACvD,AAAK5D,KAKL,KAAK2B,KAAY;IACb,WAAW3B;IACX,OAAO,KAAK,cAAc,eAAe;IACzC,OAAO,KAAK,cAAc,eAAe;IACzC,KAAK,KAAK,cAAc,aAAa;IACrC,QAAQ,KAAK,cAAc,gBAAgB;GAC/C,GAEA,KAAK/B,GAAM,GACX,KAAK,QAAQ,KAbT,WAAWyD,GAAe,EAAE;EAcpC;EAEA,EAAc;CAClB;CAEA,WAAsB;EAClB,IAAMmC,IAAc,KAAKD,GAAO,KAAK,SAAS,GACxCE,IAAaD,IAAcA,EAAY,SAAS,GAEhDE,IAAe,KAAKH,GAAO,UAAU,cACvCI,IAAmBD,KAAe,WAAWA,EAAa,MAAM,MAAM,KAAK;EAE/E,CAAI,CAACC,KAAoBA,KAAoB,OAEzC,AAIIA,IALc,KAAKJ,GAAO,aAAa,cAAc,2BAA2B,KACnE,KAAKA,GAAO,aACL,KAAK,eAAe,KAAK,eAAgB,KAAK,eAAgBE,IAAa,KAG5EA,KADD,KAAKF,GAAO,aAAa,KAAK;EAKxD,IAAMK,IAAqB,MACrBC,IAAaF,IAAmBC,GAElCE,IAAc,GACdC,IAAgBJ;EAOpB,OALIE,MACA,IAAcD,IAAqBD,GACnC,IAAgBC,IAGb;GAAE;GAAkB;GAAe;GAAa;GAAY;EAAW;CAClF;CAGA,gBAAgB;EAGZ,IAFI,KAAKnC,MAEL,CAAC,KAAK8B,MAAU,CAAC,KAAKA,GAAO,YAAY,CAAC,KAAKjC,IAAW;EAE9D,IAAM3B,IAAO,KAAK2B,GAAU,WACtBI,IAAQ,KAAKJ,GAAU,OACvBK,IAAQ,KAAKL,GAAU,OACvB,EAAE,qBAAkB,KAAK0C,GAAc,GAEvCC,KAAe,KAAKV,GAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MACpE,KAAKA,GAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MACpD,KAAKA,GAAO,cAAc,YAAY,CAAC,EAAE,gBAAgB,IAExDW,IAAc,KAAKX,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,GAC1EY,IAAaD,IAAaD,GAG1BR,IADc,KAAKF,GAAO,KAAK,SACR,CAAC,CAAC,QAEzBI,IAAmB,KAAKJ,GAAO,aAAa,IAAIE,GAEhDW,IAAgBT,IAAmBQ;EAIzC,IAFA,KAAKZ,GAAO,UAAU,OAAO,mBAAmBa,CAAY,GAExD,CAACA,GACD;EAGJ,IAAMC,IAAc3C,EAAM;EAC1B,IAAI2C,KAAe,GAAG;EAEtB,IAAMC,IAAc,KAAK,IAAI,KAAK,IAAmBJ,IAAaP,IAA5BU,GAA+CA,CAAW,GAAG,EAAE;EACrG,EAAM,MAAM,SAAS,GAAGC,EAAY;EAEpC,IAAMC,IAAmB5E,EAAK,WACxB6E,IAAe,KAAK,IAAIT,IAAgB,KAAKR,GAAO,WAAW,aAAa,GAAG,CAAC,GAElFkB,IAAW;EACf,AAAID,IAAe,MACf,IAAYD,IAAmBC,KAAiBH,IAAcC;EAGlE,IAAMI,IAAcL,IAAcC;EAOlC,AANIG,IAAW,MAAG,IAAW,IACzBA,IAAWC,MAAa,IAAWA,IAEvC,EAAM,MAAM,MAAM,GAAGD,EAAS,KAE9B,KAAKnD,GAAU,IAAI,WAAYiD,KAAoB,GACnD,KAAKjD,GAAU,OAAO,WAAYiD,KAAoBC,IAAe;CACzE;CAEA,WAAc;EA6DV,AA3DA,KAAKlD,GAAU,MAAM,iBAAiB,cAAc,MAAM;GACtD,IAAI,EAAE,WAAW,GAAG;GAMpB,AALA,EAAE,gBAAgB,GAClB,EAAE,eAAe,GACjB,KAAKG,KAAY,IAEjB,KAAKkD,KAAU,EAAE,SACjB,KAAKC,KAAiB,WAAW,KAAKtD,GAAU,MAAM,MAAM,GAAG,KAAK;GAIpE,IAAMoD,IAHY,KAAKpD,GAAU,MAAM,sBACX,CAAC,CAAC,SACV,KAAKA,GAAU,MAAM,cAGnC6B,KAAe,MAAc;IAE/B,IADI,CAAC,KAAK1B,MACNiD,KAAe,GAAG;IAGtB,IAAMG,IAASzB,EAAU,UAAU,KAAKuB,IACpCG,IAAiB,KAAKF,KAAiBC;IAK3C,AAHIC,IAAiB,MAAG,IAAiB,IACrCA,IAAiBJ,MAAa,IAAiBA,IAEnD,KAAKpD,GAAU,MAAM,MAAM,MAAM,GAAGwD,EAAe;IAEnD,IAAMC,IAAQD,IAAiBJ,GAEzBM,IAAW,KAAKzB,GAAO,aAAa,GACpCY,KAAc,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,MAC3E,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjD,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,gBAAgB,IAEpD0B,IAAkB,KAAK,MAAMd,IAAaa,CAAS,GAEnD,EAAE,kBAAe,KAAKhB,GAAc,GACpCkB,IAAY,KAAK,MAAMH,KAAStB,IAAawB,IAAkB,EAAE;IAEvE,KAAK1B,GAAO,WAAW,gBAAgB2B,CAAS;IAEhD,IAAM,EAAE,qBAAkB,qBAAkB,KAAKlB,GAAc,GACzDO,IAAmB,KAAKjD,GAAU,UAAU,WAC5CkD,IAAe,KAAK,IAAIT,IAAgB,KAAKR,GAAO,WAAW,aAAa,GAAG,CAAC;IAGtF,AADA,KAAKjC,GAAU,IAAI,WAAYiD,KAAoB,GACnD,KAAKjD,GAAU,OAAO,WAAYiD,KAAoBC,IAAe;GACzE,GAEMnB,UAAkB;IAGpB,AAFA,KAAK5B,KAAY,IACjB,SAAS,oBAAoB,aAAa0B,CAAW,GACrD,SAAS,oBAAoB,WAAWE,CAAS;GACrD;GAGA,AADA,SAAS,iBAAiB,aAAaF,CAAW,GAClD,SAAS,iBAAiB,WAAWE,CAAS;EAClD,CAAC,GAED,KAAK/B,GAAU,MAAM,iBAAiB,cAAc,MAAM;GACtD,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,KAAKA,GAAU,OAAO;GACzD,IAAM4B,IAAY,KAAK5B,GAAU,MAAM,sBAAsB,GACvDgD,IAAc,KAAKhD,GAAU,MAAM,cAEnCoD,IADc,KAAKpD,GAAU,MAAM,eACPgD;GAElC,IAAII,IAAc,GAAG;IACjB,IAAMS,IAAS,EAAE,UAAUjC,EAAU,MAAOoB,IAAc,GACpDS,IAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGI,IAAST,CAAW,CAAC,GAErD,EAAE,kBAAe,KAAKV,GAAc,GACpCkB,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMH,KAAStB,IAAa,EAAE,GAAGA,IAAa,CAAC,CAAC;IAG5F,AAAIyB,KAAa,KAAK,KAAK3B,GAAO,cAAc,OAAO,KAAKA,GAAO,WAAW,mBAAoB,cAC9F,KAAKA,GAAO,WAAW,gBAAgB2B,GAAW,KAAK;GAE/D;GACA,KAAK,QAAQ;EACjB,CAAC;EAED,IAAIE,IAAiB,MAEfC,KAAyB,MAAc;GACzC,IAAID,GAAgB;GAEpB,IAAME,UAAmB;IACrB,IAAMC,IAAW,KAAKhC,GAAO,cAAc,eAAe;IAM1D,IAJI,CAACgC,KAAYA,EAAS,QAAQ,QAAQ,KAAA,KAItCC,MAAc,UAAU,KAAKjC,GAAO,UAAU,GAC9C;IAGJ,IAAMkC,IAAa,SAASF,EAAS,QAAQ,KAAK,EAAE,GAC9CL,IAAYM,MAAc,SAASC,IAAW,IAAI,KAAK,IAAI,GAAGA,IAAW,CAAC;IAEhF,KAAKlC,GAAO,WAAW,gBAAgB2B,GAAW,YAAY;KAC1D,KAAK,QAAQ;IACjB,CAAC;GACL;GAGA,AADAI,EAAW,GACX,IAAiB,YAAYA,GAAY,GAAG;EAChD,GAEMI,UAA6B;GAC/B,AAEIN,OADA,cAAcA,CAAc,GACX;EAEzB;EAcA,AAZA,KAAK9D,GAAU,IAAI,iBAAiB,cAAc,MAAM;GACpD,AAAI,EAAE,WAAW,KACjB+D,EAAsB,IAAI;EAC9B,CAAC,GAED,KAAK/D,GAAU,OAAO,iBAAiB,cAAc,MAAM;GACvD,AAAI,EAAE,WAAW,KACjB+D,EAAsB,MAAM;EAChC,CAAC,GAED,SAAS,iBAAiB,WAAWK,CAAoB,GACzD,KAAKpE,GAAU,IAAI,iBAAiB,cAAcoE,CAAoB,GACtE,KAAKpE,GAAU,OAAO,iBAAiB,cAAcoE,CAAoB;CAC7E;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBpC,CAAmB;;AC3QtE,IAAanL,IAAY;CACxB,IAAI;CACJ,OAAO;CACP,MAAM;CACN,UAAU;AACX,GAEayN,IAAb,MAA6B;CAC5B;CACA;CACA,KAAgB,CAAC;CACjB,qBAAY,IAAI,IAAI;CACpB,KAAc;CAEd,YAAY,GAAO;EAElB,AADA,KAAKrC,KAAShE,GACd,KAAKhF,KAAQ,KAAKgJ,GAAO,YAAY,CAAC,CAAC;CACxC;CAEA,IAAI,UAAU;EACb,OAAO,KAAKsC;CACb;CAEA,IAAI,WAAW;EACd,OAAO,KAAKC;CACb;CAEA,mBAAmB;EAClB,IAAIC,IAAe,CAAC,GACdC,IAAc,KAAKzC,GAAO;EAUhC,AATIyC,KACHA,EAAY,iBAAiB,6BAA2B,CAAC,CAAC,SAAS,MAAQ;GAC1E,IAAMC,IAAOC,EAAI,cAAc,sBAAoB;GACnD,AAAID,KAAQA,EAAM,QAAQ,QACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI;EAEtC,CAAC,GAGF,KAAKJ,KAAgBE;CACtB;CAEA,QAAQ;EAEP,IAAI,KAAKI,IAAa;EACtB,KAAKA,KAAc;EAEnB,IAAIJ,IAAe,CAAC,GACdC,IAAc,KAAKzC,GAAO;EAchC,AAbIyC,KACHA,EAAY,iBAAiB,6BAA2B,CAAC,CAAC,SAAS,MAAQ;GAC1E,IAAMC,IAAOC,EAAI,cAAc,sBAAoB;GACnD,AAAID,KAAQA,EAAM,QAAQ,QACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI;EAEtC,CAAC,GAGF,KAAKJ,KAAgBE,GAErB,KAAKI,KAAc,IACnB,KAAK5C,GAAO,UAAU,CAAC,GACvB,KAAKA,GAAO,KAAK,QAAQ;CAC1B;CAEA,QAAQ;EAKP,AAJA,KAAKsC,KAAgB,CAAC,GACtB,KAAKC,GAAU,MAAM,GACrB,KAAKK,KAAc,IACnB,KAAK5C,GAAO,UAAU,CAAC,GACvB,KAAKA,GAAO,KAAK,QAAQ;CAC1B;CAEA,YAAY,GAAK;EAChB,KAAKuC,KAAY3H;CAClB;CAEA,kBAAkB,GAAS;EAC1B,OAAO,KAAK2H,GAAU,IAAIM,CAAO,KAAK,CAAC;CACxC;CAEA,mBAAmB,GAAS;EAC3B,IAAMC,IAAS,KAAK,kBAAkBD,CAAO,GACvCE,IAAc,KAAK/L,GAAM;EAC/B,OAAO8L,EAAO,KAAI,MAASC,EAAY,SAASxK,CAAK,CAAC,CAAC,CAAC,OAAO,OAAO;CACvE;AACD,GAEayK,IAAb,MAAaA,EAAS;CAErB,OAAO,MAAM,GAAY,IAAe,CAAC,GAAG,IAAS,CAAC,GAAG;EACxD,IAAI,CAACR,KAAgBA,EAAa,WAAW,GAC5C,OAAO;GAAE,SAAS,CAAC;GAAG,aAAa,CAAC;GAAG,0BAAU,IAAI,IAAI;EAAE;EAG5D,IAAMS,IAAWC,EAAW,QAAO,MAAK,CAACxK,EAAE,MAAM,OAAO,GAClDyK,oBAAW,IAAI,IAAI,GAEnBC,IAAaJ,EAASK,GAAgBJ,GAAUT,GAAczK,CAAM,GACpEuL,IAAa,CAAC,GACdC,IAAc,CAAC;EAIrB,OAFAP,EAASQ,GAAaJ,GAAY,GAAGZ,GAAcc,GAAYC,GAAaJ,GAAU,EAAE,GAEjF;GAAE,SAASG;GAAY;GAAa;EAAS;CACrD;CAEA,OAAOE,GAAa,GAAY,GAAO,GAAc,GAAW,GAAa,GAAU,GAAU;EAChG,IAAIC,IAAU,GACRC,IAAeC,MAAUnB,EAAa,SAAS;EAErD,KAAK,IAAI,CAACoB,GAAUC,MAAoBC,EAAW,QAAQ,GAAG;GAC7D,IAAMjB,IAAUkB,IAAW,GAAGA,EAAS,GAAG,QAAc,KAAK,OAEvDjB,IAASE,EAASgB,GAAmBH,CAAe;GAC1D,EAAS,IAAIhB,GAASC,CAAM;GAE5B,IAAMmB,IAAc,CAAC;GAiBrB,AAhBA,EAAYrP,EAAU,MAAMiO,GAC5B,EAAYjO,EAAU,SAAS+O,GAC/B,EAAY/O,EAAU,QAAQgP,GAC9B,EAAYhP,EAAU,YAAYkO,GAElC,EAAY,kBAAkB,IAC9B,EAAY,YAAYD,GAExBqB,EAAU,KAAKD,CAAW,GAE1BV,EAAY,KAAK;IAChB,MAAM;IACN,QAAQU;IACC;GACV,CAAC,GAEG,CAACP,KAAeG,aAA2B,MAC9Cb,EAASQ,GAAaK,GAAiBF,IAAQ,GAAGnB,GAAc0B,GAAWX,GAAaJ,GAAUN,CAAO,IAGzGG,EAD6BmB,GAAoBN,CACvC,CAAC,CAAC,SAAQ,MAAU;IAK7B,AAJA,EAAO,kBAAkB,IACzB,EAAO,YAAYhB,GACnBqB,EAAU,KAAKtL,CAAM,GAErB2K,EAAY,KAAK;KAChB,MAAM;KACE;KACC;IACV,CAAC;GACF,CAAC;EAEH;CACD;CAEA,OAAOF,GAAgB,GAAS,GAAc,GAAQ;EACrD,IAAMzL,IAAWG,EAAO,QAAQyK,EAAa,EAAE,GACzC4B,IAAgB5B,EAAa,MAAM,CAAC,GACpC5H,oBAAM,IAAI,IAAI;EAQpB,IANAvB,EAAQ,SAAQ,MAAU;GACzB,IAAMgL,IAAMzM,KAAY,IAAIgB,EAAO,EAAEhB,KAAY;GAEjD,AADKgD,EAAI,IAAIyJ,CAAG,KAAGzJ,EAAI,IAAIyJ,GAAK,CAAC,CAAC,GAClCzJ,EAAI,IAAIyJ,CAAG,CAAC,CAAC,KAAKzL,CAAM;EACzB,CAAC,GAEGwL,EAAc,SAAS,GAAG;GAC7B,IAAMtK,oBAAS,IAAI,IAAI;GACvB,KAAK,IAAI,CAACuK,GAAKC,MAAe1J,EAAI,QAAQ,GACzC,EAAO,IAAIyJ,GAAKrB,EAASK,GAAgBiB,GAAYF,GAAerM,CAAM,CAAC;GAE5E,OAAO+B;EACR;EACA,OAAOc;CACR;CAEA,OAAOoJ,GAAmB,GAAiB;EAC1C,IAAIlB,IAAS,CAAC;EACd,IAAIe,aAA2B,KAC9B,KAAK,IAAIU,KAAUV,EAAgB,OAAO,GACzC,IAASf,EAAO,OAAOE,EAASgB,GAAmBO,CAAM,CAAC;OAErD,AAAI,MAAM,QAAQV,CAAe,MACvC,IAASf,EAAO,OAAOe,EAAgB,KAAI,MAAKW,EAAE,MAAM,SAASA,EAAE,GAAG,IAAI,EAAE,CAAC;EAE9E,OAAO1B;CACR;CAEA,OAAOqB,GAAoB,GAAiB;EAC3C,IAAI9K,IAAU,CAAC;EACf,IAAIwK,aAA2B,KAC9B,KAAK,IAAIU,KAAUV,EAAgB,OAAO,GACzC,IAAUxK,EAAQ,OAAO2J,EAASmB,GAAoBI,CAAM,CAAC;OAExD,AAAI,MAAM,QAAQV,CAAe,MACvC,IAAUxK,EAAQ,OAAOwK,CAAe;EAEzC,OAAOxK;CACR;AACD,GCnMaoL,IAAb,MAAwB;CACpB,KAAoB;CAEpB;CACA;CACA;CAEA,qBAAsB,IAAI,IAAI;CAE9B,KAAkB;CAClB,KAAe;CACf;CAEA,KAAwB;CACxB,KAAa;CAEb,YAAY,GAAO;EAIf,AAHA,KAAKzN,KAAQgF,EAAM,YAAY,CAAC,CAAC,MACjC,KAAKgE,KAAShE,GAEd,KAAK0I,GAAoB;CAC7B;CAEA,eAAe;EACX,OAAO,KAAK1E,GAAO,SAAS;CAChC;CAEA,WAAW,IAAQ,OAAU;EAEzB,IAAI,CAAC,KAAKA,GAAO,UAAU,SAAS,QAAQ,GAAG;EAE/C,IAAM2E,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,AAAK2E,OAEoB,CAAC,KAAK3E,GAAO,SAAS,UAAU,KAAKA,GAAO,SAAS,UAAU,OAGpF,KAAK4E,GAAuB,GACxB,KAAK5E,GAAO,SAAS,UAAU,KAAKA,GAAO,SAAS,SAAS,KAC7D,KAAK6E,GAAqB,IAKlC,KAAKC,GAAcH,EAAa,WAAWI,CAAK,GAEhD,KAAK/E,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ;CAChE;CAEA,MAAiB,GAAW,IAAQ,OAAU;EAE1C,IAAI,KAAKgF,IAAY;GACjB,KAAKC,GAAqBC,GAAWH,CAAK;GAC1C;EACJ;EAEA,IAAMtD,IAAY,KAAKzB,GAAO,SAAS;EACvC,IAAI,CAACyB,KAAaA,KAAa,GAAG;EAElC,IAAMxB,IAAc,KAAKD,GAAO,KAAK,SAAS,GACxCE,IAAaD,EAAY;EAE/B,IAAIC,MAAe,GAAG;GAClB,KAAKF,GAAO,SAAS,aAAa,MAAM,SAAS;GACjD;EACJ;EAEA,IAAMU,KAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,KAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,cAEnCY,IAAa,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,GACzEmF,IAAwB,KAAK,IAAIjF,IAAauB,KAAab,IAAaF,IAAce,KAAaA,GAAW,CAAC,GAE/GpB,IAAqB,MACrBC,IAAa6E,IAAwB9E,GAEvCE,IAAc,GACd6E,IAAqBD;EAQzB,AANI7E,MACA,IAAcD,IAAqB8E,GACnC,IAAqB9E,IAIzB,KAAKL,GAAO,SAAS,aAAa,MAAM,SAAS,GAAGoF,EAAmB;EAEvE,IAAMC,IAAkB/E,IAAc4E,IAAY3E,IAAe2E,GAE3DI,IAAgB,KAAK,IAAI,GAAGpF,IAAa,CAAC,GAC1CqF,IAAmB,KAAK,IAAIF,GAAiBF,CAAqB,GAClEK,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMD,IAAmB9D,CAAS,GAAG6D,CAAa,CAAC;EAUhG,KAAKtF,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,YACvC,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,YACvC,KAAKA,GAAO,SAAS,MAAM,MAAM,KAAK,MAAM,YAAY,qBAAqBuF,IAAmB9D,EAAU;EAGlH,IAAMgE,IAAU,KAAKC,GAAS,SACxBC,IAAoBF,KAAWA,EAAQ,QAAQ,QAAQ,KAAA,IAAY,SAASA,EAAQ,QAAQ,KAAK,EAAE,IAAI;EAE7G,CAAKV,KAASY,MAAsBH,OAIpC;GACI,KAAKxF,GAAO,SAAS,KAAK,MAAM;GAChC,KAAKA,GAAO,SAAS,KAAK,MAAM;GAChC,KAAKA,GAAO,SAAS,MAAM,MAAM;EACrC,CAAC,CAAC,SAAS,GAAQ,MAAa;GAC5B,AAAK4F,KAILA,EAFoB,iBAAiB,eAElC,CAAC,CAAC,SAAS,GAAK,MAAU;IACzB,IAAMC,IAAYL,IAAa,KAAK,MAAM/L,IAAQ,KAAKuG,GAAO,SAAS,MAAM;IAE7E,IAAI6F,KAAa3F,GAAY;KAIzB,AAHA,EAAI,MAAM,UAAU,QACpB,EAAI,QAAQ,YAAY,MACxB,EAAI,QAAQ,MAAM,MAClB,EAAI,QAAQ,QAAQ;KACpB;IACJ;IAEA,IAAMtH,IAASqH,EAAY4F;IAE3B,IAAI,CAACjN,GAAQ;KACT,EAAI,MAAM,UAAU;KACpB;IACJ;IAEA,IAAML,IAAQK,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM;IAI/C,AAFA,EAAI,MAAM,UAAU,IAEpB,KAAKoP,GAAanD,GAAK/J,GAAQL,GAAOsN,CAAS;GACnD,CAAC;EACL,CAAC,GAED,KAAK7F,GAAO,UAAU,QAAQ;CAClC;CAGA,MAAwB,GAAW,IAAQ,OAAU;EAEjD,IAAM+F,IAAiB,KAAK/F,GAAO,KAAK,SAAS,KAAK,CAAC,GACjDgG,IAAoBD,EAAe;EAEzC,IAAIC,MAAsB,GAAG;GACzB,KAAKhG,GAAO,SAAS,aAAa,MAAM,SAAS;GACjD;EACJ;EAGA,IAAMiG,IAAc,KAAKjG,GAAO,cAAc,uCAAuC,GAC/EkG,IAAiB,KAAKlG,GAAO,kBAAkB,GAE/CmG,KAAiB,MAAS;GAC5B,IAAIhP,EAAK,SAAS,SAAS;IACvB,IAAMwM,IAAQxM,EAAK,OAAOtC,EAAU,UAAU;IAE9C,OADoB,KAAKmL,GAAO,SAAS,OAAO2D,MAAU,KAAK3D,GAAO,SAAS,SAASkG;GAE5F;GAAO;IACH,IAAIE,IAAiB,GACfF,IAAiB,KAAKlG,GAAO,kBAAkB,GAEjDqG,IAAoB;IACxB,KAAI,IAAItM,IAAI,GAAGA,IAAImM,IAAiB,GAAG,KACnC,KAAqB,KAAKlG,GAAO,SAAS,QAAQjG,MAAM;IAI5D,OAFA,IAAiB,KAAKiG,GAAO,SAAS,SAASqG,GAExCD,IAAiB,IAAIA,IAAiB,KAAKpG,GAAO,SAAS;GACtE;EACJ,GAGIoF,IAAqB,GACnBkB,IAAkB,MAAMN,CAAiB;EAC/C,KAAK,IAAIjM,IAAI,GAAGA,IAAIiM,GAAmB,KAAK;GACxC,IAAM9P,IAAIiQ,EAAcJ,EAAehM,EAAE;GAEzC,AADA,EAAYA,KAAK7D,GACjB,KAAsBA;EAC1B;EAEA,KAAK8J,GAAO,SAAS,aAAa,MAAM,SAAS,GAAGoF,EAAmB;EAEvE,IAAMmB,IAAuB,KAAKvG,GAAO,cAErCwG,IAAoB,GACpBhB,IAAa;EAEjB,KAAK,IAAIzL,IAAI,GAAGA,IAAIiM,GAAmB,KAAK;GACxC,IAAM9P,IAAIoQ,EAAYvM;GACtB,IAAIyM,IAAoBtQ,IAAIgP,GAAW;IACnC,IAAanL;IACb;GACJ;GAEA,AADA,KAAqB7D,GACrB,IAAa6D;EACjB;EAEA,IAAM0M,IAAUvB,IAAYsB;EAC5B,AAAIP,KACAA,EAAY,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAW;GACtD,EAAO,MAAM,MAAM,IAAI,KAAK,IAAI,GAAGQ,CAAO,EAAE;EAChD,CAAC;EAGL,IAAMhB,IAAU,KAAKC,GAAS,SACxBC,IAAoBF,KAAWA,EAAQ,QAAQ,iBAAiB,KAAA,IAChE,SAASA,EAAQ,QAAQ,cAAc,EAAE,IACzC;EAEN,IAAI,CAACV,KAASY,MAAsBH,GAChC;EAGJ,IAAMkB,IAAmB,KAAK,KAAKH,KAAwB,KAAKvG,GAAO,SAAS,SAASkG,EAAe,GAClGS,KAAiB,KAAK3G,GAAO,SAAS,SAAS,UAAU,KAAK,IAC9D4G,IAAcpB,GACdqB,IAAY,KAAK,IAAIb,GAAmBR,IAAakB,IAAmBC,CAAa,GACrFG,IAAgBf,EAAe,MAAMa,GAAaC,CAAS;EAmEjE,AAjEA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAME,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,IAAI,CAACD,GAAW;GAEhB,IAAME,IAAM,MAAM,KAAKF,EAAU,iBAAiB,eAAe,CAAC;GAElE,KAAK,IAAIhN,IAAI,GAAGA,IAAIkN,EAAI,QAAQ,KAAKf,GAAgB;IACjD,IAAMgB,IAAY,KAAK,MAAMnN,IAAImM,CAAc,GACzC/O,IAAO2P,EAAcI,IACrBC,IAAWF,EAAI,MAAMlN,GAAGA,IAAImM,CAAc;IAEhD,IAAI,CAAC/O,KAAQ+P,KAAaJ,EAAc,QAAQ;KAC5C,EAAS,SAAQ,MAAM;MAInB,AAHA,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;KACvB,CAAC;KACD;IACJ;IAEA,IAAMjB,IAAYL,IAAa0B;IAE/B,EAAS,SAAS,GAAI,MAAW;KAC7B,IAAME,IAAe5B,IAAa0B;KAElC,AADA,EAAG,QAAQ,eAAeE,GAC1B,EAAG,QAAQ,MAAOjQ,EAAK,SAAS,SAAU0O,IAAY;KAEtD,IAAMwB,IAAYC,EAAG,aAAa,UAAU,MAAM;KAElD,IAAInQ,EAAK,SAAS,SACd,AAAIkQ,KAEIE,MADUpQ,EAAK,OAAOtC,EAAU,UAEhC,EAAG,MAAM,UAAU,IACnB,KAAK2S,GAAkBF,GAAIvB,GAAgB5O,EAAK,QAAQiQ,CAAY,MAQxE,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;UAGvB,IAAIC,GAIA,AAHA,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;UAChB;MACH,EAAG,MAAM,UAAU;MAEnB,IAAM9O,IAAQpB,EAAK,OAAO,GAAG,SAAS;MACtC,KAAK2O,GAAawB,GAAInQ,EAAK,QAAQoB,GAAO6O,CAAY;KAC1D;IAER,CAAC;GACL;EACJ,CAAC,GAED,KAAKpH,GAAO,UAAU,QAAQ;CAClC;CAEA,MAAqB,GAAK,GAAgB,GAAa,MAAiB;EACpE,IAAMkG,IAAiB,KAAKlG,GAAO,kBAAkB,GAC/CyH,IAAc,SAAS9E,EAAI,QAAQ,QAAQ,EAAE,KAAK,GAClD+E,IAAaN,IAAelB,IAAkBuB,GAE9CE,IAAU1D,EAAYpP,EAAU,WAChC+S,IAAa,KAAK5Q,GAAM,KAAK,SAAS,GACtC6Q,IAAkBF,IAAUA,EAAQ,KAAI,MAAOC,EAAWnQ,EAAI,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC;EAUzF,AAPA,EAAI,QAAQ,eAAe2P,GAC3B,EAAI,QAAQ,MAAM,IAClB,EAAI,QAAQ,YAAYM,GACxB,EAAI,OAAOG,GACX,EAAI,QAAQ,UAAU5D,EAAYpP,EAAU,KAG5C,MAAM,KAAK8N,EAAI,KAAK,CAAC,CAAC,SAAS,MAAU;GAErC,EAAM,QAAQ,MAAMyE;GAEpB,IAAMU,IAAa,MAAM,KAAKpF,EAAM,QAAQ,CAAC,CAAC,MAAK,MAC/CqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,WAAY,UAC5E;GAGA,AAAID,MAAe,KAAA,KAAa,OAAOA,EAAW,WAAY,cAC1DA,GAAY,QAAQ;EAE5B,CAAC;CACL;CAEA,MAAgB,GAAK,GAAQ,GAAO,MAAc;EAC9C,IAAM5B,IAAiB,KAAKlG,GAAO,kBAAkB,GAC/CyH,IAAc,SAAS9E,EAAI,QAAQ,QAAQ,EAAE,KAAK,GAClD+E,IAAa7B,IAAYK,IAAkBuB;EAOjD,AALA,EAAI,QAAQ,QAAQ5B,GACpB,EAAI,QAAQ,MAAMtN,GAClB,EAAI,QAAQ,YAAYmP,GACxB,EAAI,OAAO9O,GAEX,MAAM,KAAK+J,EAAI,KAAK,CAAC,CAAC,SAAS,MAAU;GAQrC,AAPA,EAAM,QAAQ,QAAQkD,GACtB,EAAM,QAAQ,MAAMtN,GAMpB,MAJyB,KAAKmK,EAAM,QAAQ,CAAC,CAAC,MAAK,MAC/CqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,WAAY,UAGnE,CAAC,EAAE,QAAQ;EACxB,CAAC;CACL;CAEA,mBAAmB;EAYf,AAVA,KAAK/C,KAAa,OAAKhF,GAAO,YAAY,cAAc,2BAA2B,GAGnF,KAAKgI,GAAoB,MAAM,GAE/B,KAAKtC,KAAW;GACZ,cAAc,KAAK1F,GAAO,iBAAiB,sBAAsB;GACjE,SAAS,KAAKA,GAAO,cAAc,iDAAiD;EACxF,GAEA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAM+G,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,IAAI,CAACD,GAAW;GAEhB,IAAMkB,IAAUlB,EAAU,cAAc,OAAO;GAC/C,IAAI,CAACkB,GAAS;GAEd,IAAMC,IAAQD,EAAQ,cAAc,YAAY;GAChD,IAAI,CAACC,GAAO;GAGZ,IAAMC,IADM,MAAM,KAAKD,EAAM,iBAAiB,IAAI,CAC5B,CAAC,CAAC,KAAI,MAAMZ,EAAG,UAAU,EAAI,CAAC;GACpD,KAAKU,GAAoB,IAAIhB,GAAUmB,CAAW;EACtD,CAAC;EAED,IAAMxD,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAE/D,AAAI2E,MACA,KAAKyD,KAAezD,EAAa,cAGjC,KAAKC,GAAuB,GAC5B,KAAKC,GAAqB,GAC1B,KAAKC,GAAcH,EAAa,WAAW,EAAI,GAE/CA,EAAa,iBAAiB,WAAW,MAAM;GAO3C,IALA,KAAK3E,GAAO,iBAAiB,kBAAkB,CAAC,CAAC,SAAQ,MAAO;IAC5D,EAAI,UAAU,OAAO,QAAQ;GACjC,CAAC,GAGG,KAAKqI,IAAuB;GAEhC,IAAM5G,IAAY,KAAKzB,GAAO,SAAS,UAAU;GAIjD,CAHmB,KAAKA,GAAO,KAAK,SAAS,CAAC,EAAE,UAAU,KACfyB,KAEdkD,EAAa,iBAI1C,KAAKG,GAAcH,EAAa,SAAS,GAEzC,KAAK3E,GAAO,cAAc,uBAAuB,CAAC,CAAC,QAAQ;EAE/D,GAAG,EAAE,SAAS,GAAK,CAAC;CAE5B;CAEA,gBAAgB,GAAS,IAAQ,OAAO,GAAY;EAEhD,IAAM2E,IAAe,KAAK3E,GAAO,cAAc,gBAAgB,GAGzDE,IADc,KAAKF,GAAO,KAAK,SACR,CAAC,EAAE,UAAU,GAEpC2B,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI2G,GAASpI,IAAa,CAAC,CAAC,GAC3DqI,IAAkB;EAEtB,IAAI,KAAKvD,IAAY;GACjB,IAAM/D,IAAe,KAAK,IAAI0D,EAAa,eAAeA,EAAa,cAAc,CAAC;GAGtF,IADchD,IAAY,KAAK,IAAIzB,IAAa,GAAG,CAAC,IAC1Be;EAC9B,OAAO;GAEH,IAAMQ,IAAY,KAAKzB,GAAO,SAAS,QACjCwI,IAAqB7G,IAAYF,GAEjCf,KAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,KAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,cAEnCY,IAAa+D,EAAa,gBAAgB,GAC1CQ,IAAwB,KAAK,IAAIjF,IAAauB,IAAYf,IAAcE,GAAY,CAAC,GAErFP,IAAqB,MACrBC,IAAa6E,IAAwB9E,GAEvCE,IAAc;GAKlB,AAJID,MACA,IAAcD,IAAqB8E,IAGvC,IAAkBqD,IAAqBjI;EAC3C;EAMA,AAJA,KAAK8H,KAAwB,IAC7B,EAAa,YAAYE,GACzB,KAAKzD,GAAcyD,CAAe,GAElC,4BAA4B;GACxB,4BAA4B;IAExB,AADA,KAAKF,KAAwB,IACzB,OAAOI,KAAe,cAAYA,EAAW;GACrD,CAAC;EACL,CAAC;CACL;CAIA,gBAAgB;EACZ,AAEI,KAAKxK,QADL,KAAKA,GAAgB,WAAW,GACT;CAE/B;CAEA,WAA+B;EAC3B,KAAKyK,GAAgB;CAsBzB;CAEA,WAAwB;EAEpB,IAAI,KAAKN,KAAe,KAAK,KAAKpI,GAAO,SAAS,SAAS,GAAG;GAC1D,IAAM2I,IAAc,KAAK,KAAK,KAAKP,KAAe,KAAKpI,GAAO,SAAS,MAAM,GAEzE2G,IAAgB,KAAKiC;GACzB,IAAI,KAAK5D,MAAc,KAAKhF,GAAO,UAAU;IACzC,IAAM6I,IAAa,KAAK7I,GAAO,SAAS,SAAS,UAAU;IAC3D,KAAkB6I,IAAa;GACnC;GAEA,KAAKC,KAAkBH,IAAchC;EACzC;CACJ;CAEA,WAA6B;EASzB,AAPA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAMI,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,AAAID,KAAaA,EAAU,cAAc,OAAO,KAC5C,KAAKgC,GAAYhC,CAAS;EAElC,CAAC,GAED,KAAKiC,GAAgB;CACzB;CAEA,MAAe,MAAc;EAEzB,IAAIC,IAAkB;EACtB,AAAIlC,EAAU,UAAU,SAAS,mBAAmB,IAAG,IAAkB,SAChEA,EAAU,UAAU,SAAS,oBAAoB,MAAG,IAAkB;EAE/E,IAAMoB,IAAc,MAAM,KAAK,KAAKnI,GAAO,YAAY,iBAAiB,eAAe,CAAC,CAAC,CAAC,KAAI,MAAM;GAChG,IAAMkJ,IAAW5B,EAAG,UAAU,EAAI;GAiBlC,OAdI2B,MAAoB,SACpBC,EAAS,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAS;IAChD,AAAIxG,EAAM,aAAa,OAAO,MAAM,UAAQA,EAAM,OAAO;GAC7D,CAAC,IACMuG,MAAoB,UAC3BC,EAAS,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAS;IAChD,AAAIxG,EAAM,aAAa,OAAO,MAAM,WAASA,EAAM,OAAO;GAC9D,CAAC,IAEDwG,EAAS,iBAAiB,6BAA6B,CAAC,CAAC,SAAQ,MAAS;IACtE,EAAM,OAAO;GACjB,CAAC,GAGEA;EACX,CAAC;EAED,IAAIf,EAAY,WAAW,GAAG;EAE9B,IAAMgB,IAAcpC,EAAU,cAAc,YAAY;EAExD,EAAY,iBAAiB,IAAI,CAAC,CAAC,SAAQ,MAAMO,EAAG,OAAO,CAAC;EAE5D,IAAM8B,IAAW,SAAS,uBAAuB;EACjD,KAAK,IAAIrP,IAAI,GAAGA,IAAI,KAAK+O,IAAiB,KACtC,EAAY,SAAQ,MAAQM,EAAS,YAAYC,EAAK,UAAU,EAAI,CAAC,CAAC;EAM1E,AAFAF,EAAY,YAAYC,CAAQ,GAE5BrC,EAAU,UAAU,SAAS,mBAAmB,MAChD,KAAKrB,GAAS,UAAUyD,EAAY,cAAc,IAAI;CAE9D;CAIA,WAAwB;EACpB,IAAMG,IAAY,KAAKtJ,GAAO,cAAc,yCAAyC,GAC/EuJ,IAAY,KAAKvJ,GAAO,cAAc,yCAAyC,GAC/EwJ,IAAa,KAAKxJ,GAAO,cAAc,0CAA0C;EAEvF,IAAIuJ,GAAW;GACX,IAAME,IAAWH,IAAY,MAAM,KAAKA,EAAU,iBAAiB,UAAU,CAAC,IAAI,CAAC,GAC7EI,IAAW,MAAM,KAAKH,EAAU,iBAAiB,UAAU,CAAC,GAC5DI,IAAYH,IAAa,MAAM,KAAKA,EAAW,iBAAiB,UAAU,CAAC,IAAI,CAAC,GAEhFI,IAAU,KAAK,IAAIH,EAAS,QAAQC,EAAS,QAAQC,EAAU,MAAM;GAE3E,KAAK,IAAI5P,IAAI,GAAGA,IAAI6P,GAAS,KAAK;IAC9B,IAAMC,IAAU;KACZJ,EAAS1P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/C2P,EAAS3P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/C4P,EAAU5P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;IACpD,GACM+P,IAAY,KAAK,IAAI,GAAGD,CAAO;IAErC,AAAIC,IAAY,MACRL,EAAS1P,OAAI,EAASA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU,MACrDJ,EAAS3P,OAAI,EAASA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU,MACrDH,EAAU5P,OAAI,EAAUA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU;GAEnE;EACJ;CACJ;CAEA,WAA4B;EAExB,AAAK,KAAK9J,MAAY,KAAKA,cAAkB,gBAE7C,KAAK/B,KAAkB,IAAI,gBAAgB,MAAY;GACnD,KAAK,IAAM8L,KAASC,GAAS;IAGzB,IAAI,CADYD,EAAM,OACT,UAAU,SAAS,QAAQ,GAAG;IAE3C,IAAME,IAASF,EAAM,YAAY;IAOjC,AANcA,EAAM,YAAY,QAEpB,KAAK,KAAK/J,GAAO,gBACzB,KAAKA,GAAO,QAAQ,EAAI,GAGxBiK,IAAS,KAAK,KAAK7B,OAAiB6B,MACpC,KAAK7B,KAAe6B,GAEpB,KAAKvB,GAAgB,GAEjB,KAAK1I,GAAO,SAAS,WAAW,SAChC,KAAK6E,GAAqB,GAC1B,KAAK,QAAQ;GAGzB;EACJ,CAAC,GAED,KAAK5G,GAAgB,QAAQ,KAAK+B,EAAM;CAC5C;AACJ,GC9nBakK,IAAb,MAAaA,EAAc;CAEvB,OAAO,QAAQ,GAAW;EAEtB,IAAMC,IAASC,EAAU,UAAU,EAAI;EASvC,OAPAF,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GACvED,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,kCAAgC,CAAC,GAC7FD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,wCAAsC,CAAC,GACnGD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GAEvED,EAAcG,GAAmBF,CAAM,GAEhCA;CACX;CAEA,OAAO,UAAU,GAAQ;EAUrB,OAPAD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GACvED,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,kCAAgC,CAAC,GAC7FD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,wCAAsC,CAAC,GACnGD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GAEvED,EAAcG,GAAmBF,CAAM,GAEhCA;CACX;CAEA,OAAOE,GAAmB,GAAQ;EAE9B,EAAO,iBAAiB,cAAc,CAAC,CAAC,SAAS,GAAM,MAAM;GACzD,EAAK,aAAa,YAAYtQ,CAAC;GAC/B,IAAMuQ,IAAQC,EAAK,aAAa,OAAO;GAEvC,EAAO,iBAAiB,cAAcxQ,EAAE,GAAG,CAAC,CAAC,SAAQ,MAAO;IACxD,IAAQgO,EAAI,aAAa,SAASuC,CAAK,IAAIvC,EAAI,gBAAgB,OAAO;GAC1E,CAAC;EACL,CAAC;CACL;CAEA,OAAO,cAAc,GAAQ,GAAK;EAE9B,IAAMyC,IAAOL,EAAO,iBAAiB,cAAc,GAC7CM,IAAO,MAAM,KAAK,EAAE,QAAQxD,EAAI,OAAO,SAAS,MAAMuD,EAAK,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;EAEnF,EAAI,SAAS,GAAK,MAAU;GAExB,EAAI,QAAQ,SAAS/Q;GAErB,IAAI7B,IAAW;GAEf,EAAI,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAS;IAE5C,OAAOA,IAAW4S,EAAK,UAAUC,EAAKhR,EAAM,CAAC7B,OAAc,OACvD;IAGJ,EAAM,QAAQ,MAAMA;IAEpB,IAAM8S,IAAUhI,EAAM,WAAW,GAC3BiI,IAAUjI,EAAM,WAAW;IAEjC,KAAK,IAAI8B,IAAI,GAAGA,IAAIkG,GAAS,KACzB,KAAK,IAAIE,IAAI,GAAGA,IAAID,GAAS,KACzB,AAAIlR,IAAQ+K,IAAIyC,EAAI,UAAUrP,IAAWgT,IAAIJ,EAAK,WAC9C,EAAK/Q,IAAQ+K,EAAE,CAAC5M,IAAWgT,KAAKlI;IAK5C,KAAYiI;GAChB,CAAC;EACL,CAAC;CACL;AAEJ,GC9EaE,IAAb,MAA2B;CAC1B;CACA;CACA,KAAS;EAAE,UAAU;EAAI,UAAU;EAAI,QAAQ;EAAI,QAAQ;CAAG;CAE9D,YAAY,GAAO;EAIlB,AAHA,KAAK7K,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK8O,GAAY;CAClB;CAEA,GAAc,GAAI;EACjB,IAAI,CAACxD,GAAI,OAAO;GAAE,SAAS;GAAI,aAAa;GAAI,WAAW;EAAG;EAE9D,IAAMgB,IAAU,SAAShB,EAAG,QAAQ,OAAO,EAAE;EAC7C,IAAI,MAAMgB,CAAO,GAAG,OAAO;GAAE,SAAS;GAAI,aAAa;GAAI,WAAW;EAAG;EAEzE,IAAMJ,IAAQZ,EAAG,QAAQ,OAAO,GAG1ByD,IAFM,MAAM,KAAK7C,EAAM,iBAAiB,IAAI,CAE3B,CAAC,CAAC,QAAO,MAAK,SAAS8C,EAAE,QAAQ,OAAO,EAAE,MAAM1C,CAAO,GACxEb,IAAcsD,EAAa,QAAQzD,CAAE,GACrCpB,IAAiB6E,EAAa,SAAS,IAAIA,EAAa,SAAS;EAIvE,OAAO;GAAE;GAAS;GAAa,WAFZzC,IAAUpC,KAAmBuB,KAAe,IAAIA,IAAeH,EAAG,kBAAkBpB;EAE9D;CAC1C;CAEA,SAAS,GAAW,GAAK;EACxB,KAAKlG,GAAO,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAO;GAEhE,AADA2C,EAAI,UAAU,OAAO,gBAAgB,GACrCA,EAAI,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAO;IACxD,EAAI,UAAU,OAAO,gBAAgB;GACtC,CAAC;EACF,CAAC;EAED,IAAMsI,IAAM,KAAKjL,GAAO,cAAc,8CAA8C0H,EAAU,kBAAkBwD,EAAI,GAAG;EACvH,AAAKD,MAELA,EAAI,UAAU,IAAI,gBAAgB,GAClCA,EAAI,QAAQ,IAAI,CAAC,EAAE,UAAU,IAAI,gBAAgB;CAClD;CAEA,SAAS,GAAU,GAAU,GAAQ,GAAQ;EAC5C,IAAIE,IAAK,KAAK,IAAIC,GAAUC,CAAM,GAC9BC,IAAK,KAAK,IAAIF,GAAUC,CAAM,GAC9BE,IAAK,KAAK,IAAIC,GAAUC,CAAM,GAC9BC,IAAK,KAAK,IAAIF,GAAUC,CAAM;EAGlC,AAAI,KAAKzU,GAAM,YAAY,wBAC1B,IAAK,GACL,IAAK;EAGN,IAAM2U,IAAa,KAAK3L,GAAO,iBAAiB,6DAA6D,GAEzG4L,IAAW,IACXC,IAAY;EAEhB,OAAOD,KAAYC,IAAY,IAI9B,AAHA,IAAW,IACX,KAEAF,EAAW,SAAQ,MAAa;GAM/B,MAJyB,KAAK5E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,QAAO,MACrEO,EAAG,MAAM,YAAY,MAGpB,CAAC,CAAC,SAAQ,MAAM;IACxB,IAAM,EAAE,iBAAc,KAAKwE,GAAcxE,CAAE;IAC3C,AAAII,IAAY,KAEhBJ,EAAG,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KAC7C,IAAM4D,IAAM,SAASa,EAAK,QAAQ,KAAK,EAAE;KACzC,IAAI,OAAMb,CAAG,KAEC,KAAKlL,GAAO,cAAc,iBAAiBkL,EAAI,GACrD,CAAC,CAAC,MAAM,YAAY,QAAQ;MACnC,IAAMR,IAAU,SAASqB,EAAK,WAAW,GAAG,EAAE,GACxCpB,IAAU,SAASoB,EAAK,WAAW,GAAG,EAAE,GAExCC,IAAatE,IAAYgD,IAAU,GACnCuB,IAAaf,IAAMP,IAAU;MAInC,IAFuBqB,KAAcb,KAAMzD,KAAa4D,KAAMW,KAAcV,KAAML,KAAOQ,GAErE;OACnB,IAAMQ,IAAM,KAAK,IAAIf,GAAIzD,CAAS,GAC5ByE,IAAM,KAAK,IAAIb,GAAIU,CAAU,GAC7BI,IAAM,KAAK,IAAIb,GAAIL,CAAG,GACtBmB,IAAM,KAAK,IAAIX,GAAIO,CAAU;OAEnC,CAAIC,MAAQf,KAAMgB,MAAQb,KAAMc,MAAQb,KAAMc,MAAQX,OACrD,IAAKQ,GAAK,IAAKC,GAAK,IAAKC,GAAK,IAAKC,GACnC,IAAW;MAEb;KACD;IACD,CAAC;GACF,CAAC;EACF,CAAC;EAGF,IAAMC,KAAY,MAAU,OAAO,SAASC,CAAG,IAASA,IAAL;EAWnD,AATA,KAAKC,KAAS;GACb,UAAUF,EAASnB,CAAE;GACrB,UAAUmB,EAASf,CAAE;GACrB,QAAQe,EAAShB,CAAE;GACnB,QAAQgB,EAASZ,CAAE;EACpB,GAIA,KAAK,OAAO;CACb;CAEA,cAAc;EACb,KAAKc,KAAS;GAAE,UAAU;GAAI,UAAU;GAAI,QAAQ;GAAI,QAAQ;EAAG;CACpE;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CAEA,gBAAgB;EACf,KAAK,OAAO;CACb;CAEA,eAAe;EACd,IAAM,EAAE,aAAU,aAAU,WAAQ,cAAW,KAAKA,IAE9Cb,IAAa,KAAK3L,GAAO,iBAC9B,6DACD;EAYA,AAVA2L,EAAW,SAAQ,MAAa;GAK/B,AAJA5E,EAAU,iBAAiB,8FAA8F,CAAC,CAAC,SAAQ,MAAM;IACxI,EAAG,UAAU,OAAO,YAAY,gBAAgB,mBAAmB,iBAAiB,kBAAkB,gBAAgB;GACvH,CAAC,GAEDA,EAAU,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAM;IAC7D,EAAG,UAAU,OAAO,gBAAgB;GACrC,CAAC;EACF,CAAC,GAEGqE,IAAW,KAAKI,IAAW,KAE/BG,EAAW,SAAS,MAAc;GAKjC,MAJyB,KAAK5E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,QAAO,MACrEO,EAAG,MAAM,YAAY,MAGpB,CAAC,CAAC,SAAQ,MAAM;IACxB,IAAM,EAAE,iBAAc,KAAKwE,GAAcxE,CAAE;IAC3C,AAAII,IAAY,MAGZA,KAAa0D,KAAY1D,KAAa2D,KACzCtE,EAAU,iBAAiB,wBAAwBO,EAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,SAAQ,MAAM;KACtF,EAAG,UAAU,IAAI,UAAU;IAC5B,CAAC,GAMFA,EAAG,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KAC7C,IAAM4D,IAAM,SAASa,EAAK,QAAQ,KAAK,EAAE;KACzC,IAAI,MAAMb,CAAG,GAAG;KAEhB,IAAMR,IAAU,SAASqB,EAAK,WAAW,GAAG,EAAE,GACxCpB,IAAU,SAASoB,EAAK,WAAW,GAAG,EAAE,GAExCC,IAAatE,IAAYgD,IAAU,GACnCuB,IAAaf,IAAMP,IAAU;KAGnC,AADmBqB,KAAcZ,KAAY1D,KAAa2D,KAAUY,KAAcT,KAAYN,KAAOO,MAGrGM,EAAK,UAAU,IAAI,UAAU,GAEzBrE,KAAa0D,KAAUW,EAAK,UAAU,IAAI,cAAc,GACxDC,KAAcX,KAAQU,EAAK,UAAU,IAAI,iBAAiB,GAC1Db,KAAOM,KAAUO,EAAK,UAAU,IAAI,eAAe,GACnDE,KAAcR,KAAQM,EAAK,UAAU,IAAI,gBAAgB;IAC9D,CAAC;GACF,CAAC;EACF,CAAC;CACF;CAEA;CACA;CACA;CACA;CAGA,MAAqB,GAAS,MAAY;EACzC,IAAMU,IAAO,KAAKzM,GAAO,YAAY;EACrC,IAAIyM,KAAQ,OAAOA,EAAK,qBAAsB,YAAY;GACzD,IAAMC,IAAWD,EAAK,kBAAkBE,GAASC,CAAO;GACxD,KAAK,IAAMzX,KAAMuX,GAAU;IAC1B,IAAM9B,IAAIzV,EAAG,QAAQ,QAAQ;IAC7B,IAAIyV,KAAK,KAAK5K,GAAO,SAAS4K,CAAC,KAAKA,EAAE,QAAQ,QAAQ,KAAA,GACrD,OAAOA;GAET;EACD;EAEA,IAAMiC,IAAW,KAAK7M,GAAO,iBAAiB,qFAAqF;EACnI,KAAK,IAAM4K,KAAKiC,GAAU;GACzB,IAAMC,IAAOlC,EAAE,sBAAsB;GACrC,IACC+B,KAAWG,EAAK,QAChBH,KAAWG,EAAK,SAChBF,KAAWE,EAAK,OAChBF,KAAWE,EAAK,QAEhB,OAAOlC;EAET;EACA,OAAO;CACR;CAEA,MAAgB,MAAc;EAI7B,IAAMmC,IAAa,KAAKC,GAAkBnN,EAAU,SAASA,EAAU,OAAO;EAE9E,IADI,CAACkN,KACDA,EAAW,QAAQ,QAAQ,KAAA,KAAaA,EAAW,QAAQ,QAAQ,KAAA,GAAW;EAElF,IAAME,IAAWF,EAAW,QAAQ,IAAI,GAClC,EAAE,WAAW1B,MAAW,KAAKS,GAAcmB,CAAQ,GACnDxB,IAAS,SAASsB,EAAW,QAAQ,KAAK,EAAE;EAElD,AAAI1B,IAAS,MACT,KAAK6B,OAAmB7B,KAAU,KAAK8B,OAAa1B,OAIxD,KAAKyB,KAAiB7B,GACtB,KAAK8B,KAAW1B,GAEhB,KAAK,SAAS,KAAK2B,IAAW,KAAKC,IAAWhC,GAAQI,CAAM;CAC7D;CAEA,WAAmB;EAGlB,SAAS,oBAAoB,aAAa,KAAK6B,EAAY;CAO5D;CAEA,KAAc;EACb,IAAMC,IAAW,KAAKvN,GAAO,cAAc,gBAAgB;EAC3D,AAAKuN,MAIL,SAAS,iBAAiB,WAAW,KAAKC,EAAU,GAEpDD,EAAS,iBAAiB,cAAc,MAAM;GAE7C,IAAI,EAAE,WAAW,GAAG;GAQpB,IAAMxB,IAAO,EAAE,OAAO,QAAQ,QAAQ;GAEtC,IADI,CAACA,KACDA,EAAK,QAAQ,QAAQ,KAAA,KAAaA,EAAK,QAAQ,QAAQ,KAAA,GAAW;GAGtE,AADA,KAAK/L,GAAO,MAAM,aAAa,QAC/B,KAAKA,GAAO,MAAM,mBAAmB;GAErC,IAAMsH,IAAKyE,EAAK,QAAQ,IAAI,GACtB,EAAE,WAAWX,MAAa,KAAKU,GAAcxE,CAAE,GAC/CkE,IAAW,SAASO,EAAK,QAAQ,KAAK,EAAE;GAK9C,AAHA,KAAKqB,KAAYhC,GACjB,KAAKiC,KAAY7B,GAEbJ,IAAW,KACd,KAAKpL,GAAO,MAAM,aAAa,IAC/B,KAAKA,GAAO,MAAM,mBAAmB,OAItC,KAAK,SAASoL,GAAUI,CAAQ,GAChC,KAAK,SAASJ,GAAUI,GAAUJ,GAAUI,CAAQ,GAEpD,KAAK0B,KAAiB9B,GACtB,KAAK+B,KAAW3B,GAGhB,SAAS,iBAAiB,aAAa,KAAK8B,EAAY;EACzD,CAAC;CACF;AACD,GChUaG,IAAb,MAA4B;CAC3B;CACA;CAEA,KAAe;CACf,KAAa;CAEb,YAAY,GAAO;EAIlB,AAHA,KAAKzN,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK8O,GAAY;CAClB;CAEA,IAAI,cAAc;EACjB,OAAO,KAAK4C;CACb;CAEA,IAAI,YAAY,GAAM;EACrB,IAAI,CAAC3B,GAAM;EAKX,AAHA,KAAK2B,KAAe3B,GACpBA,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC,GAElC,KAAK4B,KAAa5B,EAAK,QAAQ,IAAI;EACnC,IAAMrE,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE;EAEhE,KAAK3N,GAAO,UAAU,SAAS0H,GAAW,KAAKgG,GAAa,QAAQ,GAAG;CACxE;CAGA,MAAc,GAAG,MAAS;EAEzB,IAAK3B,GAEL;WAAQ,EAAE,MAAV;IACC,KAAK;KACJ,AAAI,EAAE,WACA,KAAK6B,GAAmB7B,CAAI,KAChCA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC,IAGvD,KAAK8B,GAAoB9B,CAAI,KACjCA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC;KAG7D;IACD,KAAK;KACJ,AAAK,KAAK8B,GAAoB9B,CAAI,KAAM,KAAK6B,GAAmB7B,CAAI,KACnEA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC;KAE5D;IACD,KAAK,aACJ,AAAK,KAAK6B,GAAmB7B,CAAI,KAChCA,EAAK,eAAe;KAAE,QAAQ;KAAW,OAAO;IAAU,CAAC;GAG9D;GAGA,AADA,KAAK,cAAcA,GACnB,KAAK/L,GAAO,UAAU,SAAS,KAAK2N,GAAW,QAAQ,WAAW5B,EAAK,QAAQ,KAAK,KAAK4B,GAAW,QAAQ,WAAW5B,EAAK,QAAQ,GAAG;EAHvI;CAID;CAEA,MAAc,GAAG,MAAS;EACzB,IAAIA,GAAM;GACT,IAAI+B,IAAY;GAChB,QAAQ,EAAE,MAAV;IACC,KAAK;KACJ,AAAI,EAAE,UACD,KAAKC,GAAoBhC,CAAI,MAChC,IAAY;KAOd;IACD,KAAK;KACJ,AAAI,KAAKgC,GAAoBhC,CAAI,MAChC,IAAY;KAEb;IACD,KAAK,WACJ,AAAI,KAAKiC,GAAoBjC,CAAI,MAChC,IAAY;GAGf;GAEA,IAAI+B,GAAW;IAEd,AADA,KAAK,cAAc/B,GACnB,KAAK/L,GAAO,UAAU,SAAS,KAAK2N,GAAW,QAAQ,WAAW5B,EAAK,QAAQ,KAAK,KAAK4B,GAAW,QAAQ,WAAW5B,EAAK,QAAQ,GAAG;IACvI;GACD;EACD;EAEA,IAAMlG,IAAY,SAAS,KAAK8H,GAAW,QAAQ,OAAO,EAAE,GACxDM,IAAiB;EACrB,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,IAAI,EAAE,UAAU;KACf,IAAMvM,IAAkB,KAAKwM,GAAoB;KACjD,IAAiB,KAAK,IAAIrI,IAAYnE,IAAkB,GAAG,CAAC;IAC7D,OACC,IAAiB,KAAK,IAAImE,GAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC;IAE9D;GACD,KAAK;IACJ,IAAiB,KAAK,IAAI6F,GAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC;IAC7D;GACD,KAAK;IACJ,IAAM0B,IAAkB,KAAKwM,GAAoB;IACjD,IAAiB,KAAK,IAAIrI,IAAYnE,IAAkB,GAAG,CAAC;EAE9D;EAEA,IAAIuM,IAAiB,GAAG;EAExB,IAAIvG,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE,GACxDzC,IAAM,SAAS,KAAKwC,GAAa,QAAQ,KAAK,EAAE,GAChDhD,IAAU,SAAS,KAAKgD,GAAa,SAAS,EAAE,KAAK;EAE3D,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,KAAahD;IACb;GACD,KAAK,WACJ;EAEF;EAEA,KAAK1K,GAAO,WAAW,gBAAgBiO,GAAgB,YAAY;GAClE,IAAME,IAAc,KAAKC,GAAU1G,GAAWwD,CAAG;GAEjD,AAAIiD,MACH,KAAK,cAAcA,GACnB,KAAKnO,GAAO,UAAU,SAAS,KAAK2N,GAAW,QAAQ,WAAWQ,EAAY,QAAQ,KAAK,KAAKR,GAAW,QAAQ,WAAWQ,EAAY,QAAQ,GAAG;EAEvJ,CAAC;CACF;CAEA,YAAY,MAAM;EAcjB,IAZI,EAAE,OAAO,YAAY,YACpB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,KAC9B;GAAC;GAAY;GAAa;GAAO;EAAK,CAAC,CAAC,SAAS,EAAE,IAAI,KAKxD;GAAC;GAAO;GAAiB;GAAO;GAAO;EAAO,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,MAKvE,CAAC,KAAKT,MAAgB,CAAC,KAAKC,IAC/B;EAGD,IAAIU;EACJ,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,IAAW,EAAE,WAAW,KAAKC,GAAiB,IAAI,KAAKC,GAAa;IACpE;GACD,KAAK;IACJ,IAAW,KAAKA,GAAa;IAC7B;GACD,KAAK;IACJ,IAAW,KAAKD,GAAiB;IACjC;GACD,KAAK;IACJ,IAAW,EAAE,WAAW,KAAKE,GAAW,IAAI,KAAKC,GAAa;IAC9D;GACD,KAAK;IACJ,IAAW,KAAKA,GAAa;IAC7B;GACD,KAAK,WACJ,IAAW,KAAKD,GAAW;EAE7B;EAIA,AAFA,EAAE,eAAe,GAEb;GAAC;GAAY;GAAa;EAAK,CAAC,CAAC,SAAS,EAAE,IAAI,IACnD,KAAKE,GAAW,GAAGL,CAAQ,IAEnB;GAAC;GAAQ;GAAU;EAAW,CAAC,CAAC,SAAS,EAAE,IAAI,KACvD,KAAKM,GAAW,GAAGN,CAAQ;CAE7B;CAEA,WAAqB;EACpB,IAAMnD,IAAM,SAAS,KAAKwC,GAAa,QAAQ,KAAK,EAAE,GAChD/C,IAAU,SAAS,KAAK+C,GAAa,SAAS,EAAE,KAAK,GACrD7H,IAAY,SAAS,KAAK8H,GAAW,QAAQ,OAAO,EAAE,GACtDjG,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE,GAE1DiB,IAAU1D,IAAMP,GAElB0D,IAAW,KAAKrO,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkBkH,EAAQ,GAAG;EAK7G,OAJA,AACCP,MAAW,KAAKrO,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkB+I,EAAQ,GAAG,GAG9FP;CACR;CAEA,WAAyB;EAExB,IAAMnD,IAAM,SAAS,KAAKwC,GAAa,QAAQ,KAAK,EAAE,GAChD7H,IAAY,SAAS,KAAK8H,GAAW,QAAQ,OAAO,EAAE,GACtDjG,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE,GAE5DU;EACJ,KAAK,IAAI,IAAInD,IAAM,GAAG,KAAK,MAC1B,IAAW,KAAKlL,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkB,EAAE,GAAG,GACnG,AACC2G,MAAW,KAAKrO,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkB,EAAE,GAAG,GAG3F,KANyB;EAS9B,OAAOwI;CACR;CAIA,MAAa,GAAW,MAAQ;EAE/B,IAAM1L,IAAM,KAAK3C,GAAO,cAAc,6BAA6B0H,EAAU,GAAG;EAChF,IAAI,CAAC/E,GAAK;EAEV,IAAMkD,IAAY,SAASlD,EAAI,QAAQ,OAAO,EAAE,GAE5CoK,IAAa,KAAK/M,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkBwD,EAAI,GAAG;EA2B3G,OA1BK6B,MACJ,KAAK/M,GAAO,iBAAiB,6BAA6B0H,EAAU,MAAM,CAAC,CAAC,SAAQ,MAAS;GAC5F,IAAMmH,IAAU,SAASnM,EAAM,QAAQ,KAAK,EAAE,GACxCiI,IAAU,SAASjI,EAAM,SAAS,EAAE,KAAK;GAE/C,AAAIwI,KAAO2D,KAAW3D,IAAM2D,IAAUlE,MACrC,IAAajI;EAEf,CAAC,GAEIqK,MACJ,IAAa,KAAK/M,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkBqF,EAAI,GAAG,GAE7F6B,KACJ,KAAK/M,GAAO,iBAAiB,wBAAwB6F,EAAU,MAAM,CAAC,CAAC,SAAQ,MAAS;GACvF,IAAMgJ,IAAU,SAASnM,EAAM,QAAQ,KAAK,EAAE,GACxCiI,IAAU,SAASjI,EAAM,SAAS,EAAE,KAAK;GAE/C,AAAIwI,KAAO2D,KAAW3D,IAAM2D,IAAUlE,MACrC,IAAajI;EAEf,CAAC,KAKGqK;CACR;CAEA,WAAmB;EAClB,IAAM7B,IAAM,SAAS,KAAKwC,GAAa,QAAQ,KAAK,EAAE,GAChDhG,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE;EAEhE,OAAO,KAAKS,GAAU1G,IAAY,GAAGwD,CAAG;CACzC;CAEA,WAAqB;EACpB,IAAMA,IAAM,SAAS,KAAKwC,GAAa,QAAQ,KAAK,EAAE,GAChDhG,IAAY,SAAS,KAAKiG,GAAW,QAAQ,WAAW,EAAE,GAC1DjD,IAAU,SAAS,KAAKgD,GAAa,SAAS,EAAE,KAAK;EAE3D,OAAO,KAAKU,GAAU1G,IAAYgD,GAASQ,CAAG;CAC/C;CAGA,MAAuB,MAAS;EAC/B,IAAMvG,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,IAAI,CAAC2E,KAAgB,CAACoH,GAAM,OAAO;EAEnC,IAAM+C,IAAW/C,EAAK,sBAAsB,GACtCgD,IAAepK,EAAa,sBAAsB,GAClDqK,IAAcrK,EAAa,cAAc,OAAO,CAAC,EAAE,gBAAgB;EAGzE,OAAOmK,EAAS,OAAQC,EAAa,MAAMC;CAC5C;CAGA,MAAuB,MAAS;EAC/B,IAAMrK,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,IAAI,CAAC2E,KAAgB,CAACoH,GAAM,OAAO;EAEnC,IAAM+C,IAAW/C,EAAK,sBAAsB,GACtCgD,IAAepK,EAAa,sBAAsB;EAGxD,OAAOmK,EAAS,UAAUC,EAAa;CACxC;CAGA,MAAsB,MAAS;EAC9B,IAAME,IAAgB,KAAKjP,GAAO,cAAc,oBAAoB;EACpE,IAAI,CAACiP,KAAiB,CAAClD,GAAM,OAAO;EAEpC,IAAM+C,IAAW/C,EAAK,sBAAsB,GACtCgD,IAAeE,EAAc,sBAAsB;EAGzD,OAAOH,EAAS,QAAQC,EAAa;CACtC;CAGA,MAAuB,MAAS;EAC/B,IAAME,IAAgB,KAAKjP,GAAO,cAAc,oBAAoB;EACpE,IAAI,CAACiP,KAAiB,CAAClD,GAAM,OAAO;EAEpC,IAAM+C,IAAW/C,EAAK,sBAAsB,GACtCgD,IAAeE,EAAc,sBAAsB;EAGzD,OAAOH,EAAS,SAASC,EAAa;CACvC;CAUA,WAA4B;EAC3B,IAAMpK,IAAe,KAAK3E,GAAO,cAAc,gBAAgB,GACzDkP,IAAiBvK,EAAa,gBAAgBA,EAAa,cAAc,OAAO,CAAC,EAAE,gBAAgB,IACnGlD,IAAY,KAAKzB,GAAO,WAAW,aAAa;EAGtD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMkP,IAAiBzN,CAAS,CAAC;CAC1D;CAEA,KAAc;EAcb,AAbA,KAAKzB,GAAO,iBAAiB,cAAc,MAAM;GAChD,IAAI,EAAE,WAAW,GAAG;GACpB,IAAM+L,IAAO,EAAE,OAAO,QAAQ,QAAQ;GACtC,AAAKA,KACDA,EAAK,QAAQ,UAAU,KAAA,KAAaA,EAAK,QAAQ,QAAQ,KAAA,MAEzDA,EAAK,cAAc,oBAAoB,IAC1C,KAAK/L,GAAO,IAAI,MAAM+L,EAAK,QAAQ,KAAK,IAExC,KAAK,cAAcA;EAErB,CAAC,GAED,KAAK/L,GAAO,iBAAiB,YAAY,MAAM;GAE9C,IAAM+L,IAAO,EAAE,OAAO,QAAQ,OAAO;GACrC,AAAKA,KAAS,KAAK/L,GAAO,SAAS+L,CAAI,MAEnC,KAAK/U,GAAM,YAAY,sBACtB;IAAC;IAAW;IAAa;IAAa;GAAY,CAAC,CAAC,SAAS,EAAE,IAAI,KACtE,KAAK,SAAS,CAAC,IAGZ;IAAC;IAAS;IAAO;IAAW;IAAa;IAAa;GAAY,CAAC,CAAC,SAAS,EAAE,IAAI,IACtF,KAAK,SAAS,CAAC,IACL,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,KACnC,EAAE,eAAe;EAGpB,CAAC;CACF;AACD,GCzXMmY,IAAgB,GAETC,IAAb,MAAwB;CACpB;CACA;CACA;CACA;CAEA,KAAkB;CAClB,KAAgB;CAChB,KAAuB;CACvB,KAAc;CACd,KAAU;CACV,KAAiB;CACjB,KAAqB;CACrB,KAAkB;CAClB,KAAa;CAEb,YAAY,GAAO;EAMf,AALA,KAAKpP,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MACjC,KAAKqT,KAAS,KAAKrP,GAAO,cAAc,8BAA8B,GAEtE,KAAKsP,KAAW,KAAKD,GAAO,cAAc,kBAAkB,GAC5D,KAAK,WAAW;CACpB;CAEA,UAAU;EAGN,AAFA,KAAKrP,GAAO,oBAAoB,eAAe,KAAKuP,EAAc,GAClE,KAAKvP,GAAO,oBAAoB,eAAe,KAAKwP,EAAc,GAClE,KAAKxP,GAAO,oBAAoB,YAAY,KAAKyP,EAAW;CAChE;CAEA,cAAc,IAAgB,QAAQ;EAClC,IAAM9D,IAAa,MAAM,KAAK,KAAK3L,GAAO,iBAAiB,iBAAiB0P,GAAe,CAAC;EAC5F,IAAI/D,EAAW,WAAW,GAQ1B;OANyB+D,MAAkB,UAAUA,MAAkB,WAEnE,MAAK1P,GAAO,gBACZ2L,EAAW,EAAE,CAAC,cAAc,OAAO,CAAC,EAAE,aAAa,cAAc,MAAM,QAG3D;IAEZ,IAAMgE,IAAgBhE,EAAW,EAAE,CAAC,cAAc,gBAAgB;IAClE,IAAI,CAACgE,GAAe;IAEpB,IAAIC,IAAa,GACXC,IAAY,CAAC;IAWnB,AATA,MAAM,KAAKF,EAAc,iBAAiB,KAAK,CAAC,CAAC,CAAC,SAAQ,MAAO;KAC7D,IAAMG,IAAS5E,EAAI,aAAa,UAAU,GACpCjV,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE;KAChD,AAAK,MAAMjV,CAAC,MACR,EAAU6Z,KAAU7Z,GACpB,KAAcA;IAEtB,CAAC,GAED0V,EAAW,SAAQ,MAAa;KAC5B,IAAMoE,IAAShJ,EAAU,iBAAiB,OAAO;KAEjD,AAAI2I,MAAkB,SAClBK,EAAO,SAAQ,MAAO;MAClB,EAAI,MAAM,QAAQ,GAAGH,EAAW;KAEpC,CAAC,KAED,EAAU,MAAM,OAAO,OAAOA,EAAW,KACzC,EAAU,MAAM,QAAQ,GAAGA,EAAW,KACtC,EAAU,MAAM,WAAW,GAAGA,EAAW,KACzC,EAAU,MAAM,WAAW,GAAGA,EAAW,KAEzCG,EAAO,SAAQ,MAAO;MAKlB,AAJA,EAAI,MAAM,QAAQ,GAAGH,EAAW,KAChC,EAAI,MAAM,WAAW,GAAGA,EAAW,KACnC,EAAI,MAAM,WAAW,GAAGA,EAAW,KAEnC,OAAO,QAAQC,CAAS,CAAC,CAAC,SAAS,CAACC,GAAQ7Z,OAAO;OAC/C,EAAI,iBAAiB,gBAAgB6Z,EAAO,mBAAmBA,EAAO,GAAG,CAAC,CAAC,SAAQ,MAAQ,CAI3F,CAAC;MACL,CAAC;KACL,CAAC;IAET,CAAC;GACL,OACI,EAAW,SAAQ,MAAa;IAE5B,EADyB,iBAAiB,OACrC,CAAC,CAAC,SAAQ,MAAO,CAItB,CAAC;GACL,CAAC;GAGL,KAAK9P,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ;EAHvD;CAIT;CAEA,eAAe,GAAgB,GAAO,IAAgB,MAAM;EAExD,IAAIgQ,IAAa,CAAC;EAIlB,IAFA,IAAa,MAAM,KAAK,KAAKhQ,GAAO,iBAAiB,gCAAgCiQ,EAAe,GAAG,CAAC,GAEpGD,EAAW,WAAW,GAAG;EAE7B,IAAME,IAAiBF,EAAW,EAAE,CAAC,QAAQ,6DAA6D,GACpGG,IAAwBT,MAC1BQ,GAAgB,UAAU,SAAS,mBAAmB,IAAI,SACtDA,GAAgB,UAAU,SAAS,oBAAoB,IAAI,UAAU;EAG7E,EAAW,SAAQ,MAAO;GAEtB,AADAhF,EAAI,aAAa,SAASkF,CAAK,GAC/B,EAAI,MAAM,QAAQ,GAAGA,EAAM;EAC/B,CAAC;EAED,IAAMC,IAAY,KAAKrQ,GAAO,aAAa,cAAc,0BAA0BiQ,EAAe,GAAG;EAYrG,AAXII,MACAA,EAAU,aAAa,SAASD,CAAK,GACrC,EAAU,MAAM,QAAQ,GAAGA,EAAM,MAGrC,KAAK,cAAcD,CAAqB,IAEpCA,MAA0B,UAAUA,MAA0B,YAC9D,KAAK,cAAc,MAAM,GAG7B,KAAKnQ,GAAO,YAAY,QAAQ;CACpC;CAEA,GAAgB,GAAY;EACxB,IAAI,KAAKA,GAAO,cAAc,OAAO;EACrC,IAAMpD,IAAQmQ,GAAY,QAAQ,OAAO;EAEzC,OADA,GAAInQ,KAASA,EAAM,aAAa,cAAc,MAAM;CAExD;CAEA,aAAa;EAKT,AAJA,KAAKoD,GAAO,iBAAiB,eAAe,KAAKuP,EAAc,GAI/D,KAAKvP,GAAO,yBAAyB,YAAY,KAAKyP,IAAa,eAAe,KAAKD,EAAc;CACzG;CAEA,GAAkB,GAAM;EACpB,IAAMzI,IAAYgF,EAAK,QAAQ,6DAA6D;EAI5F,OAHKhF,IACDA,EAAU,UAAU,SAAS,mBAAmB,IAAU,SAC1DA,EAAU,UAAU,SAAS,oBAAoB,IAAU,UACxD,SAHgB;CAI3B;CAEA,MAAkB,MAAM;EAGpB,IAAMuJ,IAAa,EAAE,OAAO,QAAQ,OAAO;EAC3C,IAAI,CAACA,GAAY;EAEjB,IAAMvE,IAAO,EAAE,OAAO,QAAQ,QAAQ;EAOtC,IALAuE,EAAW,iBAAiB,iBAAiB,CAAC,CAAC,SAAQ,MAAM;GACzD,AAAInb,MAAO4W,KAAM5W,EAAG,UAAU,OAAO,gBAAgB;EACzD,CAAC,GAEG,CAAC4W,KAAQA,EAAK,QAAQ,QAAQ,KAAA,KAC9BA,EAAK,aAAa,WAAW,MAAM,QAAQ;EAE/C,IAAMe,IAAOf,EAAK,sBAAsB,GAClCwE,IAAU,EAAE,UAAUzD,EAAK,MAC3B0D,IAAaD,KAAWpB,GACxBsB,IAAe3D,EAAK,QAAQyD,KAAYpB;EAE9C,IAAIqB,GAAY;GACZ,IAAME,IAAW3E,EAAK;GACtB,IAAI,CAAC2E,KAAYA,EAAS,aAAa,WAAW,MAAM,QAAQ;IAC5D,EAAK,UAAU,OAAO,gBAAgB;IACtC;GACJ;EACJ;EAEA,AAAIF,KAAcC,IACd1E,EAAK,UAAU,IAAI,gBAAgB,IAEnCA,EAAK,UAAU,OAAO,gBAAgB;CAE9C;CAEA,MAAkB,MAAM;EAGpB,IAAI,CADe,EAAE,aAAa,QAAQ,OAC5B,GAAG;EAEjB,IAAMA,IAAO,EAAE,aAAa,QAAQ,QAAQ;EAE5C,IAAI,CAACA,KAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,GAAG;EAIzD,EAAE,eAAe;EACjB,IAAMe,IAAOf,EAAK,sBAAsB,GAClCwE,IAAU,EAAE,UAAUzD,EAAK,MAE7BC,IAAahB;EAEjB,IAAIwE,KAAWpB,GAAe;GAC1B,IAAMuB,IAAW3E,EAAK;GACtB,IAAI2E,KAAYA,EAAS,QAAQ,QAAQ,KAAA,KAAaA,EAAS,aAAa,WAAW,MAAM,QACzF,IAAaA;QACV,IAAI,CAAC3E,EAAK,wBACb;EAER;EAGA,AADA,KAAK4E,KAAc5D,GACnB,KAAK6D,KAAuB,KAAKC,GAAkB9D,CAAU;EAE7D,IAAMhG,IAAY,KAAK/G,GAAO,cAAc,iBAAiB,KAAK4Q,IAAsB;EACxF,IAAI,CAAC7J,GAAW;EAEhB,IAAM+J,IAAe,SAAS/D,EAAW,QAAQ,KAAK,EAAE,GAClDpC,IAAUoC,EAAW,WAAW;EAItC,IAHA,KAAKgE,KAAkBD,IAAenG,IAAU,GAE9B,KAAKqG,GAAgBjE,CAC3B,GAAG;GACX,KAAKkE,KAAgB,KAAKF,KAAkB;GAC5C,IAAMG,IAAYnK,EAAU,cAAc,iBAAiB,KAAKkK,GAAc,GAAG;GACjF,AAAIC,IACA,KAAKC,KAAqB,SAASD,EAAU,aAAa,OAAO,GAAG,EAAE,KAAK,MAE3E,KAAKD,KAAgB;EAE7B,OACI,KAAKA,KAAgB;EAGzB,IAAMG,IAAarE,EAAW,sBAAsB,GAC9CsE,IAAY,KAAKrR,GAAO,sBAAsB;EAGpD,AADA,KAAKsR,KAAkBF,EAAW,OAClC,KAAKG,KAAaH,EAAW,OAAOC,EAAU;EAG9C,IAAMG,IADczK,EAAU,cAAc,iBAAiB,KAAKgK,GAAgB,GAC1D,CAAC,EAAE,aAAa,OAAO;EAW/C,AAVA,KAAKU,KAAkBD,KAAS,CAAC,MAAM,SAASA,GAAO,EAAE,CAAC,IAAK,SAASA,GAAO,EAAE,IAAIJ,EAAW,QAAQzG,GAExG,KAAK+G,KAAU,EAAE,SAEb,KAAKrC,OACL,KAAKA,GAAO,UAAU,IAAI,QAAQ,GAClC,KAAKsC,GAAiB,EAAE,OAAO,IAGnC,OAAO,iBAAiB,eAAe,KAAKC,EAAW,GACvD,OAAO,iBAAiB,aAAa,KAAKC,IAAY,EAAE,MAAM,GAAK,CAAC;CACxE;CAEA,GAAiB,GAAS;EACtB,IAAIC,IAAOnF,IAAU,KAAK+E,IACpBK,IAAY,KAAKf,GAAgB,KAAKL,EAAW;EAEvD,IAAIoB,KAAa,KAAKd,OAAkB,MAAM;GAC1C,IAAMe,IAAU,KAAKb,KAAA,IACfc,IAAU,EAAE,KAAKR,KAAA;GACvB,IAAO,KAAK,IAAIQ,GAAS,KAAK,IAAIH,GAAME,CAAO,CAAC;EACpD;EAEA,IAAME,IAAkB,KAAK,IAAA,IAAqB,KAAKT,KAAiBK,CAAI,GAGxEK,IAAgBxF,IADD,KAAKgE,GAAY,sBACG,CAAC,CAAC;EAEzC,IAAIoB,KAAa,KAAKd,OAAkB,MAAM;GAC1C,IAAMmB,IAAe,KAAKd,MAAmB,KAAKH,KAAA;GAClD,IAAgB,KAAK,IAAIgB,GAAeC,CAAY;EACxD;EAEA,IAAMC,IAAmB,KAAK,IAAA,IAAqBF,CAAa;EAEhE,AAAI,KAAK9C,OACL,KAAKA,GAAO,MAAM,YAAY,8BAA8B,GAAG,KAAKkC,GAAW,GAAG,GAClF,KAAKlC,GAAO,MAAM,YAAY,+BAA+B,GAAGgD,EAAiB,GAAG;EAGxF,IAAMC,IAAY,KAAKhD,IAAU,cAAc,aAAa;EAC5D,AAAIgD,MACA,EAAU,cAAc,GAAG,KAAK,MAAMJ,CAAe,EAAE;CAE/D;CAEA,MAAe,MAAM;EACjB,KAAKP,GAAiB,EAAE,OAAO;CACnC;CAEA,MAAc,MAAM;EAChB,OAAO,oBAAoB,eAAe,KAAKC,EAAW;EAE1D,IAAME,IAAO,EAAE,UAAU,KAAKJ,IACxBK,IAAY,KAAKf,GAAgB,KAAKL,EAAW,GACnD4B,IAAa;EAEjB,IAAIR,KAAa,KAAKd,OAAkB,MAAM;GAC1C,IAAIuB,IAAc,KAAK,IAAA,IAAqB,KAAKf,KAAiBK,CAAI,GAClEW,IAAe,KAAKhB,KAAiB,KAAKN,KAAqBqB;GASnE,AAPIC,IAAA,OACA,IAAA,IACA,IAAc,KAAKhB,KAAiB,KAAKN,KAAA,KAG7C,KAAK,eAAe,KAAKJ,IAAiByB,GAAa,KAAK5B,EAAoB,GAChF,KAAK,eAAe,KAAKK,IAAewB,GAAc,KAAK7B,EAAoB,GAC/E,IAAa4B;EACjB,OAAO;GACH,IAAMA,IAAc,KAAK,IAAA,IAAqB,KAAKf,KAAiBK,CAAI;GACxE,AAAI,KAAKf,OAAoB,QAAQ,KAAKH,OACtC,KAAK,eAAe,KAAKG,IAAiByB,GAAa,KAAK5B,EAAoB,GAChF,IAAa4B;EAErB;EAEA,IAAI,KAAK7B,IAAa;GAClB,IAAM5D,IAAa,KAAK4D;GACxB,AAAI5D,EAAW,aAAa,WAAW,MAAM,UAAUwF,IAAa,OAChE,EAAW,QAAQ,cAAc,OAAOA,CAAU;EAE1D;EAaA,AAXI,KAAKlD,OACL,KAAKC,IAAU,UAAU,IAAI,UAAU,GACvC,iBAAiB;GAEb,AADA,KAAKD,GAAO,UAAU,OAAO,QAAQ,GACrC,KAAKC,IAAU,UAAU,OAAO,UAAU;EAC9C,GAAG,GAAG,IAGV,KAAKyB,KAAkB,MACvB,KAAKE,KAAgB,MACrB,KAAKL,KAAuB,MAC5B,KAAKD,KAAc;CACvB;CAEA,MAAe,MAAM;EAGjB,IAAI5E,IADa,EAAE,OACC,QAAQ,QAAQ;EACpC,IAAI,CAACA,KAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,GAAG;EAEzD,IAAMe,IAAOf,EAAK,sBAAsB;EAGxC,AAFgB,EAAE,UAAUe,EAAK,QAElBqC,MACX,IAAOpD,EAAK;EAGhB,IAAM+E,IAAe,SAAS/E,EAAK,QAAQ,KAAK,EAAE,GAC5C2G,IAAY,KAAK1S,GAAO,cAAc,yBAAyB8Q,EAAa,GAAG;EACrF,IAAI,CAAC4B,KAAa,CAACA,EAAU,QAAQ,QAAQA,EAAU,UAAU,SAAS,YAAY,GAAG;EAEzF,IAAIC,IAAe;EACnB,MAAM,KAAKD,EAAU,kBAAkB,QAAQ,CAAC,CAAC,SAAS,MAAQ;GAC9D,QAAQ3K,EAAI,SAAZ;IACI,KAAK;KAAQ,KAAgB;KAAG;IAChC,KAAK;KAAO,KAAgB;KAAG;IAC/B,KAAK;KAAU,KAAgB;KAAI;IACnC,KAAK;KAAU,KAAgB;KAAI;IACnC,KAAK,SACD,SAASA,EAAI,QAAQ,OAAA,CAAQ,YAAY,GAAzC;KAEI,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;KACL,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;MACD,KAAgB;MAChB;KAeJ,SACI,KAAgB;IAExB;GAER;EACJ,CAAC;EAED,IAAM6K,IAAW,KAAK5b,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQ0b,EAAU,QAAQ,IAAI,GAGjEG,IADgB,OAAO,iBAAiBH,CACrB,CAAC,CAAC,QAAQ,mBAE7BI,IAAa/G,EAAK,aAAa,IAEjCgH,KADe,KAAK,gBAAgBD,GAAYD,CACvB,CAAC,CAAC,SAAS,KAAK;EAE7C,KAAK7b,GAAM,cAAc;GAErB,KAAKgJ,GAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAQ,MAAQ;IACjD,IAAMuM,IAAM,OAAOmG,EAAU,QAAQ,OAAO,KAAK1b,GAAM,WAAW,SAAS0b,EAAU,QAAQ,MAAM9Z,GAAQnB,CAAG,IAAImB,EAAO,EAAEga,MAAa,EAAE,CAAC,CAAC,KAAK,GAC3II,IAAO,KAAK,gBAAgBzG,GAAKsG,CAAI;IAC3C,AAAIG,EAAK,SAASA,EAAK,QAAQD,MAC3B,IAAeC,EAAK;GAE5B,CAAC;GAED,IAAMC,IAAkB,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAKF,CAAY,IAAIJ,CAAY,CAAC;GAE1F,KAAK,eAAeD,EAAU,QAAQ,KAAKO,GAAiB,KAAKpC,GAAkB9E,CAAI,CAAC;EAC5F,CAAC;CACL;AACJ,GAGamH,IAAb,cAAqC,YAAY;CAG7C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAEhB,KAAKC,GAAU;CACnB;CAEA,WAAkB;EACd,KAAK,YAAY;CAKrB;AACJ;AAEK,eAAe,IAAI,8BAA8B,KAClD,eAAe,OAAO,gCAAgCD,CAAe;;ACzdzE,IAAaE,IAAb,MAAsB;CAClB;CACA;CACA;CAEA,KAAc;CACd,KAAc;CACd,KAAkB;CAClB,KAAkB;CAClB,KAAU;CACV,KAAS;CAET,YAAY,GAAO;EAIf,AAHA,KAAKpT,KAAShE,GACd,KAAKqX,KAAQ,KAAKrT,GAAO,cAAc,oBAAoB,GAC3D,KAAKsT,KAAQ,KAAKtT,GAAO,cAAc,oBAAoB,GAC3D,KAAK,WAAW;CACpB;CAEA,aAAa;EACT,KAAKA,GAAO,iBAAiB,eAAe,KAAKwP,EAAc;CACnE;CAEA,KAAkB;EACd,IAAMvY,IAAO,KAAK+I,GAAO,YAAY,CAAC,EAAE;EACxC,OAAO,KAAKA,GAAO,aAAa,aAAa,MAAM,UAAU/I,GAAM,aAAa,aAAa,MAAM;CACvG;CAEA,GAAyB,GAAG,GAAG;EAC3B,IAAMwV,IAAO,KAAKzM,GAAO,YAAY,GACjC7K,IAAKsX,EAAK,mBAAmBA,EAAK,iBAAiBzN,GAAGuU,CAAC,IAAI,SAAS,iBAAiBvU,GAAGuU,CAAC;EAE7F,OAAOpe,KAAMA,EAAG,cAAcA,EAAG,WAAW,mBAAkB;GAC1D,IAAMqe,IAASre,EAAG,WAAW,iBAAiB6J,GAAGuU,CAAC;GAClD,IAAI,CAACC,KAAUA,MAAWre,GAAI;GAC9B,IAAKqe;EACT;EAEA,OAAOre;CACX;CAEA,GAAkB,GAAM;EACpB,IAAI,CAAC4W,KAAQA,EAAK,QAAQ,QAAQ,KAAA,GAAW,OAAO;EAEpD,IAAMP,IAAW,SAASO,EAAK,QAAQ,KAAK,EAAE,GACxCpB,IAAUoB,EAAK,WAAW,GAC1BN,IAASD,IAAWb,IAAU,GAC9BhT,IAAWoU,EAAK,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAElDnP,IAAQmP,EAAK,QAAQ,OAAO;EAClC,IAAI,CAACnP,GAAO,OAAO;GAAE;GAAU;GAAS;GAAQ;GAAU,SAAS;GAAO,kBAAkB;GAAM,cAAc;EAAK;EAErH,IAAM6W,IAAc7W,EAAM,iBAAiB,oBAAoB,GAC3D8W,IAAoB,IACpBC,IAAe,IACfC,IAAmB;EAEvB,KAAK,IAAMC,KAAWJ,GAAa;GAC/B,IAAII,MAAY9H,KAAQ8H,EAAQ,QAAQ,QAAQ,KAAA,GAAW;GAE3D,IAAMC,IAAW,SAASD,EAAQ,QAAQ,KAAK,EAAE,GAC3CE,IAAUF,EAAQ,WAAW,GAC7BG,IAASF,IAAWC,IAAU;GAapC,CAZoBF,EAAQ,QAAQ,IAAI,CAAC,EAAE,mBAAmB,KAE5Clc,KAAYmc,KAAYtI,KAAYwI,KAAUvI,KAAUsI,IAAUpJ,MAC3EiJ,KAGD,EAAiB,WAAW,KAAK,IAAIA,EAAiB,UAAUE,CAAQ,GACxE,EAAiB,SAAS,KAAK,IAAIF,EAAiB,QAAQI,CAAM,KAHlE,IAAmB;IAAE,UAAUF;IAAU,QAAQE;GAAO,IAO5CA,IAASxI,KAAYsI,IAAWrI,MAEtBqI,KAAYtI,KAAYwI,KAAUvI,IAGpDsI,IAAUpJ,MACV,IAAoB,OAEjBmJ,IAAWtI,KAAYwI,IAASvI,OACjCqI,KAAYtI,KAAYwI,KAAUvI,MACpC,IAAe;EAI/B;EAEA,IAAMwI,IAAcP,KAAqBC;EAEzC,OAAO;GACH;GACA,SAASM,IAActJ,IAAU;GACjC,QAAQsJ,IAAcxI,IAASD;GAC/B;GACA,SAASyI;GACT;GACA;EACJ;CACJ;CAEA,GAA0B,GAAM;EAC5B,IAAMC,IAAa,KAAKC,GAAkBpI,CAAI;EAC9C,IAAI,CAACmI,GAAY,OAAO;EAExB,IAAM,EAAE,aAAU,WAAQ,eAAYA,GAGhCE,IAAYrI,EAAK,QAAQ,OAAO;EACtC,IAAI,CAACqI,GAAW,OAAO;EAEvB,IAAIC,IAAU,UAAUC,IAAW,WAAWC,IAAS,UAAUC,IAAY,WACvEC,IAAc,CAAC;EAwBrB,IAtBAL,EAAU,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAK;GAC1D,IAAIxJ,EAAE,QAAQ,QAAQ,KAAA,GAAW;GACjC,IAAM8J,IAAO,SAAS9J,EAAE,QAAQ,KAAK,EAAE,GAEjC+J,IAAOD,KADC9J,EAAE,WAAW,KACC;GAM5B,IAJiBgK,IACVF,KAAQlJ,KAAYmJ,KAAQlJ,IAC5Bb,MAAMmB,GAEC;IACV,IAAMe,IAAOlC,EAAE,sBAAsB;IAIrC,AAHA,IAAU,KAAK,IAAIyJ,GAASvH,EAAK,IAAI,GACrC,IAAW,KAAK,IAAIwH,GAAUxH,EAAK,KAAK,GACxC,IAAS,KAAK,IAAIyH,GAAQzH,EAAK,GAAG,GAClC,IAAY,KAAK,IAAI0H,GAAW1H,EAAK,MAAM;IAE3C,IAAM+H,IAAgB,OAAO,iBAAiBjK,CAAC;IAC/C,EAAY,KAAK;KAAE,IAAIA;KAAG;KAAM,OAAOiK;IAAc,CAAC;GAC1D;EACJ,CAAC,GAEGJ,EAAY,WAAW,GAAG,OAAO;EAErC,IAAMK,IAAaR,IAAWD,GACxBU,IAAcP,IAAYD,GAE1BS,IAAgB,SAAS,cAAc,KAAK;EAwClD,OAvCA,EAAc,YAAY,uBAC1B,EAAc,MAAM,WAAW,YAC/B,EAAc,MAAM,QAAQ,GAAGF,EAAW,KAC1C,EAAc,MAAM,SAAS,GAAGC,EAAY,KAE5CN,EAAY,SAAS,EAAE,OAAI,SAAM,eAAY;GACzC,IAAMQ,IAAa9f,EAAG,UAAU,EAAI;GA8BpC,AA5BA,EAAW,MAAM,WAAW,YAC5B,EAAW,MAAM,OAAO,GAAG2X,EAAK,OAAOuH,EAAQ,KAC/C,EAAW,MAAM,MAAM,GAAGvH,EAAK,MAAMyH,EAAO,KAE5C,EAAW,MAAM,QAAQ,GAAGzH,EAAK,MAAM,KACvC,EAAW,MAAM,WAAW,GAAGA,EAAK,MAAM,KAC1C,EAAW,MAAM,WAAW,QAE5B,EAAW,MAAM,SAAS,GAAGA,EAAK,OAAO,KACzC,EAAW,MAAM,YAAY,cAC7B,EAAW,MAAM,SAAS,KAE1B,EAAW,MAAM,kBAAkBoI,EAAM,oBAAoB,iBAAiBA,EAAM,oBAAoB,qBAClGA,EAAM,kBACN,WACN,EAAW,MAAM,QAAQA,EAAM,OAC/B,EAAW,MAAM,OAAOA,EAAM,MAC9B,EAAW,MAAM,aAAaA,EAAM,YACpC,EAAW,MAAM,WAAWA,EAAM,UAClC,EAAW,MAAM,YAAYA,EAAM,WACnC,EAAW,MAAM,UAAUA,EAAM,SACjC,EAAW,MAAM,SAASA,EAAM,QAChC,EAAW,MAAM,cAAcA,EAAM,aACrC,EAAW,MAAM,eAAeA,EAAM,cACtC,EAAW,MAAM,UAAU,QAC3B,EAAW,MAAM,aAAa,UAC9B,EAAW,MAAM,iBAAiBA,EAAM,cAAc,WAAW,WAAYA,EAAM,cAAc,UAAU,aAAa,cAExHF,EAAc,YAAYC,CAAU;EACxC,CAAC,GAEM;GACH,SAASD;GACT,QAAQ;IACJ,MAAMX;IACN,OAAOC;IACP,KAAKC;IACL,QAAQC;IACR,OAAOM;IACP,QAAQC;GACZ;EACJ;CACJ;CAEA,MAAkB,MAAM;EAIpB,IAHI,CAAC,KAAKI,GAAgB,KAGtB,CADe,EAAE,OAAO,QAAQ,kBACtB,GAAG;EAEjB,IAAMpJ,IAAO,EAAE,OAAO,QAAQ,QAAQ;EAEtC,IADI,CAACA,KAAQA,EAAK,UAAU,SAAS,gBAAgB,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KACnGA,EAAK,QAAQ,QAAQ,KAAA,GAAW;EAEpC,EAAE,eAAe;EAEjB,IAAMqJ,IAAS,EAAE,SACXC,IAAS,EAAE,SAEXC,UAAoB;GAOtB,AANA,AAEI,KAAKC,QADL,aAAa,KAAKA,EAAM,GACV,OAElB,OAAO,oBAAoB,eAAeC,CAAoB,GAC9D,OAAO,oBAAoB,aAAaF,CAAW,GACnD,OAAO,oBAAoB,iBAAiBA,CAAW;EAC3D,GAEME,KAAwB,MAAc;GAExC,AADa,KAAK,MAAM3V,EAAU,UAAUuV,GAAQvV,EAAU,UAAUwV,CACjE,IAAI,KACPC,EAAY;EAEpB;EASA,AAPA,KAAKC,KAAS,iBAAiB;GAE3B,AADAD,EAAY,GACZ,KAAKG,GAAW,GAAG1J,CAAI;EAC3B,GAAG,GAAG,GAEN,OAAO,iBAAiB,eAAeyJ,CAAoB,GAC3D,OAAO,iBAAiB,aAAaF,GAAa,EAAE,MAAM,GAAK,CAAC,GAChE,OAAO,iBAAiB,iBAAiBA,GAAa,EAAE,MAAM,GAAK,CAAC;CACxE;CAEA,GAAW,GAAG,GAAM;EAChB,IAAI,KAAKI,IAAa;EAEtB,IAAMC,IAAU,KAAKC,GAA0B7J,CAAI;EACnD,IAAI,CAAC4J,GAAS;EAId,AAFA,KAAKD,KAAc,IACnB,KAAKG,KAAc9J,GACnB,KAAK+J,KAAkB,SAAS/J,EAAK,QAAQ,KAAK,EAAE;EAEpD,IAAMsF,IAAY,KAAKrR,GAAO,sBAAsB,GAC9C,EAAE,WAAQ,eAAY2V;EAI5B,IAFA,KAAKI,KAAU,EAAE,UAAUC,EAAO,MAE9B,KAAK3C,IAAO;GACZ,KAAKA,GAAM,gBAAgB3V,CAAO;GAElC,IAAMuY,IAAcD,EAAO,MAAM3E,EAAU,KACrC6E,IAAa7E,EAAU,SAAS4E;GAOtC,AALA,KAAK5C,GAAM,MAAM,QAAQ,GAAG2C,EAAO,MAAM,KACzC,KAAK3C,GAAM,MAAM,SAAS,GAAG6C,EAAW,KACxC,KAAK7C,GAAM,MAAM,MAAM,GAAG4C,EAAY,KACtC,KAAK5C,GAAM,MAAM,UAAU,SAE3B,KAAK8C,GAAoB,EAAE,OAAO;EACtC;EAKA,AAHA,SAAS,KAAK,MAAM,SAAS,QAE7B,OAAO,iBAAiB,eAAe,KAAK5G,EAAc,GAC1D,OAAO,iBAAiB,aAAa,KAAK6G,IAAc,EAAE,MAAM,GAAK,CAAC;CAC1E;CAEA,MAAkB,MAAM;EACpB,IAAI,CAAC,KAAKV,IAAa;EAKvB,AAHA,KAAKS,GAAoB,EAAE,OAAO,GAE9B,KAAK9C,OAAO,KAAKA,GAAM,MAAM,gBAAgB,SAC7C,KAAKC,OAAO,KAAKA,GAAM,MAAM,gBAAgB;EAGjD,IAAMvG,IADgB,KAAKsJ,GAAyB,EAAE,SAAS,EAAE,OAClC,CAAC,EAAE,QAAQ,0CAA0C;EAEpF,IAAItJ,KAAcA,EAAW,QAAQ,QAAQ,KAAA,GAAW;GACpD,IAAMuJ,IAAiB,SAASvJ,EAAW,QAAQ,KAAK,EAAE,GACpDsE,IAAY,KAAKrR,GAAO,sBAAsB,GAC9CpD,IAAQmQ,EAAW,QAAQ,OAAO,GAEpCwJ,IAAa,UACbC,IAAc;GAiBlB,IAfI5Z,KACAA,EAAM,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAK;IACtD,IAAIgO,EAAE,QAAQ,QAAQ,KAAA,GAAW;IACjC,IAAM8J,IAAO,SAAS9J,EAAE,QAAQ,KAAK,EAAE,GAEjC+J,IAAOD,KADC9J,EAAE,WAAW,KACC;IAE5B,IAAI8J,KAAQ4B,KAAkB3B,KAAQ2B,GAAgB;KAClD,IAAMG,IAAQ7L,EAAE,sBAAsB;KAEtC,AADA,IAAa,KAAK,IAAI2L,GAAYE,EAAM,IAAI,GAC5C,IAAc,KAAK,IAAID,GAAaC,EAAM,KAAK;IACnD;GACJ,CAAC,GAGDF,MAAe,UAAU;IACzB,IAAMzJ,IAAOC,EAAW,sBAAsB;IAE9C,AADA,IAAaD,EAAK,MAClB,IAAcA,EAAK;GACvB;GAEA,IAAM4J,IAAOH,KAAeC,IAAcD,KAAc,GACpDI,IAAsB,GACtBC,IAAgB;GAEpB,AAAI,EAAE,UAAUF,KACZ,IAAsBJ,GACtB,IAAgBC,IAAalF,EAAU,SAGvC,IAAsBiF,KADNvJ,EAAW,WAAW,IAEtC,IAAgByJ,IAAcnF,EAAU;GAG5C,IAAMwF,IAAc,KAAK1C,GAAkB,KAAK0B,EAAW,GACrDiB,IAAaD,EAAY,SAEzBE,IAAiBF,EAAY,UAE7BG,IAAeD,KADC,KAAKlB,GAAY,WAAW,KACI,GAEhDoB,IAAiBlK,EAAW,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAE9DmK,IAAeD,KADClK,EAAW,WAAW,KACU,GAEhDoK,IAAsB,EAAEH,IAAeC,KAAkBF,IAAiBG,IAE5EE,IAAwB;GAC5B,IAAIP,EAAY,kBAAkB;IAC9B,IAAM,EAAE,UAAUQ,GAAQ,QAAQC,MAAST,EAAY;IACvD,CAAIF,IAAsBU,KAAWV,IAAsBG,IAAa,IAAKQ,OACzE,IAAwB;GAEhC;GAEA,IAAIC,IAA6B;GACjC,IAAI3a,GAAO;IACP,IAAM4a,IAAe5a,EAAM,iBAAiB,sCAAsC;IAElF,KAAK,IAAM6a,KAASD,GAAc;KAC9B,IAAIC,MAAU,KAAK5B,IAAa;KAEhC,IAAM6B,IAAYD,EAAM,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAEpDE,IAAUD,KADCD,EAAM,WAAW,KACK;KAGvC,IAD4BT,IAAeU,KAAaX,IAAiBY,GACjD;KAExB,IAAMC,IAAS,SAASH,EAAM,QAAQ,KAAK,EAAE,GAEvCI,IAAOD,KADCH,EAAM,WAAW,KACD;KAE9B,IAAId,IAAsBiB,KAAUjB,IAAsBkB,IAAO,GAAG;MAChE,IAA6B;MAC7B;KACJ;KAEA,IAAMC,IAAanB,IAAsBG,IAAa;KAMtD,IAJKH,IAAsBiB,KAAUjB,KAAuBkB,KAAQC,IAAaD,KAC5ElB,IAAsBiB,KAAUE,KAAcF,KAAUE,IAAaD,GAGjD;MACrB,IAA6B;MAC7B;KACJ;IACJ;GACJ;GAEA,IAAME,IACFpB,KAAuBE,EAAY,YACnCF,KAAuBE,EAAY,SAAS;GAKhD,IAFsB,CAACM,KAAuBY,KAAeX,KAAyBG,KAA8B,CAACV,EAAY,cAK7H,AAFA,KAAK9F,KAAkB,MACnB,KAAKuC,OAAO,KAAKA,GAAM,MAAM,UAAU,SACvC,KAAKD,MAAO,KAAKA,GAAM,UAAU,IAAI,SAAS;QAKlD,IAHA,KAAKtC,KAAkB4F,GACnB,KAAKtD,MAAO,KAAKA,GAAM,UAAU,OAAO,SAAS,GAEjD,KAAKC,IAAO;IAGZ,IAAM2C,IAFalJ,EAAW,QAAQ,kBACV,CAAC,CAAC,sBACD,CAAC,CAAC,MAAMsE,EAAU,KACzC6E,IAAa7E,EAAU,SAAS4E;IAKtC,AAHA,KAAK3C,GAAM,MAAM,MAAM,GAAG2C,EAAY,KACtC,KAAK3C,GAAM,MAAM,SAAS,GAAG4C,EAAW,KACxC,KAAK5C,GAAM,MAAM,OAAO,GAAGsD,IAAgB,EAAE,KAC7C,KAAKtD,GAAM,MAAM,UAAU;GAC/B;EAER,OAGI,AAFI,KAAKA,OAAO,KAAKA,GAAM,MAAM,UAAU,SACvC,KAAKD,MAAO,KAAKA,GAAM,UAAU,IAAI,SAAS,GAClD,KAAKtC,KAAkB;CAE/B;CAEA,GAAoB,GAAS;EACzB,IAAI,CAAC,KAAKsC,IAAO;EAEjB,IAAM2E,IAAOrL,IADK,KAAK3M,GAAO,sBACC,CAAC,CAAC,OAAO,KAAK+V;EAC7C,KAAK1C,GAAM,MAAM,OAAO,GAAG2E,EAAK;CACpC;CAEA,MAAgB,MAAM;EAClB,AAAK,KAAKtC,OAEV,OAAO,oBAAoB,eAAe,KAAKnG,EAAc,GAC7D,SAAS,KAAK,MAAM,SAAS,IAEzB,KAAK8D,OACL,KAAKA,GAAM,MAAM,UAAU,QAC3B,KAAKA,GAAM,gBAAgB,IAE3B,KAAKC,OAAO,KAAKA,GAAM,MAAM,UAAU,SAGvC,KAAKvC,OAAoB,QACzB,KAAK+E,OAAoB,QACzB,KAAK/E,OAAoB,KAAK+E,MAC9B,KAAK/E,OAAoB,KAAK+E,KAAkB,KAEhD,KAAK,WAAW,KAAKA,IAAiB,KAAK/E,EAAe,GAG9D,KAAK2E,KAAc,IACnB,KAAKG,KAAc,MACnB,KAAKC,KAAkB,MACvB,KAAK/E,KAAkB;CAC3B;CAEA,WAAW,GAAc,GAAY;EAEjC,IAAMkH,IAAW,KAAKjY,GAAO,YAAY,cAAc,UAAU,GAC3DkY,IAAYD,EAAS,cAAc,iBAAiBE,EAAW,GAAG,GAElEtB,IAAc,KAAK1C,GAAkB,KAAK0B,EAAW;EAC3D,IAAI,CAACgB,KAAe,CAACA,EAAY,cAAc;EAE/C,IAAMuB,IAAYvB,EAAY,SACxBwB,KAAa,MAAQ5gB,KAAO6gB,KAAgB7gB,IAAM6gB,IAAeF,GAGjEG,IAAoB,KAAKvY,GAAO,cAAc,wCAAwCmY,EAAW,GAAG,GACpGK,IAAYD,GAAmB,QAAQ,oBAAoB,IAAI,SAASA,GAAmB,QAAQ,qBAAqB,IAAI,UAAU;EAsB5I,AApBAN,EAAS,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;GAC5C,AAAII,EAAU,SAASnN,EAAI,aAAa,UAAU,GAAG,EAAE,CAAC,MACpDsN,IAAYtN,EAAI,aAAa,SAASsN,CAAS,IAAItN,EAAI,gBAAgB,OAAO,GAC9E+M,EAAS,aAAa/M,GAAKgN,CAAS;EAE5C,CAAC,GAED;GAAC;GAAS;GAAS;EAAO,CAAC,CAAC,SAAQ,MAAS;GACzC,KAAKlY,GAAO,YAAY,iBAAiB,GAAGyY,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;IAClE,IAAMC,IAAQ,MAAM,KAAKpR,EAAG,QAAQ,GAC9BqR,IAAgBD,EAAM,MAAK,MAAK,SAAS9N,EAAE,QAAQ,KAAK,EAAE,KAAKuN,CAAU;IAE/E,EAAM,SAAQ,MAAQ;KAClB,AAAIE,EAAU,SAAStM,EAAK,QAAQ,KAAK,EAAE,CAAC,KACxCzE,EAAG,aAAayE,GAAM4M,KAAiB,IAAI;IAEnD,CAAC;GACL,CAAC;EACL,CAAC,GAED,KAAK3Y,GAAO,oBAAoB;CACpC;CAEA,UAAU;EACN,KAAKA,GAAO,oBAAoB,eAAe,KAAKwP,EAAc;CACtE;AACJ,GC5eaoJ,IAAb,MAA2B;CACvB;CAEA,YAAY,GAAO;EACf,KAAK5Y,KAAShE;CAClB;CAEA,YAAY,GAAY,GAAO;EAC3B,IAAI,CAAC+Q,KAAc,CAACnQ,GAAO,OAAO;EAElC,IAAMmK,IAAYgG,EAAW,QAAQ,6DAA6D;EAClG,IAAIhG,GAAW,UAAU,SAAS,mBAAmB,GAAG,OAAO;EAC/D,IAAIA,GAAW,UAAU,SAAS,oBAAoB,GAAG,OAAO;EAEhE,IAAM8R,IAAU,SAAS9L,EAAW,QAAQ,KAAK,EAAE;EACnD,IAAI,CAAC,MAAM8L,CAAO,GAAG;GAEjB,IAAMC,IADQlc,EAAM,cAAc,0BAA0Bic,EAAQ,GAC9C,CAAC,EAAE,aAAa,OAAO;GAC7C,IAAIC,GAAW,OAAOA;EAC1B;EAEA,OAAO;CACX;CAEA,aAAa,GAAY,GAAO;EAC5B,IAAI,CAAC/L,KAAcA,EAAW,YAAY,QAAQ,CAACnQ,GAAO,OAAO;EAEjE,IAAMic,IAAU,SAAS9L,EAAW,QAAQ,KAAK,EAAE,GAC7CpC,IAAUoC,EAAW,WAAW;EACtC,IAAI,MAAM8L,CAAO,GAAG,OAAO;EAE3B,IAAME,IAAoBF,IAAUlO,IAAU,GACxCqO,IAAW,MAAM,KAAKpc,EAAM,iBAAiB,UAAU,CAAC;EAE9D,IAAIoc,EAAS,UAAU,GAAG,OAAO;EAEjC,KAAK,IAAM1R,KAAM0R,GAAU;GACvB,IAAMN,IAAQ,MAAM,KAAKpR,EAAG,iBAAiB,QAAQ,CAAC,GAClD2R,IAAoB;GAExB,KAAK,IAAMlN,KAAQ2M,GAAO;IACtB,IAAMhE,IAAO,SAAS3I,EAAK,QAAQ,KAAK,EAAE,GAEpCmN,IAAUxE,KADF3I,EAAK,WAAW,KACC;IAE/B,IAAI2I,KAAQqE,KAAqBA,IAAoBG,GACjD,OAAO;IAGX,IAAIA,MAAYH,GAAmB;KAC/B,IAAoB;KACpB;IACJ;GACJ;GAEA,IAAI,CAACE,GAAmB,OAAO;EACnC;EAEA,OAAO;CACX;CAEA,iBAAiB,GAAQ,GAAY,IAAU,QAAQ;EACnD,IAAI,CAAC,KAAKjZ,MAAU,CAAC+M,GAAY;EAEjC,IAAMtK,IAAc,KAAKzC,GAAO;EAChC,IAAI,CAACyC,GAAa;EAElB,IAAMoW,IAAU,SAAS9L,EAAW,QAAQ,KAAK,EAAE,GAC7CpC,IAAUoC,EAAW,WAAW,GAChCuJ,IAAiBuC,IAAUlO,IAAU;EAE3C,IAAI,MAAM2L,CAAc,GAAG;EAE3B,IAAM2B,IAAWxV,EAAY,cAAc,UAAU;EACrD,IAAI,CAACwV,GAAU;EAEf,IAAMzN,IAAO,MAAM,KAAKyN,EAAS,iBAAiB,KAAK,CAAC;EAExD,IAAIkB,MAAW,cAQX,AAPA3O,EAAK,SAAQ,MAAO;GAEhB,AADY,SAASU,EAAI,aAAa,UAAU,GAAG,EAC7C,KAAKoL,KACPpL,EAAI,aAAa,SAASkO,CAAO;EAEzC,CAAC,GAED;GAAC;GAAS;GAAS;EAAO,CAAC,CAAC,SAAQ,MAAS;GACzC,EAAY,iBAAiB,GAAGX,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;IACtD,MAAM,KAAKnR,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KACpC,IAAM+R,IAAO,SAAStN,EAAK,QAAQ,KAAK,EAAE;KAC1C,AAAI,CAAC,MAAMsN,CAAI,KAAKA,KAAQ/C,KACxBvK,EAAK,aAAa,SAASqN,CAAO;IAE1C,CAAC;GACL,CAAC;EACL,CAAC;OAEE,IAAID,MAAW,gBAAgB;GAClC,IAAIG,IAAaT,GACbU,IAAYV,IAAUlO,IAAU;GAuBpC,AArBA;IAAC;IAAS;IAAS;GAAO,CAAC,CAAC,SAAQ,MAAS;IACzC,EAAY,iBAAiB,GAAG8N,EAAM,IAAI,CAAC,CAAC,SAAS,GAAI,MAAS;KAC9D,MAAM,KAAKnR,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;MACpC,IAAMoN,IAAO,SAAS3I,EAAK,QAAQ,KAAK,EAAE,GAEpC4I,IAAOD,KADC3I,EAAK,WAAW,KACF,GACtByN,IAAQzN,EAAK,WAAW;MAO9B,CANgBzE,EAAG,mBAAmBmS,KAEAD,IAAQ,IAAIzN,EAAK,QAAQ,IAAI,CAAC,CAAC,mBAA8BA,EAAK,QAAQ,IAAI,CAAC,CAAC,kBAAkByN,IAAQ,GAElH7E,IAAOkE,KAAWnE,IAAO4B,MAGnD,IAAa,KAAK,IAAIgD,GAAY5E,CAAI,GACtC,IAAY,KAAK,IAAI6E,GAAW5E,CAAI;KAE5C,CAAC;IACL,CAAC;GACL,CAAC,GAEDnK,EAAK,SAAQ,MAAO;IAEhB,AADY,SAASU,EAAI,aAAa,UAAU,GAAG,EAC7C,KAAKoO,KACPpO,EAAI,gBAAgB,OAAO;GAEnC,CAAC;GAED,IAAIwO,IAAW;GASf,AARAlP,EAAK,SAAQ,MAAO;IAChB,AAAIkP,IACAxO,EAAI,gBAAgB,OAAO,IACnBA,EAAI,aAAa,OAAO,MAChC,IAAW;GAEnB,CAAC,GAED;IAAC;IAAS;IAAS;GAAO,CAAC,CAAC,SAAQ,MAAS;IACzC,EAAY,iBAAiB,GAAGuN,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;KACtD,MAAM,KAAKnR,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;MACpC,IAAM+R,IAAO,SAAStN,EAAK,QAAQ,KAAK,EAAE;MAC1C,IAAI,MAAMsN,CAAI,GAAG;MAGjB,IAAMM,IADmBnP,EAAK,MAAK,MAAK,SAASI,EAAE,aAAa,UAAU,GAAG,EAAE,MAAMyO,CACnD,CAAC,EAAE,aAAa,OAAO;MAEzD,AAAIM,IACA5N,EAAK,aAAa,SAAS4N,CAAU,IAErC5N,EAAK,gBAAgB,OAAO;KAEpC,CAAC;IACL,CAAC;GACL,CAAC;EACL;EAEA,KAAK/L,GAAO,sBAAsB;CACtC;AACJ,GC/Ja4Z,IAAb,cAA0C,YAAY;CACrD;CACA;CACA;CACA;CACA;CACA,aAAa;CAEb,oBAAoB;EAEnB,AADA,KAAKvf,GAAM,GACX,SAAS,iBAAiB,aAAa,KAAKwf,EAAa;CAC1D;CAEA,WAAc;EAmBZ,AAjBA,KAAK1G,GAAU,GAEf,KAAKnT,KAAS,KAAK,QAAQ,kBAAkB,GAC7C,KAAKhJ,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAK8iB,KAAa,KAAK,cAAc,mBAAmB,GAExD,iBAAiB;GAChB,KAAKC,KAAQ,KAAKD,GAAW,WAAW,cAAc,kBAAkB;EACzE,CAAC,GAGD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,YAAY,MAAM;GACpE,EAAE,gBAAgB;EACnB,CAAC,GACD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,SAAS,KAAKE,EAAQ,GACzE,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,UAAU,KAAKC,EAAY,GAChF,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,SAAS,KAAKC,EAAK;CAEnE;CAEA,WAAkB;EACjB,KAAK,YAAY;CA6BlB;CAEA,KAAK,GAAW;EACf,KAAKC,KAAUC;EAEf,IAAMrO,IAAOqO,EAAU,QAAQ,QAAQ;EACvC,KAAK,aAAarO,GAAM,QAAQ;EAEhC,IAAM+C,IAAW/C,EAAK,sBAAsB,GACtCsF,IAAY,KAAKrR,GAAO,sBAAsB,GAE9Cqa,IAAa,KAAK,eAAe,KACnCrC,IAAQlJ,EAAS,QAAQuC,EAAU,OAAQgJ,GAC3CC,IAAMxL,EAAS,SAASuC,EAAU;EAOtC,AALI2G,IAAO,MACV,IAAO,KAAK,IAAI,GAAGlJ,EAAS,OAAOuC,EAAU,IAAI,IAGlD,KAAK,MAAM,OAAO,GAAG2G,EAAK,KAC1B,KAAK,MAAM,MAAM,GAAGsC,EAAI;EAExB,IAAMC,IAAY,KAAK,cAAc,aAAa;EAOlD,AANA,EAAU,QAAQ,IAGlB,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAK,UAAU,IAAI,SAAS,GAE5B,iBAAiB;GAChB,IAAI;IAGH,AAFA,KAAKC,GAAwB,GAC7B,KAAKT,GAAM,WAAW,gBAAgB,CAAC,GACvCQ,EAAU,MAAM,EAAE,eAAe,GAAK,CAAC;GACxC,UAAU;IACT,KAAK,UAAU,OAAO,SAAS;GAChC;EACD,CAAC;CACF;CAEA,MAAiB,MAAM;EAEtB,IAAME,IAAO,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC;EAClD,AAAIA,EAAK,SAAS,IAAI,KAAM,KAAKN,MAAWM,EAAK,SAAS,KAAKN,EAAO,KAGtE,KAAK,MAAM;CACZ;CAEA,QAAQ;EAGP,AAFA,KAAK,aAAa,MAClB,KAAK,UAAU,OAAO,QAAQ,GAC9B,KAAKA,KAAU;CAChB;CAEA,KAA0B;EACzB,IAAMO,IAAkB,KAAK1jB,GAAM,KAAK,SAAS,GAC3CgZ,IAAa,KAAKmK,IAAS,WAAW,CAAC,GACvCpiB,IAAS,KAAKf,GAAM,OAAO,IAAI,KAAK,CAAC,GACrC2jB,IAAgB,KAAK3a,GAAO,WAAW,WAAW,CAAC,GACnD4a,IAAa,KAAK5jB,GAAM,YAExBiD,IAAK+V,EAAW,SAAS,MAAY;GAC1C,IAAM6K,IAAUC,EAAQ,MAClBC,IAAUD,EAAQ,MAElBE,IAAYH,KAAWE,GACvBnI,IAAWiI,IAAU9iB,EAAO,QAAQ8iB,CAAO,IAAI,IAC/CI,IAAqBN,EAAcK,MAAc,CAAC,GAElDE,oBAAY,IAAI,IAAI;GAC1B,KAAK,IAAInhB,IAAI,GAAGA,IAAI2gB,EAAgB,QAAQ,KAAK;IAChD,IAAM9hB,IAAS8hB,EAAgB3gB;IAC/B,IAAI,CAACnB,GAAQ;IAEb,IAAIuiB;IACJ,AAAIvI,KAAY,KAAKha,EAAO,IAC3B,IAASA,EAAO,EAAEga,KACRiI,KAAWA,EAAQ,SAAS,OAAO,IAC7C,IAASD,IAAaA,EAAW,SAASC,GAASjiB,GAAQmB,CAAC,IAAI,KAAA,IACtDghB,KAAWH,MACrB,IAASA,EAAW,SAASG,GAASniB,GAAQmB,CAAC;IAGhD,IAAIqhB,IAAaD;IAKjB,AAJIJ,KAAWH,MACd,IAAaA,EAAW,SAASG,GAASniB,GAAQmB,CAAC,IAGhDqhB,KAA2C,QAAQ,CAACF,EAAU,IAAIE,CAAU,KAC/EF,EAAU,IAAIE,GAAY;KACzB,GAAGD;KACH,IAAIC;IACL,CAAC;GAEH;GAEA,IAAMC,IAAa,CAAC,GAAGH,EAAU,OAAO,CAAC;GAwBzC,OAtBAG,EAAW,MAAM,GAAG,MAAM;IACzB,IAAMC,IAAO/hB,EAAE,IACTgiB,IAAOjiB,EAAE;IAEf,IAAIgiB,MAASC,GAAM,OAAO;IAC1B,IAAID,KAA+B,QAAQA,MAAS,IAAI,OAAO;IAC/D,IAAIC,KAA+B,QAAQA,MAAS,IAAI,OAAO;IAE/D,IAAMC,IAAO,OAAOF,CAAI,GAClBG,IAAO,OAAOF,CAAI;IASxB,OAJI,CAHY,MAAMC,CAAI,KAGZ,CAFE,MAAMC,CAAI,IAGlBD,IAAOC,IAGR,OAAOH,CAAI,CAAC,CAAC,cAAc,OAAOC,CAAI,CAAC;GAC/C,CAAC,GACDN,EAAmB,MAAM,GAAG,MAAe1hB,IAAID,IAAI,IAAI,EAAK,GAErD+hB,EAAW,KAAI,OAAM;IAC3B,KAAK;IACL,MAAM3iB,EAAE;IACR,OAAQA,EAAE,OAAO,MAAMA,EAAE,OAAO,QAAQA,EAAE,OAAO,KAAA,IAAa,+CAA6CA,EAAE;IAC7G,OAAOsiB;IACP,KAAKC,EAAmB,WAAW,KAAKA,EAAmB,iBAAiBviB,EAAE,CAAC,KAAK,IAAI,MAAM;GAC/F,EAAE;EACH,CAAC;EAED,KAAKohB,GAAW,KAAK,IAAI7f,CAAE;EAE3B,IAAMyhB,IAAe,KAAK,cAAc,eAAe;EACvD,AAAIA,MACH,EAAa,UAAUzhB,EAAG,SAAS,KAAKA,EAAG,OAAM,MAAQ9C,EAAK,QAAQ,GAAG;CAE3E;CAEA,WAAc;EACb,KAAKH,GAAM,UAAU;EAErB,IAAM2kB,IAAgB,KAAK5B,GAAM,KAAK,SAAS,GACzChiB,IAAS,KAAK+hB,GAAW,KAAK,cAAc,GAE5C8B,IAAiBD,EAAc,QAAO,MAAU;GACrD,IAAME,IAAMjjB,EAAO,EAAEb,EAAO,QAAQ,KAAK;GACzC,OAAQ8jB,MAAQ,OAAOA,MAAQ;EAChC,CAAC,GAEKC,IAAe,EAAE,GAAI,KAAK9b,GAAO,WAAW,WAAW,CAAC,EAAG;EAEjE,KAAKma,GAAQ,QAAQ,SAAQ,MAAW;GACvC,IAAMa,IAAYF,EAAQ,QAAQA,EAAQ,MACpClI,IAAWkI,EAAQ,OAAO/iB,EAAO,QAAQ,OAAO,IAAIA,EAAO,QAAQ,MAAM,GACzEgkB,IAAeH,EAAe,KAAI,MAAKpX,EAAE,EAAEoO,EAAS;GAE1D,AAAImJ,EAAa,SAAS,IACzB,EAAaf,KAAae,IAE1B,OAAOD,EAAad;EAEtB,CAAC;EAED,IAAM9a,IAAa,KAAK4Z,GAAW,KAAK,MAAM;EAE9C,iBAAiB;GAChB,IAAI;IAeH,AAdI5Z,MAAe0b,EAAe,SACjC,KAAKzB,GAAQ,QAAQ,SAAQ,MAAW;KACvC,IAAMa,IAAYF,EAAQ,QAAQA,EAAQ;KAC1C,AAAIE,KAAW,KAAKhb,GAAO,UAAU,MAAMgb,CAAS;IACrD,CAAC,IAED,KAAKhb,GAAO,UAAU,IAAI8b,CAAY,GAGvC,KAAK9b,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAO;KACvE,EAAI,oBAAoB;IACzB,CAAC,GAED,KAAKA,GAAO,WAAW,GACvB,KAAK,MAAM;GACZ,UAAU;IACT,KAAKhJ,GAAM,UAAU;GACtB;EACD,CAAC;CACF;CAEA,MAAY,MAAM;EAEjB,IAAMglB,IAAQ,EAAE,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK;EAEhD,IAAI,CAACA,GACJ,KAAKjC,GAAM,UAAU,MAAM;OACrB;GACN,IAAM7W,IAAa,KAAK4W,GAAW,KAAK,SAAS,GAE3CmC,IADS,KAAKnC,GAAW,KAAK,cACd,CAAC,CAAC,QAAQ,OAAO,GAEjCoC,IAAgB,CAAC;GAUvB,AATAhZ,EAAW,SAAQ,MAAU;IAC5B,IAAMqJ,IAAM0P,KAAY,KAAKrjB,EAAO,IAAIA,EAAO,EAAEqjB,KAAY;IAG7D,AAFgB,OAAO1P,CAAG,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC,YAE5C,CAAC,CAAC,SAASyP,CAAK,KACzBE,EAAc,KAAK3P,CAAG;GAExB,CAAC,GAED,KAAKwN,GAAM,UAAU,IAAI,EACxB,OAAO,CAAC,GAAG,IAAI,IAAImC,CAAa,CAAC,EAClC,CAAC;EACF;CACD;CAEA,MAAgB,MAAM;EACrB,IAAMC,IAAY,EAAE,OAAO,SACrBjZ,IAAa,KAAK4W,IAAY,MAAM,SAAS,KAAK,CAAC,GAEnDsC,IADS,KAAKtC,GAAW,KAAK,cAChB,CAAC,CAAC,QAAQ,KAAK;EAQnC,AANIsC,KAAU,KACblZ,EAAW,SAAQ,MAAU;GAC5B,EAAO,EAAEkZ,KAAUD,IAAY,MAAM;EACtC,CAAC,GAGF,KAAKrC,GAAW,QAAQ;CACzB;AAKD,GAEauC,IAAb,cAA2C,YAAY;CACtD;CACA,KAAW;CAEX,oBAAoB;EAGnB,AAFA,KAAKrc,KAAS,KAAK,QAAQ,kBAAkB,KAAK,KAAK,YAAY,CAAC,CAAC,MACrE,KAAK,oBAAoB,SAAS,KAAKsc,EAAQ,GAC/C,KAAK,iBAAiB,SAAS,KAAKA,EAAQ;CAC7C;CAEA,IAAI,UAAU;EACb,IAAI,KAAKC,IAAU,OAAO,KAAKA;EAG/B,IAAM3kB,IADO,KAAK,QAAQ,QACN,CAAC,EAAE,QAAQ,KACzB6K,IAAc,KAAKzC,GAAO,aAE1BwK,IAAO,CAAC,GACRgS,oBAAO,IAAI,IAAI;EAqBrB,OAnBI/Z,KAAe7K,MAAa,KAAA,KAC/B6K,EAAY,iBAAiB,oBAAoB7K,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;GAC7E,IAAMijB,IAAU5P,EAAI,QAAQ,MACtB8P,IAAU9P,EAAI,QAAQ;GAE5B,IAAI4P,KAAWE,GAAS;IACvB,IAAM0B,IAAY,GAAG5B,KAAW,GAAG,GAAGE,KAAW;IACjD,AAAKyB,EAAK,IAAIC,CAAS,MACtBD,EAAK,IAAIC,CAAS,GAClBjS,EAAK,KAAK;KACT,MAAMqQ;KACN,MAAME;IACP,CAAC;GAEH;EACD,CAAC,GAGF,KAAKwB,KAAW/R,GACT,KAAK+R;CACb;CAEA,4BAA4B;EAC3B,IAAM5B,IAAgB,KAAK3a,GAAO,WAAW,WAAW,CAAC,GACnD0c,IAAa,KAAK,QAAQ,MAAK,MAAW;GAC/C,IAAMrY,IAAMyW,EAAQ,QAAQA,EAAQ;GACpC,OAAOzW,KAAOsW,EAActW,MAAQsW,EAActW,EAAI,CAAC,SAAS;EACjE,CAAC;EACD,KAAK,UAAU,OAAO,YAAYqY,CAAU;CAC7C;CAEA,MAAY,MAAM;EAGjB,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EAElB,IAAMC,IAAQ,KAAK3c,GAAO,cAAc,yBAAyB,GAE3DkL,IADO,KAAK,QAAQ,QACX,CAAC,CAAC,QAAQ;EAEzB,AAAIyR,KAASA,EAAM,eAAezR,KAAOyR,EAAM,UAAU,SAAS,QAAQ,IACzEA,EAAM,MAAM,IACFA,KACVA,EAAM,KAAK,IAAI;CAEjB;AACD,GAEaC,IAAb,MAAuB;CACtB;CACA;CACA,KAAe;CACf,KAAe;CACf,KAAW,CAAC;CAEZ,YAAY,GAAO;EAGlB,AAFA,KAAK5c,KAAShE,GACd,KAAKhF,KAAQ,KAAKgJ,GAAO,YAAY,CAAC,CAAC,MACvC,KAAK3F,GAAM;CACZ;CAEA,IAAI,UAAU;EACb,OAAO,KAAKwiB;CACb;CAEA,WAAc;EACb,KAAKC,GAAiB;CACvB;CAEA,WAAyB;EACxB,IAAI,KAAK9lB,GAAM,QAAQ,YAAY,MAAM,qBACxC;EAGD,IAAI2lB,IAAQ,KAAK3c,GAAO,cAAc,yBAAyB;EAK/D,AAJK2c,MACJ,IAAQ,SAAS,cAAc,yBAAyB,GACxD,KAAK3c,GAAO,YAAY2c,CAAK,IAE9B,KAAKI,KAAeJ;CACrB;CAEA,cAAc;EACb,OAAO,KAAKK;CACb;CAEA,SAAS,MAAU;EAUlB,AATIxlB,IACH,OAAO,KAAKqlB,GAASrlB,KAErB,KAAKqlB,KAAW,CAAC,GAGlB,KAAKG,KAAe,OAAO,KAAK,KAAKH,EAAQ,CAAC,CAAC,SAAS,GACxD,KAAKI,GAAgB,GAErB,KAAKjd,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAO;GACvE,EAAI,oBAAoB;EACzB,CAAC;CACF;CAEA,OAAO,MAAY;EAElB,IAAIkd,IAAa,MAAM,QAAQC,CAAO,IACnC,OAAO,YAAY,OAAO,KAAKA,EAAQ,EAAE,CAAC,CAAC,KAAI,MAAK,CAACC,GAAG,CAAC,GAAG,IAAI,IAAID,EAAQ,KAAI,MAAQhmB,EAAKimB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IACpGD;EAMH,AAJA,KAAKN,KAAWK,GAChB,KAAKF,KAAe,OAAO,KAAKE,CAAU,CAAC,CAAC,SAAS,GACrD,KAAKld,GAAO,gBAAgB,aAAa,KAAKgd,EAAY,GAE1D,KAAKC,GAAgB;CACtB;CAEA,KAAkB;EAEjB,IAAM/Z,IADW,KAAKlM,GAAM,KACA,SAAS,GAC/Be,IAAS,KAAKf,GAAM,KAAK,cAAc,GACvCqmB,IAAa,KAAKrd,GAAO,OACzB4a,IAAa,KAAK5jB,GAAM;EAI9B,IAAI,EAFe,OAAO,KAAK,KAAK6lB,EAAQ,CAAC,CAAC,SAAS,IAEtC;GAMhB,AALA3Z,EAAW,SAAQ,MAAU;IAC5B,AAAItK,GAAQ,GAAG,IAAIlC,EAAW,KAAK,MAAM,YACxC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,OAAO,CAAC2mB,KAAc;GAEzD,CAAC,GACD,KAAKrd,GAAO,WAAW;GACvB;EACD;EAEA,IAAMsd,IAAc,OAAO,QAAQ,KAAKT,EAAQ,CAAC,CAAC,KAAK,CAACU,GAAWC,OAAmB;GACrF,IAAMC,IAASF,EAAU,SAAS,OAAO,KAAKA,EAAU,SAAS,OAAO,KAAKA,EAAU,SAAS,WAAW;GAC3G,OAAO;IACN;IACA;IACA,UAAWE,IAAqC,KAA5B1lB,EAAO,QAAQwlB,CAAS;IAC5C,YAAY,IAAI,IAAIC,CAAa;GAClC;EACD,CAAC;EAgCD,AA9BAta,EAAW,SAAS,GAAQ,MAAc;GACzC,IAAI,CAACtK,GAAQ;GAEb,AAAKA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,YACrC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,UAAU,CAAC;GAG7C,IAAIgnB,IAAS;GAEb,KAAK,IAAI3jB,IAAI,GAAGA,IAAIujB,EAAY,QAAQ,KAAK;IAC5C,IAAM,EAAE,cAAW,WAAQ,aAAU,kBAAeA,EAAYvjB,IAC5DwS;IAQJ,IANIkR,KAAU7C,IACb,IAAMA,EAAW,SAAS2C,GAAW3kB,GAAQ+kB,CAAS,IAC5C/K,KAAY,KAAKha,EAAO,MAClC,IAAMA,EAAO,EAAEga,KAGZ,CAACgL,EAAW,IAAIrR,CAAG,GAAG;KACzB,IAAS;KACT;IACD;GACD;GAEA,EAAO,EAAE,EAAE7V,EAAW,KAAK,MAAM,OAAO,CAAC2mB,KAAcK;EACxD,CAAC,GAED,KAAK1d,GAAO,UAAU,MAAM,GAE5B,KAAKA,GAAO,WAAW;CACxB;AACD;AAEK,eAAe,IAAI,yBAAyB,KAChD,eAAe,OAAO,2BAA2B4Z,CAAoB,GAGjE,eAAe,IAAI,0BAA0B,KACjD,eAAe,OAAO,4BAA4ByC,CAAqB;;ACvfxE,IAAawB,IAAb,MAAqB;CACpB;CACA;CAEA,KAAW,CAAC;CAEZ,YAAY,GAAO;EAIlB,AAHA,KAAK7d,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,iBAAiB;GAChB,KAAK8O,GAAY;EAClB,GAAG,GAAG;CACP;CAEA,KAAc;EAEb,KAAK9K,GAAO,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAO;GAEpD,EAAI,iBAAiB,aAAa,MAAM;IAEvC,IAAM+L,IAAO,EAAE,OAAO,QAAQ,QAAQ;IAKtC,IAJI,CAACA,KAAQA,EAAK,UAAU,SAAS,gBAAgB,KAEjD,CAAC,SAAQ,eAAe,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KAEnD,EAAE,WAAW,KAAK,EAAE,WAAWA,EAAK,cAAc,GAAG;IAEzD,IAAM9U,IAAO,KAAK+I,GAAO,YAAY,CAAC,CAAC;IAGvC,AADA,EAAK,UAAU,IACf,iBAAiB;KAChB,IAAI;MACH,KAAK8d,GAAY,GAAG/R,CAAI;KACzB,UAAU;MACT,EAAK,UAAU;KAChB;IACD,CAAC;GACF,CAAC;EACF,CAAC;CACF;CAEA,GAAY,GAAG,GAAM;EACpB,IAAMnU,IAAWmU,EAAK,QAAQ,KACxBzE,IAAKyE,EAAK,QAAQ,IAAI,GACtBtE,IAAcH,IAAKA,EAAG,QAAQ,UAAU,OAAOA,EAAG,eAAe,IAAI;EAE3E,IAAI1P,MAAa,KAAA,GAAW;EAE5B,IAAM6K,IAAc,KAAKzC,GAAO;EAChC,IAAI,CAACyC,GAAa;EAElB,IAAIsb,IAAU,MACVC,IAAU;EAYd,IAVAvb,EAAY,iBAAiB,oBAAoB7K,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;GAK7E,AAJIqT,EAAI,QAAQ,SACf,IAAUA,EAAI,QAAQ,OAGnBA,EAAI,QAAQ,SACf,IAAUA,EAAI,QAAQ;EAExB,CAAC,GAEG,CAAC8S,KAAW,CAACC,GAAS;EAE1B,IAAMC,IAAQlS,EAAK,UAAU,SAAS,KAAK,GACrCmS,IAASnS,EAAK,UAAU,SAAS,MAAM;EAE7C,AAAI,CAAC,EAAE,WAAW,CAAC,EAAE,aACpB,KAAKwQ,KAAW,CAAC;EAGlB,IAAM4B,IAAmB,KAAK5B,GAAS,WACtC,MAAM6B,EAAE,aAAaxmB,KAAYwmB,EAAE,gBAAgB3W,KAAgB2W,EAAE,YAAYL,CAClF,GAEMM,IAAW;GAChB;GACA;GACA,SAASN,KAAWC;GACpB,SAASD,KAAWC;GACpB,MAAMA;GACN,KAAK;GACL,aAAaA,KAAW,GAAQ,MAAQ,KAAKhnB,GAAM,WAAWgnB,GAASplB,GAAQnB,CAAG,IAAI;EACvF;EAoBA,AAlBI,CAACwmB,KAAS,CAACC,IACVC,KAAoB,IACvB,KAAK5B,GAAS4B,EAAiB,CAAC,MAAM,KAEtC,KAAK5B,GAAS,KAAK;GAAE,GAAG8B;GAAU,KAAK;EAAK,CAAC,IAEpCJ,IACNE,KAAoB,IACvB,KAAK5B,GAAS4B,EAAiB,CAAC,MAAM,KAEtC,KAAK5B,GAAS,KAAK;GAAE,GAAG8B;GAAU,KAAK;EAAM,CAAC,IAG/C,KAAK9B,KAAW,KAAKA,GAAS,QAC7B,MAAK,EAAG6B,EAAE,aAAaxmB,KAAYwmB,EAAE,gBAAgB3W,KAAgB2W,EAAE,YAAYL,EACpF,GAGD,KAAKO,GAAcvS,CAAI;CACxB;CAEA,GAAc,GAAM;EAKnB,AAHA,KAAK/L,GAAO,KAAK,WAAW,KAAKuc,EAAQ,GACzC,KAAKgC,GAAc,GACnB,KAAKve,GAAO,WAAW,GACvB,4BAA4B;GAC5B,IAAM0Y,IAAQ,KAAK1Y,GAAO,iBAAiB,8BAA8B;GAczE,AAZA0Y,EAAM,SAAQ,MAAO;IAGpB,AAFAzN,EAAI,UAAU,OAAO,oBAAoB,qBAAqB,mBAAmB,GAE7Ec,EAAK,UAAU,SAAS,KAAK,IAChCd,EAAI,UAAU,IAAI,kBAAkB,IAC1Bc,EAAK,UAAU,SAAS,MAAM,IACxCd,EAAI,UAAU,IAAI,mBAAmB,IAErCA,EAAI,UAAU,IAAI,mBAAmB;GAEvC,CAAC,GAED,4BAA4B;IAC3B,EAAM,SAAQ,MAAO;KACpB,EAAI,UAAU,OAAO,oBAAoB,qBAAqB,mBAAmB;IAClF,CAAC;GACF,CAAC;EACD,CAAC;CACF;CAEA,KAAgB;EAKf,AAJA,KAAKjL,GAAO,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAM;GAChE,EAAG,UAAU,OAAO,OAAO,MAAM;EAClC,CAAC,GAEG,KAAKuc,GAAS,WAAW,KAI7B,KAAKA,GAAS,SAAQ,MAAW;GAChC,IAAM,EAAE,aAAU,gBAAa,WAAQiC;GAEvC,IAAI5mB,MAAa,KAAA,GAAW;IAC3B,IAAIoP,IAAW,oBAAoBpP,EAAS;IAM5C,AALI6P,MAAgB,KAAA,MACnB,IAAW,yBAAyBA,EAAY,gBAAgB7P,EAAS,MAI1E,KAD+BoI,GAAO,iBAAiBgH,CACvC,CAAC,CAAC,SAAQ,MAAQ;KACjC,EAAK,UAAU,IAAIyX,IAAM,QAAQ,MAAM;IACxC,CAAC;GACF;EACD,CAAC;CACF;CAEA,UAAU;EAOT,AANA,KAAKlC,KAAW,CAAC,GACb,KAAKvc,GAAO,QACf,KAAKA,GAAO,KAAK,aAAa,GAG/B,KAAKue,GAAc,GACnB,KAAKve,GAAO,YAAY,QAAQ,EAAI;CACrC;AACD,GC3Ka0e,IAAb,MAAuB;CACtB;CACA;CACA,KAAkB,CAAC;CAEnB,KAAe,CAAC;CAEhB,KAAwB;CAExB,YAAY,GAAO;EAIlB,AAHA,KAAK1e,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK,QAAQ;CACd;CAEA,YAAY,GAAI,MAAU;EAEzB,IAAI,CAAC,KAAK2iB,IAAuB;GAChC,IAAMtlB,IAAU,KAAKrC,GAAM,KAAK,SAAS;GACzC,KAAK2nB,KAAwB,KAAKC,GAAa,KAAI,MAAOvlB,EAAQ5B,EAAI;EACvE;EAEA,IAAMonB,IAAiB,KAAKF;EAE5B,IAAIrnB,KAA2B,MAC9B,OAAOunB;EAGR,IAAIvnB,IAAK,KAAKA,KAAMunB,EAAe,QAAQ,OAAO;EAElD,IAAMtnB,IAAesnB,EAAevnB;EACpC,IAAIE,KAAS,MAAM;GAElB,IAAMC,IADS,KAAKT,GAAM,KAAK,cACd,CAAC,CAAC,QAAQQ,CAAK;GAChC,OAAQC,KAAO,KAAKF,EAAa,IAAKA,EAAa,EAAEE,KAAO;EAC7D;EAEA,OAAOF;CACR;CAEA,cAAc;EACb,IAAI,CAAC,KAAKonB,IAAuB;GAChC,IAAMtlB,IAAU,KAAKrC,GAAM,KAAK,SAAS;GACzC,KAAK2nB,KAAwB,KAAKC,GAAa,KAAI,MAAOvlB,EAAQ5B,EAAI;EACvE;EAEA,OAAO,KAAKknB,GAAsB;CACnC;CAEA,OAAO,GAAI,MAAU;EACpB,IAAME,IAAiB,KAAK,SAAS,GAC/B9mB,IAAS,KAAKf,GAAM,KAAK,gBAAgB,KAAK,CAAC;EAErD,IAAIM,KAA2B,MAC9B,OAAOunB,EAAe,KAAI,MAAU,KAAKC,GAAYlmB,GAAQb,CAAM,CAAC;EAGrE,IAAIT,IAAK,KAAKA,KAAMunB,EAAe,QAAQ,OAAO;EAElD,IAAMtnB,IAAesnB,EAAevnB;EACpC,IAAI,CAACC,GAAc,OAAO;EAE1B,IAAIC,KAAS,MAAM;GAClB,IAAMC,IAAMM,EAAO,QAAQP,CAAK;GAChC,OAAQC,KAAO,KAAKF,EAAa,IAAKA,EAAa,EAAEE,KAAO;EAC7D;EAEA,OAAO,KAAKqnB,GAAYvnB,GAAcQ,CAAM;CAC7C;CAEA,MAAe,GAAG,MAAW;EAC5B,IAAI,CAACW,GAAG,OAAO;EACf,IAAMsS,IAAI,CAAC;EAMX,OALAjT,EAAO,SAAS,GAAO,MAAM;GAC5B,EAAEP,KAASkB,EAAE,IAAIA,EAAE,EAAEqB,KAAKrB,EAAElB;EAC7B,CAAC,GACGkB,EAAE,MAAG,EAAE,IAAIA,EAAE,IACbA,EAAE,MAAG,EAAE,IAAIA,EAAE,IACVsS;CACR;CAEA,gBAAgB;EAEf,KAAK2T,KAAwB;EAE7B,IAAMzb,IAAa,KAAKlM,GAAM,KAAK,SAAS,GACxC2Q,IAAU,CAAC;EAYf,AAXAzE,EAAW,SAAS,GAAQ,MAAM;GACjC,IAAI,CAACtK,GAAQ;GACb,IAAMmmB,IAAanmB,EAAO,GAAG,IAAIlC,EAAW,KAAK,MAAM;GACvD,AAAIqoB,KAAcA,EAAW,KAAK/e,GAAO,WAAW,MACpD2H,EAAQ,KAAK5N,CAAC;EACf,CAAC,GAEG,KAAKilB,GAAgB,SAAS,MACjC,IAAU,KAAKV,GAAc3W,GAASzE,CAAU,IAGjD,KAAK0b,KAAejX;EACpB,IAAMvQ,IAAeuQ,EAAQ,KAAI,MAAOzE,EAAWzL,EAAI,GAEjD+K,IAAe,KAAKxC,GAAO,UAAU,WAAW,CAAC;EACvD,IAAIwC,EAAa,SAAS,GAAG;GAC5B,IAAMyc,IAAcjc,EAAS,MAAM5L,GAAcoL,GAAc,KAAKxL,GAAM,KAAK,cAAc,CAAC;GAI9F,AAFA,KAAK2nB,KAAwBM,EAAY,aAEzC,KAAKjf,GAAO,SAAS,YAAYif,EAAY,QAAQ;EACtD,OACC,KAAKN,KAAwBvnB;CAK/B;CAEA,cAAc,MAAY;EAEzB,AADA,KAAK4nB,KAAkBE,KAAW,CAAC,GACnC,KAAK,QAAQ;CACd;CAEA,mBACQ,KAAKF;CAGb,qBAAqB;EAEpB,AADA,KAAKA,KAAkB,CAAC,GACxB,KAAK,QAAQ;CACd;CAGA,MAAiB,GAAS,MAAiB;EAE1C,IAAMjnB,IAAS,OAAO,KAAKf,GAAM,KAAK,iBAAkB,aAAa,KAAKA,GAAM,KAAK,cAAc,IAAI,CAAC,GAElGmoB,IAAe,KAAKH,GAAgB,KAAI,OAAS;GACtD,GAAGI;GACH,UAAUrnB,EAAO,QAAQqnB,EAAK,WAAWA,EAAK,OAAO;EACtD,EAAE;EAEF,OAAOzX,EAAQ,MAAM,GAAM,MAAS;GACnC,IAAMpO,IAAInC,EAAaioB,IACjB/lB,IAAIlC,EAAakoB;GAEvB,KAAK,IAAMF,KAAQD,GAAc;IAChC,IAAMlB,IAAQmB,EAAK,KACbjkB,IAAOikB,EAAK,MACd9D,GAAMC;IAEV,AAAIpgB,KACH,IAAO,KAAKnE,GAAM,WAAW,SAASmE,GAAM5B,GAAG8lB,CAAI,GACnD,IAAO,KAAKroB,GAAM,WAAW,SAASmE,GAAM7B,GAAGgmB,CAAI,KAE/CF,EAAK,YAAY,KAAK7lB,EAAE,KAAKD,EAAE,MAClC,IAAOC,EAAE,EAAE6lB,EAAK,WAChB,IAAO9lB,EAAE,EAAE8lB,EAAK;IAIlB,IAAMG,IAAYjE,KAAS,QAA8BA,MAAS,IAC5DkE,IAAYjE,KAAS,QAA8BA,MAAS;IAElE,IAAI,OAAYiE,IAChB;SAAID,GAAU,OAAO;KACrB,IAAIC,GAAU,OAAO;KAErB,IAAIlE,MAASC,GAAM;MAClB,IAAIzJ,IAAO;MAEX,IAAI,OAAOwJ,KAAS,YAAY,OAAOC,KAAS,UAC/C,IAAOD,IAAOC;WACR;OACN,IAAMkE,IAAO,OAAOnE,CAAI,GAClBoE,IAAO,OAAOnE,CAAI;OACxB,IAAOkE,IAAOC,IAAO,IAAKD,IAAOC,IAAO,KAAK;MAC9C;MAEA,IAAI5N,MAAS,GACZ,OAAOmM,IAAQnM,IAAO,CAACA;KAEzB;IAjBqB;GAkBtB;GAEA,OAAOuN,IAAOC;EACf,CAAC;CACF;AACD,GC1LaK,IAAb,MAAaA,EAAY;CAErB,OAAO,gBAAgB,GAAM,GAAK;EA2B9B,OAzBAA,EAAYC,GAAgB5kB,CAAG,GAC/B2kB,EAAYE,GAAa7kB,CAAG,GAC5B2kB,EAAYG,GAAqB9kB,CAAG,GAEpC2kB,EAAYI,GAAoB/kB,CAAG,GAEnC2kB,EAAYK,GAAwBhlB,CAAG,GAEvCkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,UAAU,CAAC,GACjEkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,kCAAgC,CAAC,GACvFkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,wCAAsC,CAAC,GAC7FkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,UAAU,CAAC,GAEjE2kB,EAAYM,GAAoBjlB,CAAG,GAEnC2kB,EAAYO,GAAgCllB,CAAG,GAE/C2kB,EAAYQ,GAAclpB,GAAM+D,CAAG,GAEnC2kB,EAAYS,GAAkBplB,CAAG,GAEjC2kB,EAAYU,GAAmBppB,GAAM+D,CAAG,GAExC2kB,EAAYW,GAAwBtlB,CAAG,GAEhCA;CACX;CAEA,OAAOilB,GAAoB,GAAK;EAC5B,IAAMM,IAAQvlB,EAAI,cAAc,OAAO;EACvC,IAAI,CAACulB,KAASA,EAAM,cAAc,yBAAyB,GAAG;EAE9D,IAEMjZ,IAAKiZ,EAAM,UAAU,CAAC;EAG5B,AAFAjZ,EAAG,aAAa,QAAQ,KAAK,GAC7BA,EAAG,UAAU,IAAI,wBAAwB,GACzCA,EAAG,UAAU,IAAI,UAAU;EAE3B,IAAMkZ,IAAWxlB,EAAI,cAAc,UAAU;EAC7C,IAAI,CAACwlB,GAAU;EAEf,IAAIC,IAAM;EACV,EAAS,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAM;GAC9C,IAAI,CAACC,EAAG,UAAU,SAAS,OAAO,GAAG;IACjC,IAAM/V,IAAU+V,EAAG,WAAW;IAC9B,KAAK,IAAI3mB,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;KAC9B,IAAM9U,IAAO,oEAAO,QAAQ,QAAQ4qB,CAAG,CAAC,CAAC,QAAQ,SAASd,EAAYgB,GAAe,GAAK,CAAC;KAC3F,EAAG,mBAAmB,aAAa9qB,CAAI;IAC3C;GACJ;EACJ,CAAC;EAED,IAAM2U,IAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC;EAC5D,EAAG,iBAAiB,gBAAgB,CAAC,CAAC,SAAS,GAAI,MAAM;GACrD,IAAM4lB,IAAapW,EAAKzQ,EAAE,CAAC,aAAa,YAAY;GACpD,AAAI6mB,MACA,EAAG,MAAM,aAAaA;EAE9B,CAAC;CACL;CAEA,OAAOD,GAAe,GAAK;EACvB,IAAIhjB,IAAO;EACX,KAAK,IAAI,IAAIkjB,GAAK,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAC/C,IAAO,OAAO,aAAa,KAAM,IAAI,EAAG,IAAIljB;EAEhD,OAAOA;CACX;CAEA,OAAOmiB,GAAqB,GAAK;EAC7B,IAAI5X,IAAQlN,EAAI,cAAc,6BAA6B;EAE3D,IAAKkN,GAEL;GAEA,IAFAA,EAAM,UAAU,IAAI,MAAM,GAEtB,CAAClN,EAAI,cAAc,YAAY,GAAG;IAClC,IAAM8lB,IAAY,SAAS,cAAc,OAAO;IAEhD,AADAA,EAAU,UAAU,IAAI,MAAM,GAC9B5Y,EAAM,OAAO4Y,CAAS;GAC1B;GAEA,IAAI,CAAC9lB,EAAI,cAAc,YAAY,GAAG;IAClC,IAAM+lB,IAAY,SAAS,cAAc,OAAO;IAEhD,AADAA,EAAU,UAAU,IAAI,MAAM,GAC9B7Y,EAAM,MAAM6Y,CAAS;GACzB;EAZ0B;CAa9B;CAEA,OAAOnB,GAAgB,GAAK;EACxB,IAAI3H,IAAWjd,EAAI,cAAc,UAAU;EAM3C,IALKid,MACD,IAAW,SAAS,cAAc,UAAU,GAC5Cjd,EAAI,QAAQid,CAAQ,IAGpBA,EAAS,iBAAiB,KAAK,CAAC,CAAC,WAAW,GAAG;GAC/C,IAAMuI,IAAWxlB,EAAI,cAAc,UAAU,GACzCgmB,IAAW;GAMf,AALIR,MACA,IAAW,MAAM,KAAKA,EAAS,iBAAiB,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAK,MAC7DS,KAAO,SAASlV,EAAK,aAAa,SAAS,KAAKA,EAAK,SAAS,EAAE,KAAK,IAC7E,CAAC,IAER,IAAW,KAAK,IAAIiV,GAAU,CAAC;GAE/B,KAAK,IAAIjnB,IAAI,GAAGA,IAAIinB,GAAU,KAAK;IAC/B,IAAM9V,IAAM,SAAS,cAAc,KAAK;IACxC,EAAS,YAAYA,CAAG;GAC5B;EACJ;CACJ;CAEA,OAAO8U,GAAwB,GAAK;EAChC,IAAMxV,IAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC;EAC5D,IAAIwP,EAAK,WAAW,GAAG;EAEvB,IAAM0W,IAAiBlmB,EAAI,eAAe,GACpCmmB,IAAe,KAAK,IAAI,KAAK,MAAMD,IAAiB1W,EAAK,MAAM,GAAG,GAAG;EAE3E,EAAK,SAAS,GAAK,MAAM;GAErB,AAAKU,EAAI,aAAa,UAAU,KAC5BA,EAAI,aAAa,YAAYnR,CAAC;GAGlC,IAAMqW,IAAQlF,EAAI,aAAa,OAAO,KAAK,SAASA,EAAI,MAAM,OAAO,EAAE,KAAKiW;GAC5E,EAAI,aAAa,SAAS/Q,CAAK;GAE/B,IAAMgR,IAAW,OAAOhR,CAAK,CAAC,CAAC,SAAS,IAAI,IAAIA,IAAQ,GAAGA,EAAM;GACjE,EAAI,MAAM,QAAQgR;EACtB,CAAC;CACL;CAEA,OAAOvB,GAAa,GAAK;EACrB,IAAI7kB,EAAI,cAAc,OAAO,GAAG;EAEhC,IAAMulB,IAAQ,SAAS,cAAc,OAAO,GACtCtI,IAAWjd,EAAI,cAAc,UAAU;EAE7C,AAAIid,IACAA,EAAS,MAAMsI,CAAK,IAEpBvlB,EAAI,QAAQulB,CAAK;CAEzB;CAEA,OAAOL,GAAgC,GAAK;EAExC,EADoB,iBAAiB,oBAC/B,CAAC,CAAC,SAAQ,MAAQ;GAEpB,AADoBnU,EAAK,aAAa,WAAW,MAAM,UACpCA,EAAK,aAAa,aAAa,MAAM,UACpDA,EAAK,aAAa,eAAe,MAAM;EAE/C,CAAC;CACL;CAEA,OAAOoU,GAAc,GAAM,GAAM;EAE7B,IAAMkB,IAAmB;GAAC;GAAa;GAAa;EAAM,GACtDC,IAAgB;EAiDpB,AA/CAC,EAAK,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAS;GAEzD,IAAMC,IAAU,QADC9e,EAAM,aAAa,WAAW,KAAK,cAG9C+e,IAAY/e,EAAM,cAAc,UAAU;GAEhD,IAAI+e,GAAW;IACX,IAAI7iB,IAAI,CAAC;IACT,EAAU,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAW;KACpD,EAAE,KAAK;MACH,GAAG8iB,EAAQ,aAAa,GAAG;MAC3B,GAAGA,EAAQ,aAAa,GAAG;MAC3B,OAAOA,EAAQ,aAAa,OAAO;KACvC,CAAC;IACL,CAAC;IAED,IAAMC,IAAiB,QAAQ,KAAK,IAAI,EAAE,GAAG,EAAEL;IAQ/C,AANIrqB,MACA,EAAK0qB,WAAwB/iB,IAGjC8D,EAAM,aAAa,eAAe,QAAQif,EAAe,GAAG,GAE5DF,EAAU,OAAO;GACrB;GAEA,IAAMtmB,IAAOuH,EAAM,QAAQ;GAiB3B,AAhBIvH,KACAuH,EAAM,aAAa,aAAazL,EAAK,WAAW,WAAWkE,CAAI,CAAC,GAGpE,MAAM,KAAKuH,EAAM,UAAU,CAAC,CAAC,SAAQ,MAAQ;IACzC,AAAI;KAAC;KAAa;KAAa;KAAa;IAAW,CAAC,CAAC,SAASxH,EAAK,IAAI,MACvEA,EAAK,MAAM,SAAS,OAAO,KAAKA,EAAK,MAAM,SAAS,OAAO,MAC3DwH,EAAM,aAAaxH,EAAK,MAAMjE,EAAK,WAAW,WAAWiE,EAAK,KAAK,CAAC;GAE5E,CAAC,GAMD,EAAM,YAAY,IAAIsmB,EAAQ,GAJXH,EACd,QAAO,MAAQ3e,EAAM,aAAaxH,CAAI,CAAC,CAAC,CACxC,KAAI,MAAQ,GAAGA,EAAK,IAAIwH,EAAM,aAAaxH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,KAAKsmB,EAAQ,IACnE9e,EAAM,aAAa,YAAY,GAAG;EACtC,CAAC,GAED6e,EAAK,iBAAiB,wCAAwC,CAAC,CAAC,SAAQ,MAAS;GAC7E,IAAMK,IAAWlf,EAAM,aAAa,WAAW;GAC/C,IAAIkf,GAAU;IACV,IAAMC,IAAkBnf,EAAM,WACxB8e,IAAU,QAAQI;IAKxB,EAAM,YAAY,IAAIJ,EAAQ,GAJXH,EACd,QAAO,MAAQ3e,EAAM,aAAaxH,CAAI,CAAC,CAAC,CACxC,KAAI,MAAQ,GAAGA,EAAK,IAAIwH,EAAM,aAAaxH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,YAAY2mB,EAAgB,MAAML,EAAQ;GACpG;EACJ,CAAC;CACL;CAEA,OAAOnB,GAAmB,GAAM,GAAK;EACjC,IAAMyB,IAAa7qB,EAAK,aAAa,WAAW,MAAM,QAChD8qB,IAAc/mB,EAAI,aAAa,WAAW,MAAM;EAEtD,EAAI,iBAAiB,oFAAoF,CAAC,CAAC,SAAQ,MAAQ;GACvH,IAAMgnB,IAAiBjW,EAAK,aAAa,WAAW,MAAM,UAAUgW,KAAeD;GAInF,AAFA/V,EAAK,aAAa,aAAaiW,IAAiB,SAAS,OAAO,GAE5DA,KACAjW,EAAK,YAAY,SAAS,cAAc,0BAA0B,CAAC;EAE3E,CAAC;CACL;CAEA,OAAOqU,GAAkB,GAAK;EAE1B,EAAI,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAQ;GAEvD,IADsBrU,EAAK,aAAa,aAAa,MAAM,UAAUA,EAAK,aAAa,YAAY,MAAM,QACrF;GAEpB,IAAMnU,IAAW,SAASmU,EAAK,QAAQ,KAAK,EAAE,GACxCpB,IAAUoB,EAAK,WAAW,GAC1Bb,IAAMlQ,EAAI,cAAc,0BAA0BpD,EAAS,GAAG,GAE9DqqB,IAAe/W,KAAO,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;GAEvE,CAAI,CAACa,EAAK,QAAQ,eAAe,SAASA,EAAK,QAAQ,aAAa,EAAE,KAAA,QAClE,EAAK,QAAQ,cAAc,OAAOkW,IAAA,KAAiCA,IAAe,GAAG;GAGzF,IAAIC,IAAYnW,EAAK,cAAc,uBAAuB;GAQ1D,IAPKmW,MACD,IAAY,SAAS,cAAc,uBAAuB,GAC1DnW,EAAK,aAAamW,GAAWnW,EAAK,UAAU,IAG5BA,EAAK,aAAa,WAAW,MAAM,QAEtC;IAIb,AAHAmW,EAAU,UAAU,IAAI,WAAW,GACnCA,EAAU,UAAU,OAAO,QAAQ,GACnCA,EAAU,aAAa,aAAa,MAAM,GAC1C,EAAK,MAAM,QAAQ;IAEnB,IAAMC,IAAc,KAAK,IAAI,IAAI,KAAK,MAAA,KAAwBxX,CAAO,CAAC;IACtE,IAAI,CAAC,MAAM/S,CAAQ,GACf,KAAK,IAAImC,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;KAC9B,IAAMuN,IAAYld,EAAI,cAAc,0BAA0BpD,IAAWmC,EAAE,GAAG;KAC9E,AAAIme,MACAA,EAAU,aAAa,SAASiK,CAAW,GAC3C,EAAU,MAAM,QAAQ,GAAGA,EAAY;IAE/C;GAER,OAII,AAHAD,EAAU,UAAU,OAAO,WAAW,GACtCA,EAAU,UAAU,IAAI,QAAQ,GAChCA,EAAU,aAAa,aAAa,OAAO,GAC3C,EAAK,MAAM,QAAQ;EAE3B,CAAC;CACL;CAEA,OAAOnC,GAAoB,GAAK,GAAM;EAElC,IAAM9pB,IAAI+E,EAAI,aAAa,eAAe,MAAM,SAAS,KAAK,GAExDid,IAAWjd,EAAI,cAAc,UAAU,GAGvCkQ,IAAM,SAAS,cAAc,KAAK;EAQxC,AANAA,EAAI,aAAa,SAAS,MAAM,GAChCA,EAAI,aAAa,SAASjV,CAAC,GAC3B,EAAI,MAAM,QAAQ,GAAGA,EAAE,KACvBgiB,EAAS,QAAQ/M,CAAG,GAGpBlQ,EAAI,iBAAiB,qBAAqB,CAAC,CAAC,SAAQ,MAAW;GAC3D,IAAMonB,IAAO,MAAM,KAAKC,EAAQ,iBAAiB,IAAI,CAAC;GACtD,IAAID,EAAK,WAAW,GAAG;GAEvB,IAAM3c,IAAU2c,EAAK,IAEfE,IAAgB,SAAS,cAAc,IAAI;GAQjD,AAPA,EAAc,YAAY,iBAC1BA,EAAc,aAAa,aAAa,eAAe,GAEnDF,EAAK,SAAS,MACd,EAAc,UAAUA,EAAK,SAGjC3c,EAAQ,aAAa6c,GAAe7c,EAAQ,iBAAiB;EACjE,CAAC;CACL;CAEA,OAAO6a,GAAwB,GAAK;EAEhC,EAAI,iBAAiB,4BAA4B,CAAC,CAAC,SAAQ,MAAQ;GAE/D,IAAMiC,IAAc,SAASxW,EAAK,aAAa,UAAU,GAAG,EAAE;GAC9D,IAAI,MAAMwW,CAAW,GAAG;GAGxB,IAAM5X,IAAU,SAASoB,EAAK,aAAa,SAAS,KAAKA,EAAK,SAAS,EAAE,KAAK,GAC1E6D,IAAa;GAGjB,KAAK,IAAI7V,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;IAC9B,IAAM6X,IAAYD,IAAcxoB,GAC1BmR,IAAMlQ,EAAI,cAAc,0BAA0BwnB,EAAU,GAAG;IACrE,AAAItX,MACA,KAAc,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;GAEjE;GAEA,AAAI0E,IAAa,KACI,GAAGA;EAK5B,CAAC;CACL;AACJ,GCnWa6S,IAAb,MAAsB;CAClB;CACA;CAEA,YAAY,GAAO;EAEf,AADA,KAAKziB,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC;CACrC;CAuBA,MAAM;EAEF,WAAW,GAAU,GAAO,IAAgB,SAAS;GAEjD,MADyB,KAAK,KAAKgE,GAAO,iBAAiB,gCAAgCpI,EAAS,GAAG,CAC9F,CAAC,CAAC,SAAQ,MAAO;IAEtB,AADAsT,EAAI,aAAa,SAASkF,CAAK,GAC/B,EAAI,MAAM,QAAQ,GAAGA,EAAM;GAC/B,CAAC;EAEL;EAGA,WAAW,MAAa;GACpB,IAAMsS,IAAQ,KAAK1iB,GAAO,cAAc,gCAAgCpI,EAAS,GAAG;GAEpF,OADK8qB,KACE,SAASA,EAAM,aAAa,OAAO,KAAKA,EAAM,MAAM,OAAO,EAAE,KAAK;EAC7E;EACA,4BAA4B,GAAM,MAAc;GAE5C,IAAM9P,IAAW,KAAK5b,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQ0b,EAAU,QAAQ,IAAI,GAEjEG,IADgB,OAAO,iBAAiBH,CACrB,CAAC,CAAC,QAAQ,mBAC/BK,IAAe;GAUnB,OARA,KAAK/S,GAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAQ,MAAQ;IACjD,IAAMuM,IAAM,OAAOmG,EAAU,QAAQ,OAAO,KAAK1b,GAAM,WAAW,SAAS0b,EAAU,QAAQ,MAAM9Z,GAAQnB,CAAG,IAAImB,EAAO,EAAEga,MAAa,EAAE,CAAC,CAAC,KAAK,GAC3II,IAAO,KAAK,gBAAgBzG,GAAKsG,CAAI;IAC3C,AAAIG,EAAK,SAASA,EAAK,QAAQD,MAC3B,IAAeC,EAAK;GAE5B,CAAC,GAEMD;EACX;EAEA,UAAU,MAAa;GACnB,IAAMhH,IAAO,KAAK/L,GAAO,cAAc,sBAAsBpI,EAAS,GAAG,GACnE8a,IAAY,KAAK1S,GAAO,cAAc,yBAAyBpI,EAAS,GAAG;GAEjF,AAAKmU,KAAS2G,KAEd,KAAK1b,GAAM,cAAc;IACrB,IAAMic,IAAkB,KAAK,IAAI,0BAA0BlH,GAAM2G,CAAS;IAC1E,AAAIO,MAAoB,QACpB,KAAK,IAAI,SAASrb,GAAUqb,CAAe;GAEnD,CAAC;EACL;EAGA,aAAa,GAAU,MAAc;GAKjC,AAHA,KADqBjT,GAAO,iBAAiB,gCAAgCpI,EAAS,mBAAmBA,EAAS,mBAAmBA,EAAS,GACxI,CAAC,CAAC,SAAQ,MAAM;IAClB,EAAG,MAAM,UAAUkW,IAAY,KAAK;GACxC,CAAC,GACD,KAAK9N,GAAO,YAAY,QAAQ;EACpC;CACJ;CAEA,MAAM;EACF,UACQ,KAAKA,GAAO,UAAU,SAAS,IAAU,KACtC,KAAK,MAAM,KAAKA,GAAO,UAAU,SAAS,KAAKA,GAAO,SAAS,MAAM;EAEhF,OAAO,OAAO,GAAO,MAAa;GAE9B,AAAK,KAAKA,GAAO,IAAI,UAAUvG,CAAK,IAQhC,MAAM,IAAI,SAAS,MAAY,sBAAsBkpB,CAAO,CAAC,IAP7D,MAAM,IAAI,SAAS,MAAY;IAC3B,KAAK3iB,GAAO,IAAI,OAAOvG,SAAa;KAChC,EAAQ;IACZ,CAAC;GACL,CAAC;GAOL,IAAMmpB,IAAO,KAAK5iB,GAAO,iBAAiB,6BAA6BvG,EAAM,GAAG,GAC1EopB,IAAa,MAAM,KAAKD,IAAM,MAAO,SAASjgB,EAAI,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,QAAO,MAAK,CAAC,MAAMmgB,CAAC,CAAC,GAE/FtY,IAAO,CAAC;GAQd,IAPAoY,EAAK,SAAQ,MAAO;IAChB,EAAI,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAS;KAE5C,AADY,SAASlgB,EAAM,QAAQ,KAAK,EAClC,KAAK,KAAG8H,EAAK,KAAK,SAAS9H,EAAM,QAAQ,KAAK,EAAE,CAAC;IAC3D,CAAC;GACL,CAAC,GAEGmgB,EAAW,WAAW,KAAKrY,EAAK,WAAW,GAAG;GAElD,IAAM1Q,IAAS,KAAKkG,GAAO,UAAU,SAAS,KAAK,IAAI,GAAG6iB,CAAU,GAAG,KAAK,IAAI,GAAGrY,CAAI,GAAG,KAAK,IAAI,GAAGqY,CAAU,GAAG,KAAK,IAAI,GAAGrY,CAAI,CAAC;GAMpI,OAJI,OAAOuY,KAAa,cACpBA,EAAS,GAGNjpB;EACX;EACA,YAAY,MAAU;GAElB,IAAMkpB,IAAa,KAAKhjB,GAAO,cAAc,gBAAgB,GAEvD4iB,IAAOI,EAAW,iBAAiB,gDAAgDvpB,EAAM,GAAG;GAClG,IAAI,CAACmpB,KAAQA,EAAK,WAAW,GAAG,OAAO;GAEvC,IAAM7T,IAAeiU,EAAW,sBAAsB,GAChDhU,IAAcgU,EAAW,cAAc,OAAO,CAAC,EAAE,gBAAgB,GACjEC,IAAcD,EAAW,cAAc,OAAO,CAAC,EAAE,gBAAgB,GAEjEE,IAAcnU,EAAa,MAAMC,GACjCmU,IAAiBpU,EAAa,SAASkU,GAEzCnV,IAAY;GAEhB,KAAK,IAAMnL,KAAOigB,GAAM;IACpB,IAAMQ,IAASzgB,EAAI,sBAAsB,GAEnC0gB,IAAUD,EAAO,MAAMF,GACvBI,IAAUF,EAAO,SAASD;IAEhC,IAAIE,KAAWC,GAAS;KACpB,IAAY;KACZ;IACJ;GACJ;GAEA,OAAOxV;EACX;EACA,MAAM,GAAY,MACP,KAAK9W,GAAM,KAAK,IAAIoB,GAAYa,CAAW;EAEtD,SAAS,GAAO,MAAa;GACzB,AAAI,KAAK+G,GAAO,IAAI,UAAUvG,CAAK,IAC3B,OAAOspB,KAAa,cAAYA,EAAS,IAE7C,KAAK/iB,GAAO,SAASvG,SAAa;IAC9B,AAAI,OAAOspB,KAAa,cAAYA,EAAS;GACjD,CAAC;EAET;EACA,SAAS,GAAO,GAAY,IAAc,OAAS;GAG/C,IAAMxqB,IADc,KAAKyH,GAAO,KAAK,IAAIvG,CACjB,CAAC,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM,QAE9C6sB,IAAU,KAAKvsB,GAAM,KAAK,OAAOuB,GAAOH,GAAYa,CAAW;GAQrE,OAPgB,KAAK+G,GAAO,KAAK,SAEP,CAAC,CAAC,WAAU,MAC9B,CAACpH,KAAU,CAACA,EAAO,KAAK,CAACA,EAAO,EAAE,IAAU,KACzCA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,WAAW6sB,CAGtC;EACrB;EACA,SAAS,MAAU;GAGf,IAAMhrB,IADc,KAAKyH,GAAO,KAAK,IAAIvG,CACjB,CAAC,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM;GAEpD,KAAKM,GAAM,KAAK,OAAOuB,CAAK;EAChC;CACJ;AACJ,GCjLairB,IAAb,cAAoC,YAAY;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAEA,KAAU,EACN,OAAO,KACX;CAEA;CAEA,KAAY;EACR,QAAQ;EACR,QAAQ;EACR,SAAS,CAAC;CACd;CAEA,OAAO,iBAAiB;CAExB,cAAc;EAQV,AAPA,MAAM,GAEN,KAAKxsB,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKysB,KAAc,IAAIhf,EAAW,IAAI,GAEtC,KAAKif,KAAO,IAAIjB,EAAS,IAAI,GAE7B,KAAKkB,GAAgB;CACzB;CAEA,oBAAoB;EAChB,KAAKtpB,GAAM;CACf;CAEA,IAAI,WAAW;EAAE,OAAO,KAAKupB;CAAW;CACxC,IAAI,QAAQ;EAAE,OAAO,KAAKC;CAAQ;CAClC,IAAI,aAAa;EAAE,OAAO,KAAKC;CAAa;CAC5C,IAAI,YAAY;EAAE,OAAO,KAAKC;CAAY;CAC1C,IAAI,WAAW;EAAE,OAAO,KAAKC;CAAW;CACxC,IAAI,WAAW;EAAE,OAAO,KAAKC;CAAW;CACxC,IAAI,SAAS;EAAE,OAAO,KAAKC;CAAS;CACpC,IAAI,aAAa;EAAE,OAAO,KAAKT;CAAa;CAC5C,IAAI,YAAY;EAAE,OAAO,KAAKU;CAAgB;CAC9C,IAAI,aAAa;EAAE,OAAO,KAAKC;CAAiB;CAChD,IAAI,iBAAiB;EAAE,OAAO,KAAKC,GAAQ,MAAM,GAAG,UAAU;CAAG;CAEjE,IAAI,WAAW;EAAE,OAAO,KAAKtmB;CAAW;CAUxC,IAAI,eAAe;EACf,IAAMumB,IAAW,KAAK,aAAa,cAAc,MAAM,UAAU,KAAKttB,IAAO,aAAa,cAAc,MAAM,QACxGutB,IAAkB,KAAKF,GAAQ,OAAO,aAAa,cAAc,MAAM;EAC7E,OAAOC,KAAYC;CACvB;CAEA,IAAI,cAAc;EACd,OAAO,KAAKF,GAAQ;CACxB;CAEA,IAAI,SAAS;EACT,OAAO,KAAKA;CAChB;CAEA,IAAIG,KAAY;EACZ,OAAO,KAAKxtB,GAAM,aAAa,QAAQ,KAAK,KAAKA,GAAM,aAAa,OAAO,MAAM;CACrF;CAEA,YAAY,GAAS,MAAa;EAC9B,KAAK,WAAW,gBAAgBsR,GAAS,OAAOya,CAAQ;CAC5D;CAEA,sBAAsB;EAClB,AAAK,KAAKsB,GAAQ,UAElBna,EAAc,UAAU,KAAKma,GAAQ,KAAK,GAE1C;GAAC;GAAQ;GAAS;EAAM,CAAC,CAAC,SAAQ,MAAQ;GACtC;IAAC;IAAU;IAAQ;GAAQ,CAAC,CAAC,SAAQ,MAAW;IAC5C,IAAMtd,IAAY,KAAK,cAAc,aAAasb,EAAQ,iBAAiBvnB,GAAM;IACjF,AAAKiM,KACLA,EAAU,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAO/L,EAAI,OAAO,CAAC;GACnE,CAAC;EACL,CAAC,GAED,KAAKypB,GAAuB,GAE5B,KAAKC,GAAuB,GAE5B,KAAKjB,GAAY,WAAW,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,GAGzD,4BAA4B;GAExB,AADA,KAAKiB,GAAuB,GAC5B,KAAKjB,IAAa,QAAQ;EAC9B,CAAC;CACL;CAEA,gBAAgB;EAEZ,4BAA4B;GAExB,AAAK,KAAK,UAAU,SAAS,QAAQ,KAAM,KAAKY,GAAQ,UAExD,KAAKK,GAAuB,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,GAGzD,KAAKC,GAAe,GAEpB,KAAKb,IAAa,cAAc,GAEhC,KAAKL,IAAa,QAAQ;EAC9B,CAAC;CACL;CAEA,WAAuB;EACnB,IAAMmB,IAAS,KAAK,cAAc,0BAA0B,GACtDC,IAAW,KAAK,cAAc,iBAAiB;EACrD,EAAS,MAAM,MAAM,GAAGD,GAAQ,aAAa;CACjD;CAEA,IAAI,OAAO;EAIP,OAHI,CAAC,KAAK7K,MAAS,KAAK/iB,IAAO,SAC3B,KAAK+iB,KAAQ,IAAI2E,EAAU,IAAI,IAE5B,KAAK3E;CAChB;CAEA,mBAAmB;EAMf,AAJA,KAAK,KAAK,QAAQ,GAElB,KAAK0J,GAAY,QAAQ,EAAI,GAEzB,KAAK,gBACL,KAAK,QAAQ,EAAI;CAEzB;CAEA,WAAW,IAAS,OAAS;EACzB,4BAA4B;GACxB,KAAKqB,KAAWC,CAAM;EAC1B,CAAC;CACL;CAEA,MAAY,IAAS,OAAS;EAE1B,IAAMhe,IAAY,KAAK,cAAc,mCAAmC;EACxE,IAAI,CAACA,GAAW;EAEhB,IAAM4I,IAAgB,KAAK,cAAc,mCAAmC;EAC5E,IAAKA,GAEL;OAAIoV,GAAQ;IACR,KAAK,aAAa,gBAAgB,MAAM;IACxC,IAAM7D,IAAiBna,EAAU;IACjC,IAAIma,KAAkB,GAAG;IAEzB,IAAI8D,IAAqB,GACnBC,IAAU,CAAC;IAEjB,EAAc,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;KACjD,IAAMhV,IAAiB/E,EAAI,aAAa,UAAU;KAIlD,IAHmB,KAAK,cAAc,sBAAsB+E,EAAe,GAC9C,CAAC,EAAE,aAAa,WAAW,MAAM,QAG1D,EAAQ,QAAQ;MAAE;MAAgB,OAAO;MAAI,aAAa;KAAK,CAAC;UAC7D;MACH,IAAMha,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;MAErD,AADA+Z,EAAQ,KAAK;OAAE;OAAgB,OAAOhvB;OAAG,aAAa;MAAM,CAAC,GAC7D,KAAsBA;KAC1B;IACJ,CAAC;IAED,IAAMivB,IAAsBD,EACvB,QAAO,MAAKra,EAAE,WAAW,CAAC,CAC1B,QAAQ,GAAK,MAAMqW,IAAMrW,EAAE,OAAO,CAAC,GAElCua,IAAiB,KAAK,IAAI,GAAGjE,IAAiBgE,CAAmB;IAEvE,IAAIF,IAAqB,KAAKC,EAAQ,SAAS,GAAG;KAC9C,IAAIG,IAAiB,GAEfC,IAAiBJ,EAAQ,KAAI,MAAQ;MACvC,IAAI9tB,EAAK,aACL,OAAO;OAAE,gBAAgBA,EAAK;OAAgB,WAAW;OAAG,OAAO;MAAG;MAG1E,IAAMmuB,IAAcnuB,EAAK,QAAQguB,IAAkBH,GAC7CO,IAAY,KAAK,IAAI,IAAI,KAAK,MAAMD,CAAU,CAAC;MAErD,OADA,KAAkBC,GACX;OACH,gBAAgBpuB,EAAK;OACrB,WAAWmuB,IAAa,KAAK,MAAMA,CAAU;OAC7C,OAAOC;MACX;KACJ,CAAC,GAEGC,IAAkBL,IAAiBC,GAEjCK,IAAkBJ,EAAe,QAAO,MAAK,CAACJ,EAAQ,MAAK,MAAQ9tB,EAAK,mBAAmByT,EAAE,cAAc,CAAC,EAAE,WAAW;KAE/H,IAAI4a,IAAkB,KAAKC,EAAgB,SAAS,GAAG;MACnD,EAAgB,MAAM,GAAG,MAAMnsB,EAAE,YAAYC,EAAE,SAAS;MACxD,KAAK,IAAIQ,IAAI,GAAGA,IAAIyrB,GAAiB,KACjC,EAAgBzrB,IAAI0rB,EAAgB,OAAO,CAAC,SAAS;KAE7D,OAAO,IAAID,IAAkB,KAAKC,EAAgB,SAAS,GAAG;MAC1D,EAAgB,MAAM,GAAG,MAAMlsB,EAAE,YAAYD,EAAE,SAAS;MACxD,KAAK,IAAIS,IAAI,GAAGA,IAAI,KAAK,IAAIyrB,CAAe,GAAG,KAAK;OAChD,IAAMvwB,IAASwwB,EAAgB1rB,IAAI0rB,EAAgB;OACnD,AAAIxwB,EAAO,QAAQ,MAAI,IAAO;MAClC;KACJ;KAEA,EAAe,SAAS,EAAE,mBAAgB,eAAY;MAClD,KAAK6uB,IAAa,eAAe7T,GAAgBG,GAAO,MAAM;KAClE,CAAC;IACL;GACJ,OACI,KAAK,gBAAgB,cAAc;GAGvC,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ;EAHd;CAI3C;CAEA,oBAAoB,GAAQ,MAAU;EAElC,IAAMsV,KAAgB,MAAM;GAExB,IAAI,CAAC,mBAAmB,CAAC,CAAC,SAAS,KAAK1uB,GAAM,OAAO,GAAG;IACpD,IAAM2uB,IAAU,KAAK3uB,GAAM,QAAQ,2CAA2C;IAC9E,AAAI2uB,MACAxvB,IAAIwvB,EAAQ,UAAU,IAAI,QAAQ,IAAIA,EAAQ,UAAU,OAAO,QAAQ;GAE/E;EACJ;EA0BA,IAxBAD,EAAa,EAAI,GAEjB,KAAK7B,KAASpqB,GAEd,KAAK4qB,KAAU;GACX,OAAOna,EAAc,QAAQC,CAAM;GACnC,OAAO,EACH,IAAIA,EAAO,iBAAiB,UAAU,EAC1C;EACJ,GAEA,KAAK,cAAc,oBAAoB,CAAC,CAAC,YAAY,KAAKka,GAAQ,KAAK,GAEvE,KAAKT,GAAU,SAAS,KAAKA,GAAU,SAAS,GAChD,KAAKA,GAAU,UAAU,CAAC,GAC1B,KAAK,iBAAiB,kCAAkC,CAAC,CAAC,SAAS,MAAQ;GAEvE,AADA,KAAKA,GAAU,UAAU,KAAK,IAAIjhB,EAAI,gBAAgB,GAAG,EAAE,GAC3D,KAAKihB,GAAU,QAAQ,KAAKjhB,EAAI,gBAAgB,CAAC;EAIrD,CAAC,GACD,KAAKihB,GAAU,SAAS,KAAKA,GAAU,QAAQ,QAE3C,KAAKC,OAAW,GAAG;GACnB,IAAM+B,IAAU,SAAS,KAAK5uB,GAAM,aAAa,kBAAkB,GAAG,EAAE,GAClE4S,IAAU,SAAS,KAAK5S,GAAM,aAAa,kBAAkB,GAAG,EAAE,GAElEd,KAAK,KAAK,cAAc,oBAAoB,CAAC,EAAE,gBAAgB,MAChE,KAAK,cAAc,mBAAmB,CAAC,EAAE,gBAAgB,MACzD,KAAK,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC7C,KAAK,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC7C,KAAK,cAAc,YAAY,CAAC,EAAE,gBAAgB;GAUvD,AARI,KAAKc,GAAM,aAAa,aAAa,MAAM,UAAW,MAAM4uB,CAAO,KAAM,MAAMhc,CAAO,KACtF,KAAK5S,GAAM,aAAa,cAAc,MAAM,GAG3C,MAAM4uB,CAAO,MACd,KAAK5uB,GAAM,MAAM,YAAYd,IAAK,KAAK0tB,GAAU,SAASgC,IAAW,OAGpE,MAAMhc,CAAO,MACd,KAAK5S,GAAM,MAAM,YAAYd,IAAK,KAAK0tB,GAAU,SAASha,IAAW;EAE7E;EAQA,AANA,KAAK,iBAAkB,eAAgB,CAAC,CAAC,SAAS,MAAQ;GACtD,EAAI,MAAM,UAAU;EACxB,CAAC,GAED,KAAK,cAAc,0BAA0B,CAAC,CAAC,OAAO,GAEtD8b,EAAa,EAAK;CACtB;CAEA,iBAAiB;EAiCb,AA/BA,KAAKjB,GAAuB,GAE5B,KAAKC,GAAuB,GAE5B,KAAKmB,GAA4B,GAEjC,KAAKC,GAAmB,GAExB;GAAC;GAAQ;GAAQ;EAAO,CAAC,CAAC,SAAQ,MAAQ;GACtC,IAAMC,IAAS,iBAAiBjrB;GAChC,KAAKiD,GAAUjD,KAAQ;IACnB,OAAO,KAAK,cAAc,GAAGirB,EAAO,OAAO;IAC3C,OAAO;KACH,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;KAC/C,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;KAC/C,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;IACnD;IACA,OAAO,KAAK,cAAc,GAAGA,EAAO,OAAO;GAC/C;EACJ,CAAC,GAED,KAAKtC,GAAY,WAAW,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ,GAGxD,KAAKO,GAAU,WAAW,GAE1B,KAAK,SAAS;CAClB;CAGA,WAA+B;EAE3B,AAAI,KAAKhtB,GAAM,UAAU,SAAS,YAAY,KAE9C;GAAC;GAAQ;GAAS;EAAM,CAAC,CAAC,SAAQ,MAAQ;GACtC,IAAM2U,IAAa,KAAK,iBAAiB,iBAAiB7Q,GAAM;GAChE,IAAI6Q,EAAW,WAAW,GAAG;GAE7B,IAAMqa,IAAara,EAAW,EAAE,CAAC,cAAc,OAAO;GACtD,IAAI,CAACqa,GAAY;GAEjB,IAAI5V,IAAQ;GAMZ,AALA4V,EAAW,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;IAC9C,IAAM/vB,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE;IAChD,AAAK,MAAMjV,CAAC,MAAG,KAASA;GAC5B,CAAC,GAED0V,EAAW,SAAQ,MAAa;IAE5B,AADe5E,EAAU,iBAAiB,OAAO,GAC7CjM,MAAS,SACT,EAAU,MAAM,OAAO,OAEvB,EAAU,MAAM,OAAO,OAAOsV,EAAM,KACpC,EAAU,MAAM,QAAQ,GAAGA,EAAM,KACjC,EAAU,MAAM,WAAW,GAAGA,EAAM,KACpC,EAAU,MAAM,WAAW,GAAGA,EAAM;GAE5C,CAAC;EACL,CAAC;CACL;CAEA,WAA+B;EAO3B;GALI;IAAE,UAAU;IAAsB,MAAM;GAAO;GAC/C;IAAE,UAAU;IAAsB,MAAM;GAAK;GAC7C;IAAE,UAAU;IAAuB,MAAM;GAAQ;EAG9C,CAAC,CAAC,SAAS,EAAE,aAAU,cAAW;GACrC,KAAK,cAAc,kBAAkBpJ,GAAU,CAAC,CAAC,YAAY,KAAKif,GAAkBnrB,CAAI,CAAC;EAC7F,CAAC;CACL;CAEA,MAAqB,MAAoB;EAErC,IAAMymB,IAAO,KAAK8C,GAAQ,MAAM,UAAU,EAAI;EAgB9C,OAdIpb,MAAoB,SACpBsY,EAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAO;GAChD,AAAIxZ,EAAI,aAAa,OAAO,MAAM,UAAQA,EAAI,OAAO;EACzD,CAAC,IACMkB,MAAoB,UAC3BsY,EAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAO;GAChD,AAAIxZ,EAAI,aAAa,OAAO,MAAM,WAASA,EAAI,OAAO;EAC1D,CAAC,IAEDwZ,EAAK,iBAAiB,6BAA6B,CAAC,CAAC,SAAQ,MAAO;GAChE,EAAI,OAAO;EACf,CAAC,GAGEA;CACX;CAEA,qBACW,KAAKkC,GAAY,aAAa;CAGzC,uBAEuB,KAAK1lB,GAAU,QAAQ,gBAAgB,OAErC,KAAKA,GAAU,KAAK,OAAO,gBAAgB,MAC3D,KAAKA,GAAU,KAAK,OAAO,gBAAgB,MAC3C,KAAKA,GAAU,KAAK,MAAM,KAAK,gBAAgB;CAKxD,kBAAkB;EAEd,IAAM/B,IAAQ,KAAK,cAAc,gBAAgB,GAC3CkM,IAAQ,KAAK,cAAc,+BAA+B,GAE1Dge,IAAgB,KAAKnoB,GAAU,KAAK,OAAO,gBAAgB,GAE3DooB,IAAcnqB,EAAM,sBAAsB,CAAC,CAAC,QAC5CoqB,IAAcle,EAAM,sBAAsB,CAAC,CAAC;EAElD,OAAQie,IAAcD,KAAiBE;CAC3C;CAEA,aAAa,MAAe;EACxB,IAAMC,IAAgB,KAAK,cAAc,mCAAmC;EAC5E,AAAIA,MAAe,EAAc,aAAaC;CAClD;CAEA,aAAa,MAAc;EACvB,IAAM3hB,IAAe,KAAK,cAAc,gBAAgB;EACxD,AAAIA,MAAc,EAAa,YAAYO;CAC/C;CAEA,WAAc;EAkBV,AAhBA,KAAK1J,GAAQ,GAEb,KAAK2oB,KAAiB,IAAItZ,EAAc,IAAI,GAC5C,KAAKuZ,KAAkB,IAAI3W,EAAe,IAAI,GAC9C,KAAKqW,KAAc,IAAI1U,EAAW,IAAI,GACtC,KAAK6U,KAAY,IAAI7Q,EAAS,IAAI,GAClC,KAAK8Q,KAAU,IAAItL,EAAc,IAAI,GAErC,KAAKmB,KAAQ,IAAI2E,EAAU,IAAI,GAC/B,KAAKqF,KAAa,IAAInH,EAAU,IAAI,GACpC,KAAKoH,KAAY,IAAI3hB,EAAgB,IAAI,GAEpC,KAAKmiB,OACN,KAAK+B,KAAW,IAAI1I,EAAQ,IAAI,IAGpC,KAAK9f,GAAU,SAAS,iBAAiB,WAAW,MAAM;GAItD,AAHA,KAAK,iBAAiB,0CAA0C,CAAC,CAAC,SAAQ,MAAO;IAC9E,EAAI,UAAU,OAAO,QAAQ;GAChC,CAAC,GACD,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ;EACxD,CAAC;CACL;CAIA,WAAgB;EA6BZ,AA3BA,KAAK,aAAa,YAAY,GAAG,GAEjC,KAAK,YAAY,44BAyBjB,KAAKA,KAAY;GACb,UAAU,KAAK,cAAc,mCAAmC;GAChE,YAAY,KAAK,cAAc,uBAAuB;GACtD,YAAY,KAAK,cAAc,uBAAuB;GACtD,SAAS,KAAK,cAAc,uCAAuC;GACnE,cAAc,KAAK,cAAc,0CAA0C;EAC/E;CACJ;CAEA,WAAoC;EAEhC,IAAMuL,IAAY,KAAK,cAAc,0BAA0B,GACzDC,IAAY,KAAK,cAAc,0BAA0B,GACzDC,IAAa,KAAK,cAAc,2BAA2B,GAE3Dgd,IAAiB,MAAM,KAAKld,EAAU,iBAAiB,uCAAuC,CAAC,GAC/Fmd,IAAiB,MAAM,KAAKld,EAAU,iBAAiB,uCAAuC,CAAC,GAC/Fmd,IAAkB,MAAM,KAAKld,EAAW,iBAAiB,uCAAuC,CAAC;EAEvG,KAAKmd,GAAiBH,GAAgBC,GAAgBC,CAAe;EAErE,IAAME,IAAiB,MAAM,KAAKtd,EAAU,iBAAiB,UAAU,CAAC,GAClEud,IAAiB,MAAM,KAAKtd,EAAU,iBAAiB,UAAU,CAAC,GAClEud,IAAkB,MAAM,KAAKtd,EAAW,iBAAiB,UAAU,CAAC;EAE1E,KAAKmd,GAAiBC,GAAgBC,GAAgBC,CAAe;CACzE;CAEA,MAAoB,GAAU,GAAU,MAAc;EAElD,iBAAiB;GACb,IAAMld,IAAU,KAAK,IAAIH,EAAS,QAAQC,EAAS,QAAQC,EAAU,MAAM;GAE3E,KAAK,IAAI,IAAI,GAAG,IAAIC,GAAS,KAAK;IAE9B,IAAMC,IAAU;KACZJ,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/CC,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/CC,EAAU,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;IACpD,GACMG,IAAY,KAAK,IAAI,GAAGD,CAAO;IAErC,AAAIC,IAAY,MACRL,EAAS,OAAI,EAAS,EAAE,CAAC,MAAM,SAAS,GAAGK,EAAU,MACrDJ,EAAS,OAAI,EAAS,EAAE,CAAC,MAAM,SAAS,GAAGI,EAAU,MACrDH,EAAU,OAAI,EAAU,EAAE,CAAC,MAAM,SAAS,GAAGG,EAAU;GAEnE;EACJ,CAAC;CACL;CAEA,WAA2B;EACvB,IAAMnF,IAAe,KAAK,cAAc,gBAAgB;EACxD,IAAI,CAACA,GAAc;EAEnB,IAAIoiB,IAAiB;EAerB,AAbApiB,EAAa,iBAAiB,cAAc,MAAM;GAC9C,IAAM2C,IAAK5H,EAAE,OAAO,QAAQ,IAAI;GAChC,IAAI,CAAC4H,KAAM,CAACA,EAAG,QAAQ,OAAOA,EAAG,QAAQ,QAAQ,KAAK;GAEtD,IAAM3P,IAAW2P,EAAG,QAAQ;GAC5B,AAAIyf,MAAmBpvB,MACvB,IAAiBA,GAEjBgN,EAAa,iBAAiB,gBAAgBhN,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;IACvE,EAAI,UAAU,IAAI,OAAO;GAC7B,CAAC;EACL,CAAC,GAEDgN,EAAa,iBAAiB,aAAa,MAAM;GAC7C,IAAM2C,IAAK5H,EAAE,OAAO,QAAQ,IAAI;GAChC,IAAI,CAAC4H,GAAI;GAET,IAAM0f,IAAgBtnB,EAAE;GACxB,AAAI4H,EAAG,SAAS0f,CAAa,MAE7BriB,EAAa,iBAAiB,UAAU,CAAC,CAAC,SAAQ,MAAO;IACrD,EAAI,UAAU,OAAO,OAAO;GAChC,CAAC,GACD,IAAiB;EACrB,CAAC;CACL;CAEA,WAAwB;EAIpB,CAFc,KAAK+e,EAEhB,CAAC,CAAC,SAAQ,MAAO;GAQhB,iBAAA,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQuD,CAAG,GACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,EAAA,CAAE,SAAQ,MAAO;IAEhB,IAAI5iB,MAAQ,iBAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,GAAG;IAE1D,IAAMpP,IAASgyB,EAAI5iB;IAEnB,AAAI,OAAOpP,KAAW,aACb,KAAKoP,OAEN,KAAKA,MAAQ,GAAG6iB,MAASjyB,EAAO,MAAMgyB,GAAKC,CAAI,KAEzB,OAAOjyB,KAAW,YAArCA,MAEF,KAAKoP,OAEN,KAAKA,KAAOpP;GAGxB,CAAC;EACL,CAAC;CACL;CAEA,uBAAuB;EAGnB,AAFA,KAAK6uB,IAAa,QAAQ,GAC1B,KAAKG,IAAW,QAAQ,GACxB,KAAK,YAAY;CACrB;AACJ;AAEK,eAAe,IAAI,kBAAkB,KACtC,eAAe,OAAO,oBAAoBT,CAAc;;AChpB5D,IAAa2D,IAAb,MAA2B;CACvB;CAEA,YAAY,GAAO;EAEf,AADA,KAAKnwB,KAAQowB,GACb,KAAK/sB,GAAM;CACf;CAEA,WAAc;EAEV,AADA,KAAKmB,GAAQ,GACb,KAAK6rB,GAAW;CACpB;CAEA,IAAI,QAAQ,GAAK;EACb,AAAM9a,IACF,KAAKvV,GAAM,UAAU,IAAI,SAAS,IAElC,KAAKA,GAAM,UAAU,OAAO,SAAS;CAE7C;CAIA,WAAgB;EAGZ,IAAM+D,IADc,MAAM,KAAK,KAAK/D,GAAM,QACd,CAAC,CAAC,QAAO,MAAO7B,EAAG,QAAQ,YAAY,MAAM,OAAS,GAC5EmyB,IAAavsB,EAAU,QAEvBwsB,IAAaxsB,EAAU,KAAK,GAAK,MAAQ;GAC3C,IAAMysB,IAAY/vB,MAAQ,IAAI,WAAW,IACnCgwB,IAAUzsB,EAAI,MAAM,QAAQvD,IAAM;GAIxC,OAAO,4BAFsC+vB,EAAU,gBAAgB/vB,EAAI,mBAAmBgwB,EAAQ,QAAQA,EAAQ,0BAClGhwB,IAAM6vB,IAAa,IAAI,8CAA8C7vB,EAAI,sBAAsB;EAEvH,CAAC,CAAC,CAAC,KAAK,EAAE,GAEJiwB,IAAa,CACf,4FACJ;EA8CA,AA5CI,KAAK,iBAAiB,KAAK,aAAa,CAAC,WACzCA,EAAW,KAAK,YAAY,KAAK,aAAa,CAAC,QAAQ,GAAG,GAG9D,KAAK1wB,GAAM,WAAW,YAAY;;kBAExB0wB,EAAW,KAAK,IAAI,EAAE;kBACtB,KAAK1wB,GAAM,SAAS,MAAM,MAAM;;;;;;;;;;0BAUxBuwB,EAAW;;;;;;;WAS7BxsB,EAAU,SAAQ,MAAO;GACrB,EAAY,gBAAgB,KAAK/D,IAAO+Q,CAAG;EAC/C,CAAC,GAED,KAAK/Q,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,GAAQ,MAAQ;GAEhF,AADA2wB,EAAO,UAAU,IAAI,QAAQ,GAC7BA,EAAO,iBAAiB5sB,EAAUtD,IAAMA,CAAG;EAC/C,CAAC,GAED,KAAKT,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,MAAW;GAE3E,iBAAiB;IAEb,AADA2wB,EAAO,SAAS,GACZ,KAAKC,MAAe,KAAKC,GAAiB;GAClD,CAAC;EACL,CAAC,GAGD,iBAAiB;GACb,KAAK7wB,GAAM,KAAK,MAAM;EAC1B,CAAC;CACL;CAEA,WAAmB;EAMf,AAJA,KAAKA,GAAM,iBAAiBN,EAAW,MAAM,iBAAiB;GAC1D,AAAI,KAAKkxB,MAAe,KAAKC,GAAiB;EAClD,CAAC,GAED,KAAK7wB,GAAM,iBAAiBN,EAAW,MAAM,mBAAmB;GAC5D,AAAI,KAAKkxB,MAAe,KAAKC,GAAiB;EAClD,CAAC;EAED,IAAIC,IAAa;EAEjB,IAAI,gBAAgB,MAAY;GAC5B,KAAK,IAAI/d,KAASC,GACd,IAAID,EAAM,OAAO,YAAY,cAAc;IACvC,IAAMge,IAAgBhe,EAAM,YAAY;IAExC,AAAIge,MAAkBD,MAClB,IAAaC,GACT,KAAKH,MACL,KAAKC,GAAiB;GAGlC;EAER,CAAC,CAAC,CAAC,QAAQ,KAAK7wB,EAAK;CACzB;CAEA,WAAyB;EACrB,KAAKA,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,MAAW;GAC3E,IAAI2wB,EAAO,UAAU,GAAG;IACpB,IAAMjnB,KAAeinB,EAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC/DA,EAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC/CA,EAAO,cAAc,YAAY,CAAC,EAAE,gBAAgB,IACnDK,IAAc,KAAKhxB,GAAM,eAAe2wB,EAAO,eAAejnB,GAE9DxK,IAAI,KAAK,IAAIyxB,EAAO,SAAS,SAASA,EAAO,KAAK,MAAM,GAAG,OAAO,cAAc,EAAG;IAEzF,KAAK3wB,GAAM,MAAM,SAASgxB,IAAe9xB,IAAK;GAClD;EACJ,CAAC;CACL;CAEA,IAAI0xB,KAAgB;EAChB,OAAO,KAAK5wB,GAAM,aAAa,aAAa,MAAM;CACtD;AACJ,GC/IaixB,IAAb,MAAwB;CACpB;CACA;CACA,qBAAa,IAAI,IAAI;CAErB,YAAY,GAAM;EAEd,AADA,KAAKjxB,KAAQC,GACb,KAAKqD,KAAUrD,EAAK,OAAO,IAAI;CACnC;CAEA,YAAY,GAAM;EAId,OAFI,CAACkE,KAAQ,CAAC,KAAKb,GAAQ,SAAea,IAEnCA,EAAK,QAAQ,8BAA8B,GAAO,MAAc;GACnE,IAAM1D,IAAM,KAAK6C,GAAQ,QAAQG,CAAS;GAC1C,OAAOhD,KAAO,IAAI,aAAaA,EAAI,KAAKywB;EAC5C,CAAC;CACL;CAEA,WAAW,GAAM;EAEb,OADK/sB,KACE,KAAK,YAAYA,CAAI;CAChC;CAEA,SAAS,GAAM,GAAS,IAAM,GAAG;EAE7B,IAAIA,KAA+B,MAAM,OAAO;EAEhD,IAAI;GACA,IAAMgtB,IAAc,OAAOhtB,CAAI,CAAC,CAAC,KAAK,GAChCitB,IAAe,KAAK,YAAYD,CAAW;GAEjD,IAAIC,EAAa,SAAS,WAAW,KAAKA,EAAa,SAAS,OAAO,KAAKA,EAAa,SAAS,OAAO,KAAKA,EAAa,SAAS,WAAW,KAAKA,EAAa,SAAS,GAAG,GAAG;IAE5K,IAAIC,IAAS,KAAKC,GAAW,IAAIF,CAAY;IAc7C,OAZKC,MACD,IAAa,SAAS,WAAW,OAAO,QAAQ;;;;;iCAKnCD,EAAa;qBACzB,GAED,KAAKE,GAAW,IAAIF,GAAcC,CAAM,IAGrCA,EAAOE,GAASvvB,GAAK,KAAKhC,EAAK;GAC1C;GAEA,OAAOoxB;EACX,QAAY;GAKR,OAAOjtB;EACX;CACJ;AACJ,GC5DaqtB,IAAb,MAAqB;CAEjB;CAEA,YAAY,GAAM;EACd,KAAKxxB,KAAQC;CACjB;CAEA,WAAW;EAEP,OAAO,EACH,OAAO,GACX;EACA,MAAM,MAAgB;GAClB,IAAI,CAACwxB,KAAe,OAAOA,KAAgB,UAAU;GAErD,IAAM,EAAE,UAAO,GAAGC,MAAYD;GAM9B,AAJIvT,KAAS,OAAOA,KAAU,aAC1B,KAAK,SAAS,MAAM,QAAQA,IAG5B,OAAO,KAAKwT,CAAO,CAAC,CAAC,SAAS,KAC9B,iBAAiB;IAOb,AANA,OAAO,QAAQA,CAAO,CAAC,CAAC,SAAS,CAAC7tB,GAAM8tB,OAAQ;KAC5C,AAAI,OAAOA,KAAO,eACd,KAAK3xB,GAAM6D,KAAQ8tB;IAE3B,CAAC,GAED,KAAK3xB,GAAM,WAAW;GAC1B,CAAC;EAET;CACJ;AAEJ,GCvCa4xB,IAAb,MAA0B;CACtB;CAEA,YAAY,GAAM;EAMd,AALA,KAAK5xB,KAAQC,GAKb,CAFoB,OAAO,KAElB,CAAC,CAAC,SAAQ,MAAM;GACrB,KAAK4xB,KAAM,IAAI,MAAM,CAAC,GAAG,EACrB,MAAM,GAAQ,MAAS;IACnB,IAAMlB,IAAS,KAAKmB,GAAgB;IACpC,IAAI,CAACnB,KAAU,CAACA,EAAOkB,IAAK;IAE5B,IAAME,IAAepB,EAAOkB,EAAG,CAACG;IAKhC,OAHI,OAAOD,KAAiB,cAChB,GAAG7B,MAAS6B,EAAa,MAAMpB,EAAOkB,IAAK3B,CAAI,IAEpD6B;GACX,EACJ,CAAC;EACL,CAAC;CACL;CAEA,kBAAkB;EACd,OAAO,KAAK/xB,GAAM,OAAO,iBAAiB,yBAAyB;CACvE;CAEA,KAAkB;EACd,IAAMyB,IAAM,KAAK,gBAAgB;EACjC,OAAOA,EAAI,SAAS,IAAIA,EAAI,KAAK;CACrC;AACJ,GCzBqBwwB,IAArB,cAAuC,YAAY;CAC/C;CACA;CACA;CACA;CACA;CACA,KAAe;CAEf,cAAc;EAaV,AAZA,MAAM,GAEF,CAAC,YAAY,CAAC,CAAC,SAAS,KAAK,OAAO,KACpCzyB,EAAM,IAAI,sBAAA,OAAqC,GAGnD,KAAK0yB,KAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GACrD,KAAKC,KAAe,IAAInvB,EAAc,IAAI,GAE1C,KAAKovB,KAAW,IAAIZ,EAAQ,IAAI,GAChC,KAAKa,KAAY,IAAIT,EAAa,IAAI,GAEtC,KAAKjF,GAAgB;CAC1B;CAEC,oBAAoB;EAChB,iBAAiB;GAUb,AATA,KAAK2F,KAAe,KAAK,iBAAiB,OAAO,CAAC,EAAE,QAEpD,KAAK,SAAS,IAAIvxB,EAAO,IAAI,GAC7B,KAAK,aAAa,IAAIkwB,EAAW,IAAI,GAErC,KAAKsB,GAAoB,GAEzB,KAAKC,KAAiB,IAAIrC,EAAc,IAAI,GAE5C,KAAKsC,GAAc;EACvB,CAAC;CACL;CAEA,uBAAuB,CAEvB;CAEA,WAAsB;EAElB,IAAIC,IAAa,GAGXC,IAAa,kBAAkB;GACjC;GAEA,IAAM9tB,IAAS,KAAK,OAAO,iBAAiB,kBAAkB;GAM9D,IAJI6tB,KAAc,MACd,cAAcC,CAAU,GAGxB9tB,EAAO,UAAU,KAAKytB,IAAc;IACpC,IAAIM,IAAe;IAKnB,AAJA/tB,EAAO,SAAQ,MAAU;KACrB,AAAI8rB,EAAO,UAAQ;IACvB,CAAC,GAEGiC,KAAgB,KAAKN,OACrB,cAAcK,CAAU,GACxB,KAAK,SAAS,IACd,KAAK,cAAc,IAAI,YAAYjzB,EAAW,MAAM,MAAM;KAAE,SAAS;KAAM,QAAQ,EAAE,QAAQ,KAAK;IAAE,CAAC,CAAC;GAE9G;EACJ,GAAG,GAAG;CACV;CAGA,IAAI,SAAS;EAAE,OAAO,KAAKwyB;CAAa;CACxC,IAAI,cAAc;EAAE,OAAO,KAAKC;CAAc;CAC9C,IAAI,OAAO;EAAE,OAAO,KAAKA,GAAa;CAAM;CAO5C,QAAQ,GAAS;EAEb,AADA,KAAKA,GAAa,KAAK,IAAI9vB,CAAO,GAClC,KAAK,QAAQ;CACjB;CAEA,UAAU;EACN,KAAK,aAAa,WAAW;CACjC;CAGA,IAAI,QAAQ,GAAK;EACb,AAAI,KAAKmwB,OAAgB,KAAKA,GAAe,UAAUjd;CAC3D;CAEA,aAAa;EAET,KAAK,aAAa,iBAAiB,6BAA6B,CAAC,CAAC,SAAS,MAAU;GAKjF,MAJyB,KAAK7J,EAAM,QAAQ,CAAC,CAAC,MAAK,MACxCqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,cAAe,UAG7E,CAAC,EAAE,WAAW;EAC3B,CAAC;CACL;CAEA,SAAS,MAAc;EACnB,IAAI8hB,MAAc,QAAQA,IAAY,GAAG,OAAO,KAAK;EACrD,IAAMhuB,IAAS,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC;EAM1E,OAJI,OAAOguB,KAAc,WAAiBhuB,EAAOguB,MAAc,OAC3D,OAAOA,KAAc,WACd,KAAK,OAAO,cAAc,oBAAoBA,EAAU,oCAAoCA,EAAU,GAAG,KAAK,OAElHhuB,EAAO,MAAM;CACxB;CAEA,IAAI,SAAS;EACT,OAAO,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC;CACtE;CAEA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO,cAAc,yBAAyB,KAAK;CACnE;CAEA,KAAsB;EAClB,IAAMiuB,oBAAuB,IAAI,IAAI;EAerC,AAbA,KAAK,iBAAiB,eAAe,CAAC,CAAC,SAAQ,MAAM;GACjD,IAAM1xB,IAAajD,EAAG,aAAa,aAAa;GAChD,IAAI,CAACiD,GAAY;GAEjB,IAAM2xB,IAAU3xB,EAAW,SAAS,mCAAmC;GACvE,KAAK,IAAM8vB,KAAS6B,GAAS;IACzB,IAAMlvB,IAAOqtB,EAAM;IACnB,AAAIrtB,KAAQA,MAAS,UACjBivB,EAAqB,IAAIjvB,CAAI;GAErC;EACJ,CAAC,GAEDivB,EAAqB,SAAQ,MAAc;GACvC,IAAIE,IAAgB;GAEpB,OAAO,eAAe,MAAMC,GAAY;IACpC,MAAM,MAAa;KAGf,AAFA,IAAgBC,GAEhB,KAAK,WAAW;IACpB;IACA,WAAWF;IACX,cAAc;IACd,YAAY;GAChB,CAAC;EACL,CAAC;CACL;CAEA,WAAW,MAAO;EACd,iBAAiB;GAEb,AADA,KAAK,UAAU,IACf,iBAAiB;IACb,IAAI;KACA,EAAG,KAAK,IAAI;IAChB,UAAU;KACN,KAAK,UAAU;IACnB;GACJ,CAAC;EACL,CAAC;CACL;CAEA,KAAkB;EAId,CAFc,KAAKZ,IAAU,KAAKC,EAE/B,CAAC,CAAC,SAAQ,MAAO;GAQhB,iBAAA,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQpC,CAAG,GACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,EAAA,CAAE,SAAQ,MAAO;IAEhB,IAAI5iB,MAAQ,iBAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,GAAG;IAE1D,IAAMpP,IAASgyB,EAAI5iB;IAEnB,AAAI,OAAOpP,KAAW,aACb,KAAKoP,OAEN,KAAKA,MAAQ,GAAG6iB,MAASjyB,EAAO,MAAMgyB,GAAKC,CAAI,KAEzB,OAAOjyB,KAAW,YAArCA,MACF,KAAKoP,OAEN,KAAKA,KAAOpP;GAGxB,CAAC;EACL,CAAC;CACL;AACJ;AAEK,eAAe,IAAI,YAAY,KAChC,eAAe,OAAO,cAAcg0B,CAAS,GAG5C,eAAe,IAAI,mBAAmB,KACvC,eAAe,OAAO,qBAAqB,cAAcA,EAAU;CAC/D,oBAAoB;EAGhB,AAFA,KAAK,aAAa,SAAS,QAAQ,GAEnC,MAAM,kBAAkB;CAC5B;AACJ,CAAC;;ACjOL,IAAakB,IAAb,cAAsC,YAAY;CAEjD,cAAc;EACb,MAAM;CACP;CAEA,iBAAiB,CACjB;CAEA,oBAAoB,CACpB;AACD,GCRMC,oBAAY,IAAI,IAAI,GAEbC,IAAb,cAAiCF,EAAiB;CACjD;CACA;CACA;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,IAAIG,KAAkB;EACrB,OAAO,KAAKC,GAAM,aAAa,kBAAkB,MAAM;CACxD;CAEA,IAAI,OAAO;EAAE,OAAO,KAAKvzB;CAAO;CAChC,IAAI,QAAQ;EAAE,OAAO,KAAKgJ;CAAQ;CAClC,IAAI,OAAO;EAAE,OAAO,KAAKuqB;CAAO;CAChC,IAAI,KAAK;EAAE,OAAO,KAAKC;CAAK;CAC5B,IAAI,OAAO;EAAE,OAAO,KAAKC;CAAO;CAEhC,oBAAoB;EAWnB,AAVA,MAAM,kBAAkB,GAExB,KAAKzzB,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAKuzB,KAAQ,KAAK,QAAQ,OAAO,GACjC,KAAKC,KAAM,KAAKD,GAAM,QAAQ,IAAI,GAClC,KAAKvqB,KAAS,KAAKwqB,GAAI,QAAQ,kBAAkB,GAEjD,KAAKD,GAAM,UAAU,IAAI,KAAK,OAAO,GAErC,KAAKE,KAAQ,CAAC;EACd,KAAK,IAAI1wB,IAAI,GAAGA,IAAI,KAAKwwB,GAAM,WAAW,QAAQ,KAAK;GACtD,IAAM1vB,IAAO,KAAK0vB,GAAM,WAAWxwB,EAAE,CAAC;GACtC,AAAK;IAAC;IAAa;IAAQ;IAAY;IAAY;IAAY;IAAW;GAAU,CAAC,CAAC,SAASc,CAAI,MAClG,KAAK4vB,GAAM5vB,KAAQ,KAAK0vB,GAAM,WAAWxwB,EAAE,CAAC;EAG9C;EAEA,IAAI,CAAC,KAAKwwB,IAAO;EAGjB,IAAM9d,IAAO,KAAK,cAAc;EAGhC,EAAK,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAU;GACnE,EAAO,iBAAiB,eAAe;IACtC,IAAIkc,IAAK,KAAK,aAAa,eAAe,KAAK,KAAK,aAAa,eAAe,KAAK,KAAK4B,IAAO,aAAa,eAAe,KAAK,KAAKA,IAAO,aAAa,eAAe,GAEpK7yB,IAAU,KAAK,MACfgzB,IAAS,SAAS,KAAKH,GAAM,QAAQ,KAAK,EAAE;IAElD,IAAI5B,KAAM,KAAK3xB,IAAO;KACrB,IAAK2xB,EAAG,QAAQ,MAAM,EAAE;KAExB,IAAMsB,IADQtB,EAAG,MAAM,aACA,CAAC,GAAG,MAAMA;KAEjC,AAAI,OAAO,KAAK3xB,GAAMizB,MAAgB,aACrC,KAAKjzB,GAAMizB,EAAW,CAAC,KAAK,KAAKjzB,IAAOU,GAASgzB,GAAQ,KAAKH,EAAK,IACzD,OAAO,KAAKvzB,GAAM,gBAAiB,cAC7C,KAAKA,GAAM,aAAa2xB,CAAE,CAAC,CAAC,KAAK,MAAMjxB,GAASgzB,CAAM;IAExD;GAOD,CAAC;EACF,CAAC;EAGD,IAAMC,IAAWle,EAAK,cAAc,WAAW;EAC/C,AAAIke,KAAY,KAAK,aAAa,MAAM,MAAM,WAC7CA,EAAS,UAAU,IAAI,MAAM,GAE7BA,EAAS,iBAAiB,eAAe;GACxC,IAAIhC,IAAK,KAAK,aAAa,aAAa,KAAK,KAAK,aAAa,aAAa,GAEtEjxB,IAAU,KAAK,MACfgzB,IAAS,SAAS,KAAKH,GAAM,QAAQ,KAAK,EAAE;GAElD,IAAI5B,KAAM,KAAK3xB,IAAO;IACrB,IAAK2xB,EAAG,QAAQ,MAAM,EAAE;IAExB,IAAMsB,IADQtB,EAAG,MAAM,aACA,CAAC,GAAG,MAAMA;IAEjC,AAAI,OAAO,KAAK3xB,GAAMizB,MAAgB,aACrC,KAAKjzB,GAAMizB,EAAW,CAAC,KAAK,KAAKjzB,IAAOU,GAASgzB,GAAQ,KAAKH,EAAK,IACzD,OAAO,KAAKvzB,GAAM,gBAAiB,cAC7C,KAAKA,GAAM,aAAa2xB,CAAE,CAAC,CAAC,KAAK,MAAMjxB,GAASgzB,CAAM;GAExD;GAEA,KAAK1zB,IAAO,cAAc,IAAI,YAAY,SAAS,MAAM,YAAY;IACpE,QAAQ;KAAE,QAAQ,KAAKuzB;KAAO,MAAM7yB;KAAS,QAAQgzB;IAAO;IAC5D,SAAS;IACT,UAAU;GACX,CAAC,CAAC;EACH,CAAC;CAEH;CAEA,IAAI,OAAO;EACV,IAAME,IAAY,KAAKJ,IAAK;EAC5B,IAAI,CAACI,GAAW,OAAO;EACvB,IAAI,CAACA,EAAU,GAAG,OAAOA;EAEzB,IAAM3zB,IAAO,KAAKD;EAElB,OAAO,IAAI,MAAM4zB,GAAW,EAC3B,IAAI,GAAQ,GAAM;GACjB,IAAI5B,MAAS,QAAQ,OAAO/zB,EAAO;GACnC,IAAI+zB,MAAS,KAAK,OAAO/zB,EAAO;GAEhC,IAAMwC,IAAMR,GAAM,QAAQ,UAAU+xB,CAAI,KAAK;GAC7C,OAAOvxB,KAAO,IAAIxC,EAAO,EAAEwC,KAAOxC,EAAO+zB;EAC1C,EACD,CAAC;CACF;CAEA,IAAI,QAAQ;EACX,IAAI,CAAC,KAAKuB,MAAS,CAAC,KAAKC,IAAK,MAAM,OAAO;EAE3C,IAAM3P,IAAU,KAAK0P,GAAM,SAAS;EACpC,IAAI,CAAC1P,GAAS,OAAO;EAErB,IAAM+P,IAAY,KAAKJ,GAAI;EAE3B,IAAII,EAAU,KAAK,MAAM,QAAQA,EAAU,CAAC,GAAG;GAC9C,IAAM9a,IAAS,KAAK9Y,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQ6jB,CAAO,KAAK;GAC3D,OAAO/K,KAAU,IAAK8a,EAAU,EAAE9a,MAAW,KAAM;EACpD;EAEA,OAAO8a,EAAU/P,MAAY;CAC9B;CAEA,IAAI,MAAM,GAAG;EACZ,IAAI,CAAC,KAAK0P,MAAS,CAAC,KAAKvzB,IAAO,MAAM;EAEtC,IAAMgC,IAAM,SAAS,KAAKwxB,GAAI,QAAQ,KAAK,EAAE,GACvC3P,IAAU,KAAK0P,GAAM,QAAQ;EACnC,AAAI,OAAMvxB,CAAG,KAAM6hB,KAGnB,KAAK7jB,GAAM,KAAK,SAASgC,GAAK6hB,GAAS1kB,GAAG,KAAKm0B,EAAe;CAC/D;CAEA,IAAI,MAAM;EACT,OAAO,SAAS,KAAKC,IAAO,SAAS,KAAK,EAAE;CAC7C;CACA,IAAI,QAAQ;EACX,OAAO,SAAS,KAAKA,IAAO,SAAS,OAAO,EAAE;CAC/C;CAEA,UAAU;EACT,OAAO,MAAKA,GAAM,UAAU,SAAS,SAAS;CAC/C;CAEA,YAAY;EACX,OAAO,CAAC,KAAK,QAAQ;CACtB;CAEA,kBAAkB,IAAe,OAAO;EAMvC,IAJI,CAAC,KAAKA,MAAS,CAAC,KAAKA,GAAM,QAAQ,OAAO,KAI1C,CAFc,KAAKC,GAAI,MAEX,OAAOK;EAEvB,IAAM1vB,IAAO,KAAKovB,GAAM,QAAQ,MAC1B1P,IAAU,KAAK0P,GAAM,QAAQ,MAC7BvxB,IAAM,SAAS,KAAKuxB,GAAM,QAAQ,KAAK,EAAE;EAE/C,IAAIpvB,GACH,IAAI;GAKF,OAJG,KAAKqvB,GAAI,aAAa,UAAU,MAAM,SAElC,KAAK,kBAAkBrvB,GAAM,KAAKqvB,GAAI,MAAMxxB,GAAK,KAAKuxB,EAAK,IAE3D,KAAKvzB,GAAM,WAAW,SAASmE,GAAM,KAAKqvB,GAAI,MAAMxxB,CAAG;EAEhE,QAAY;GACX,OAAO6xB;EACR;EAQD,OALIhQ,IACS,KAAK,SACgCgQ,IAG3CA;CACR;CAIA,UAAU;EAET,IAAI,CAAC,KAAKN,MAAS,CAAC,KAAKC,IAAK;EAE9B,IAAMje,IAAM,KAAK;EAgCjB,OA9BA,KAAKge,GAAM,UAAU,OAAO,SAAS,GAErC;GAAC;GAAQ;GAAa;GAAmB;GAAU;GAAS;EAAW,CAAC,CAAC,SAAQ,MAAK;GAErF,IAAMpvB,IAAO,KAAKsvB,GAAMt0B;GACxB,IAAIgF,GAAM;IACT,IAAMrB,IAAS,KAAK9C,GAAM,WAAW,SAASmE,GAAM,KAAKqvB,GAAI,MAAM,SAAS,KAAKD,GAAM,QAAQ,KAAK,EAAE,CAAC;IAEvG,AAAIp0B,MAAM,cACJ2D,KACJ,KAAKywB,GAAM,UAAU,IAAI,SAAS,IAEzBp0B,MAAM,YAChB,KAAK,MAAM20B,UAAahxB,IAAS,KAAK,SAC5B3D,MAAM,YAChB,KAAK,iBAAiB,iCAAiC,CAAC,CAAC,SAAQ,MAAO;KACvE,EAAI,WAAW,CAAC2D;IACjB,CAAC,GAEKA,IACL,KAAKywB,GAAM,gBAAgB,UAAU,IAErC,KAAKA,GAAM,aAAa,YAAY,MAAM,KAG3C,KAAKA,GAAM,MAAMp0B,KAAK2D;GAExB;EACD,CAAC,GAEMyS;CACR;CAEA,aAAa,GAAM,GAAM,GAAK;EAG7B,OAFI,CAAC,KAAKvV,MAAS,CAAC,KAAKA,GAAM,cAAcmE,KAA+B,QAAQA,MAAS,KAAWA,IAEjG,KAAKnE,GAAM,WAAW,SAASmE,GAAM4vB,GAAM/xB,CAAG;CACtD;CAEA,qBAAqB,GAAM,GAAa,GAAK,MAAS;EACrD,IAAI,CAACmC,GAAM,OAAO;EAElB,IAAI;GACH,IAAM,SAASnC,GAAK,EAAE;GACtB,IAAMgyB,IAAY7vB,EAAK,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK;GAE9C,IAAI,KAAKnE,MAAS,OAAO,KAAKA,GAAMg0B,MAAe,YAClD,OAAO,KAAKh0B,GAAMg0B,EAAU,CAAC,KAAK,MAAM/mB,GAAajL,GAAK+S,CAAI;GAG/D,IAAMmc,IAAQ8C,EAAU,MAAM,8BAA8B;GAC5D,IAAI9C,GAAO;IACV,IAAMvgB,IAAU1D,EAAY,UAAU,WAChC2D,IAAa,KAAK5Q,IAAO,MAAM,WAAW,KAAKA,GAAM,KAAK,SAAS,IAAI,CAAC,GACxEi0B,IAAetjB,IAAUA,EAAQ,KAAI,MAAOC,EAAWnQ,EAAI,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,GAEhF,GAAGyzB,GAAUC,KAASjD,GACtBjxB,IAAO,KAAKD;IAElB,QAAQk0B,EAAS,YAAY,GAA7B;KACC,KAAK,SACJ,OAAOD,EAAa;KAErB,KAAK,OAAO;MACX,IAAMnb,IAAS7Y,GAAM,QAAQ,UAAUk0B,CAAK,KAAK;MACjD,OAAOF,EAAa,QAAQ,GAAK,MAAW;OAC3C,IAAM1e,IAAMuD,KAAU,IAAIlX,EAAO,IAAIkX,KAAUlX,EAAOuyB;OACtD,OAAOC,KAAO,OAAO7e,CAAG,KAAK;MAC9B,GAAG,CAAC;KACL;KAEA,KAAK,OAAO;MACX,IAAI0e,EAAa,WAAW,GAAG,OAAO;MACtC,IAAMnb,IAAS7Y,GAAM,QAAQ,UAAUk0B,CAAK,KAAK;MAKjD,OAJYF,EAAa,QAAQ,GAAK,MAAW;OAChD,IAAM1e,IAAMuD,KAAU,IAAIlX,EAAO,IAAIkX,KAAUlX,EAAOuyB;OACtD,OAAOC,KAAO,OAAO7e,CAAG,KAAK;MAC9B,GAAG,CACM,IAAI0e,EAAa;KAC3B;IACD;GACD;GAGA,IAAI,KAAKj0B,MAAS,OAAO,KAAKA,GAAM,gBAAiB,YACpD,OAAO,KAAKA,GAAM,aAAamE,CAAI,CAAC,CAAC,KAAK,MAAM8I,GAAajL,GAAK,KAAKhC,GAAM,IAAI;GAGlF,IAAImE,EAAK,SAAS,OAAO,KAAKA,EAAK,SAAS,cAAc,KAAKA,EAAK,SAAS,aAAa,GAAG;IAC5F,IAAIktB,IAAS+B,EAAU,IAAI,SAASjvB,CAAI;IA6BxC,OA5BKktB,MACJ,IAAa,SAAS,eAAe,OAAO,QAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;4BAuBrCltB,EAAK;iBAChB,GACZivB,EAAU,IAAI,SAASjvB,GAAMktB,CAAM,IAE7BA,EAAOpkB,GAAajL,GAAK+S,GAAM,KAAK/U,EAAK;GACjD;GAEA,OAAOmE;EACR,SAASuE,GAAG;GAEX,OADA,QAAQ,MAAM,gCAAgCvE,GAAMuE,CAAC,GAC9CvE;EACR;CACD;AACD,GAEakwB,IAAb,cAAyChB,EAAY;CAEpD,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAChC,IAAI,QAAQ;EAAE,OAAO,MAAM;CAAO;CAClC,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAChC,IAAI,KAAK;EAAE,OAAO,MAAM;CAAI;CAC5B,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAEhC,aAAa,GAAM,GAAM,GAAK;EAC7B,OAAO,MAAM,aAAalvB,GAAM4vB,GAAM/xB,CAAG;CAC1C;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EACnB,MAAM,kBAAkB;CACzB;CAEA,UAAU;EACT,OAAO,MAAM,QAAQ;CACtB;CAEA,gBAAgB,GAAM,GAAM,GAAK,MACzB,MAAM,aAAamC,GAAM4vB,GAAM/xB,GAAK+S,CAAI;CAGhD,gBACQ,MAAM,QAAQ;CAGtB,kBACQ,MAAM,UAAU;AAEzB,GCrXMuf,IAAN,cAA4BD,EAC5B;CACC;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAQnB,AANA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKlE,GAAW;CACjB;CAEA,gBAAgB;EACf,IAAMlxB,IAAI,MAAM,QAAQ;EACxB,KAAKo1B,GAAQ,QAAQp1B;CACtB;CAEA,WAAmB;EAalB,AAZA,KAAKo1B,GAAQ,iBAAiB,UAAS,MAAK;GAC3C,IAAI,KAAKC,IAAU;IAClB,IAAMC,IAAa,OAAO,KAAKD,EAAQ;IAGvC,AAFqB,KAAK,cAAc,EAAE,OAAO,KAElC,IAAIC,MAClB,EAAE,OAAO,QAAQ,KAAK,IAAI,EAAE,OAAO,OAAOA,CAAU,GACpD,KAAK,QAAQ,EAAE,OAAO;GAExB;EACD,CAAC,GAED,KAAKF,GAAQ,iBAAiB,WAAW,MAAU;GAElD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,WAAkB;EAEjB,KAAK,YAAY;CAGlB;CAEA,IAAIF,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK,KAAK,KAAK,aAAa,UAAU;CAC9E;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAcF,CAAa;;ACxDlD,IAAMK,IAAN,cAA8BN,EAC9B;CACC;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAQnB,AANA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKlE,GAAW;CAGjB;CAEA,WAAkB;EACjB,KAAK,YAAY;CAGlB;CAEA,WAAmB;EAQlB,AAPA,KAAKkE,GAAQ,iBAAiB,WAAW,KAAKK,EAAU,GAExD,KAAKL,GAAQ,iBAAiB,UAAU,MAAU;GAEjD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC,GAED,KAAKH,GAAQ,iBAAiB,WAAW,MAAU;GAElD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,gBAAgB;EACf,IAAMv1B,IAAI,MAAM,QAAQ;EAIxB,AAFA,KAAKo1B,GAAQ,QAAQp1B,GAEjB,KAAK,QAAQ,KAChB,KAAK01B,GAAU;CAEjB;CAEA,WAAkB;EAEjB,IAAM11B,IAAI,KAAKo1B,GAAQ;EAEvB,IAAIp1B,MAAM,MAAMA,KAAM,MAAyB;GAC9C,IAAM0qB,IAAM,OAAO1qB,CAAC;GAEpB,IAAI,MAAM0qB,CAAG,KAAM,KAAKiL,MAAQjL,IAAM,OAAO,KAAKiL,EAAI,KAAO,KAAKC,MAAQlL,IAAM,OAAO,KAAKkL,EAAI,GAC/F,KAAK,KAAK,UAAU,IAAI,SAAS;QAE7B,IAAI,KAAKC,IAAQ;IACrB,IAAMC,IAAM,OAAO91B,CAAC,GACdsB,IAAMw0B,EAAI,QAAQ,GAAG;IAC3B,AAAIx0B,KAAO,KAAKw0B,EAAI,UAAUx0B,IAAM,CAAC,CAAC,CAAC,SAAS,OAAO,KAAKu0B,EAAM,KACjE,KAAK,KAAK,UAAU,IAAI,SAAS;GAEnC;EACD;CACD;CAEA,MAAa,MAAK;EAEjB,IAAI;GAAC;GAAU;GAAS;GAAO;GAAQ;GAAO;GAAa;GAAc;GAAU;GAAY;GAAa;EAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG;EAExI,IAAM/2B,IAAS,EAAE,QACX4C,IAAQ5C,EAAO,OACfi3B,IAAiBj3B,EAAO,gBACxBoP,IAAM,EAAE;EAEd,IAAIA,MAAQ,QACPxM,EAAM,SAAS,GAAG,KAAKq0B,MAAmB,IAAG;GAChD,EAAE,eAAe;GACjB;EACD;EAGD,IAAI7nB,MAAQ,KAAK;GAChB,IAAM8nB,IAAQ,OAAO,KAAKH,EAAM;GAEhC,IAAI,MAAMG,CAAK,KAAKA,KAAS,KAAKt0B,EAAM,SAAS,GAAG,GAAG;IACtD,EAAE,eAAe;IACjB;GACD;EACD;EAEA,IAAIu0B,IAAW,CAAC;EAEhB,AADI,KAAKJ,MAAU,OAAO,KAAKA,EAAM,IAAI,KAAGI,EAAS,KAAK,GAAG,IACzD,KAAKL,MAAQ,OAAO,KAAKA,EAAI,IAAI,MAAGK,EAAS,KAAK,GAAG;EAEzD,IAAMC,IAAY,EAAE,WAAW,MAAM,EAAE,WAAW,MAAQ,EAAE,WAAW,MAAM,EAAE,WAAW;EAE1F,IAAI,CAACA,KAAY,CAACD,EAAS,SAAS,EAAE,GAAG,GACxC,EAAE,eAAe;OAIlB;OAAI,KAAKJ,MAAUK,KAAY,EAAE,OAAO,kBAAkB,EAAE,OAAO,cAAc;IAChF,IAAMvwB,IAAI,EAAE,OAAO,OACbrE,IAAMqE,EAAE,QAAQ,GAAG;IACzB,AAAIrE,KAAO,KAAK,EAAE,OAAO,iBAAiBA,KACrBqE,EAAE,OAAOrE,IAAM,CACrB,CAAC,CAAC,UAAU,OAAO,KAAKu0B,EAAM,KAC3C,EAAE,eAAe;GAGpB;GAEA,AAAI,KAAKR,MAAY,KAAK,cAAc,EAAE,OAAO,KAAK,KAAK,OAAO,KAAKA,EAAQ,KAAK,EAAE,OAAO,kBAAkB,EAAE,OAAO,gBACvH,EAAE,eAAe;EAHlB;CAKD;CAEA,IAAIO,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;CACzC;CAEA,IAAID,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;CACzC;CAEA,IAAIE,KAAS;EACZ,OAAO,KAAK,KAAK,aAAa,OAAO,KAAK;CAC3C;CAEA,IAAIR,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK,KAAK,KAAK,aAAa,UAAU;CAC9E;AACD;AAEK,eAAe,IAAI,mBAAmB,KAC1C,eAAe,OAAO,qBAAqBG,CAAe;;AC7I3D,IAAMW,IAAN,cAA6BjB,EAC7B;CACC;CACA;CACA;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAWnB,AATA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,mBAAmB,GACrD,KAAKgB,KAAO,KAAK,cAAc,QAAQ,GAIvC,KAAKlF,GAAW;CACjB;CAEA,WAAmB;EAalB,AAZA,KAAKkF,GAAK,iBAAiB,eAAe;GACzC,KAAKhB,GAAQ,MAAM;EACpB,CAAC,GAED,KAAKA,GAAQ,iBAAiB,UAAU,MAAU;GACjD,IAAMhf,IAAMmf,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQnf,GACb,KAAKsf,GAAUtf,CAAG,GAElB,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC,GAED,KAAKgf,GAAQ,iBAAiB,WAAW,MAAU;GAClD,IAAMhf,IAAMmf,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQnf,GACb,KAAKsf,GAAUtf,CAAG,GAElB,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,WAAkB;EACjB,KAAK,YAAY;CAIlB;CAEA,mBAAmB;EAClB,KAAK,QAAQ;CACd;CAEA,WAAuB;EAEtB,IAAMnU,IAAa,KAAK,KAAK,aAAa,aAAa;EACvD,IAAKA,MAEL,KAAKo0B,KAAc,MAAM,aAAap0B,GAAY,KAAK,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,GAEnF,KAAK,cAAc,UAAU,CAAC,EAAE,OAAO,GAEnC,KAAKo0B,MAAe,MAAM,QAAQ,KAAKA,EAAW,IAAG;GACxD,IAAMC,IAAa,cAAc,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,KAEjEC,IAAW,SAAS,cAAc,UAAU;GAClD,EAAS,KAAKD;GAEd,IAAMrjB,IAAW,SAAS,uBAAuB;GAajD,AAXA,KAAKojB,GAAY,SAAQ,MAAK;IAC7B,IAAIr2B,EAAE,OAAO;KACZ,IAAMw2B,IAAS,SAAS,cAAc,QAAQ;KAE9C,AADA,EAAO,QAAQx2B,EAAE,OACjBiT,EAAS,YAAYujB,CAAM;IAC5B;GACD,CAAC,GAEDD,EAAS,YAAYtjB,CAAQ,GAC7B,KAAK,YAAYsjB,CAAQ,GAEzB,KAAKnB,GAAQ,aAAa,QAAQkB,CAAU;EAC7C;CACD;CAEA,gBAAgB;EACf,IAAI,CAAC,KAAK,GAAG,MAAM;EAEnB,IAAMt2B,IAAI,MAAM,QAAQ;EAMxB,AAJA,KAAKy2B,GAAe,GAEpB,KAAKrB,GAAQ,QAAQp1B,KAAyB,QAAQA,MAAM,KAAKA,IAAI,WAEjE,KAAK,QAAQ,KAChB,KAAK01B,GAAU;CAEjB;CAEA,WAAkB;EAEjB,IAAM11B,IAAI,KAAKo1B,GAAQ;EAEvB,AAAIp1B,MAAM,MAAMA,KAAM,SAChB,KAAK02B,GAAc12B,CAAC,IAGhB,KAAKq2B,MAAe,MAAM,QAAQ,KAAKA,EAAW,KAAK,KAAKA,GAAY,SAAS,MAC1E,KAAKA,GAAY,MAAK,OACnBr1B,EAAK,UAAU,KAAA,IAA0BA,EAAK,SAAS,KAAA,IAAwB,KAAZA,EAAK,OAA7CA,EAAK,MAA+C,CAChF,YAAY,MAAMhB,EAAE,YAAY,CAGvC,KACT,KAAK,KAAK,UAAU,IAAI,SAAS,KATlC,KAAK,KAAK,UAAU,IAAI,SAAS;CAapC;CAEA,MAAiB,MAAM;EACtB,IAAI,OAAOA,KAAM,YAAYA,EAAE,UAAU,KAAK,CAACA,EAAE,WAAW,GAAG,GAAG,OAAO;EAEzE,IAAIqO,IAAI,SAASrO,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAC/B22B,IAAI,SAAS32B,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAC/BmD,IAAI,SAASnD,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE;EAKnC,OAFA,EADI,MAAMqO,CAAC,KAAK,MAAMsoB,CAAC,KAAK,MAAMxzB,CAAC,KAC/BkL,IAAI,KAAKA,IAAI,OAAOsoB,IAAI,KAAKA,IAAI,OAAOxzB,IAAI,KAAKA,IAAI;CAG1D;AACD;AAEK,eAAe,IAAI,kBAAkB,KACzC,eAAe,OAAO,oBAAoBgzB,CAAc;;AC3IzD,IAAMS,IAAN,cAA4B1B,EAC5B;CACC;CACA;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAgBnB,AAfA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKA,GAAQ,iBAAiB,UAAU,MAAU;GACjD,IAAMhf,IAAMmf,EAAM,OAAO;GAKzB,AAJA,KAAK,QAAQnf,GACb,KAAKgf,GAAQ,UAAU,OAAO,aAAa,CAAC,CAAChf,CAAG,GAChD,KAAKsf,GAAUtf,CAAG,GAElB,MAAM,MAAM,WAAW,QAAQ,EAAI;EACpC,CAAC,GAED,KAAKgf,GAAQ,iBAAiB,WAAW,MAAU;GAClD,IAAMhf,IAAMmf,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQnf,GACb,KAAKsf,GAAUtf,CAAG,GAElB,MAAM,MAAM,WAAW,QAAQ,EAAI;EACpC,CAAC;CACF;CAEA,WAAkB;EAGjB,IADA,KAAKygB,KAAQ,KAAK,KAAK,aAAa,WAAW,KAAK,QAChD,CAAC;GAAC;GAAO;GAAiB;GAAO;GAAO;EAAO,CAAC,CAAC,SAAS,KAAKA,EAAK,GACvE,MAAM,kBAAkB,KAAKA;EAG9B,IAAI9xB,IAAO,CAAC;EACZ,KAAK,IAAInB,IAAI,GAAGA,IAAI,KAAK,KAAK,WAAW,QAAQ,KAChD,AAAI;GAAC;GAAS;GAAO;GAAO;EAAM,CAAC,CAAC,SAAS,KAAK,KAAK,WAAWA,EAAE,CAAC,IAAI,KACxEmB,EAAK,KAAK,GAAG,KAAK,KAAK,WAAWnB,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,WAAWA,EAAE,CAAC,MAAM,EAAE;EAIhF,KAAK,YAAY;;qBAEE,KAAKizB,GAAM;iCACC,KAAK,KAAK,aAAa,aAAa,KAAK,SAAS;eACpE9xB,EAAK,KAAK,GAAG,EAAE;;;;CAI7B;CAEA,gBAAgB;EAEf,IAAM/E,IAAI,MAAM,QAAQ,GAEpB82B,IAAe92B;EACnB,IAAI82B,GAEH,QAAQ,KAAKD,IAAb;GACC,KAAK;IACJ,IAAeC,EAAa,OAAO,GAAG,EAAE;IACxC;GACD,KAAK;IACJ,IAAeA,EAAa,OAAO,GAAG,EAAE;IACxC;GACD,KAAK;IACJ,IAAIC,IAAI,IAAI,KAAK/2B,CAAC;IAClB,AAAI+2B,KAAK,kBAAkB,CAAC,MAAMA,CAAC,MAClC,KAAgB,OAAOA,EAAE,SAAS,EAAA,CAAG,MAAM,EAAE,IAAI,OAAO,OAAOA,EAAE,WAAW,EAAA,CAAG,MAAM,EAAE;IAExF;GACD,KAAK;IACJ,IAAIA,IAAI,IAAI,KAAK/2B,CAAC;IAClB,AAAI+2B,KAAK,kBAAkB,CAAC,MAAMA,CAAC,MAClC,KAAgB,SAASA,EAAE,YAAY,EAAA,CAAG,MAAM,EAAE,IAAI,OAAO,QAAQA,EAAE,SAAS,IAAI,GAAA,CAAI,MAAM,EAAE;EAGnG;EAMD,AAHA,KAAK3B,GAAQ,QAAQ0B,KAAgB,IACrC,KAAK1B,GAAQ,UAAU,OAAO,aAAa,CAAC,CAAC0B,CAAY,GAErD,KAAK,QAAQ,KAChB,KAAKpB,GAAUoB,CAAY;CAE7B;CAEA,MAAa,MAAQ;EAEpB,IAAI1gB,MAAQ,MAAMA,KAAQ,MAA2B;GACpD,IAAI4gB,IAAU,KAAKC,GAAa7gB,CAAG;GAOnC,AALI4gB,MACC,KAAKpB,MAAQxf,IAAM,KAAKwf,OAAM,IAAU,KACxC,KAAKD,MAAQvf,IAAM,KAAKuf,OAAM,IAAU,MAGxCqB,KACJ,MAAM,KAAK,UAAU,IAAI,SAAS;EAEpC;CACD;CAEA,MAAgB,MAAM;EAErB,IAAI,OAAOh3B,KAAM,UAAU,OAAO;EAElC,IAAIg3B,IAAU;EAEd,QAAQ,KAAKH,IAAb;GACC,KAAK;GACL,KAAK;IACJ,IAAMK,IAAQ,OAAOl3B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7Bm3B,IAAQ,OAAOn3B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7Bo3B,IAAQ,OAAOp3B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEnC,IAAI,MAAMk3B,CAAI,KAAK,MAAMC,CAAK,KAAK,MAAMC,CAAG,GAC3C,IAAU;SACJ,IAAID,IAAQ,KAAKA,IAAQ,MAAMC,IAAM,KAAKA,IAAM,IACtD,IAAU;SACJ,IAAI;KAAC;KAAG;KAAG;KAAG;IAAE,CAAC,CAAC,SAASD,CAAK,KAAKC,KAAO,IAClD,IAAU;SACJ,IAAID,KAAS,GAAG;KACtB,IAAIE,IAAUH,IAAO,KAAK,MAAMA,IAAO,OAAO,KAAKA,IAAO,OAAO;KACjE,CAAIE,IAAM,MAAOA,KAAO,MAAM,CAACC,OAC9B,IAAU;IAEZ;EAEF;EAEA,IAAIL,GACH,QAAQ,KAAKH,IAAb;GACC,KAAK;IACJ,IAAIhiB,IAAO7U,EAAE,OAAO,IAAI,CAAC,GACrBs3B,IAAO,OAAOt3B,EAAE,OAAO,IAAI,CAAC,CAAC,GAC7Bu3B,IAAO,OAAOv3B,EAAE,OAAO,IAAI,CAAC,CAAC;IAEjC,AAAI6U,KAAK,OAEE,MAAMyiB,CAAI,KAAK,MAAMC,CAAG,KAExBD,IAAO,KAAKA,IAAO,MAAMC,IAAM,KAAKA,IAAM,QACpD,IAAU,MAJV,IAAU;IAMX;GAED,KAAK;IACJ,IAAIL,IAAQ,OAAOl3B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7Bm3B,IAAQ,OAAOn3B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEjC,CAAI,MAAMk3B,CAAI,KAAK,MAAMC,CAAK,KAEnBA,IAAQ,KAAKA,IAAQ,QAC/B,IAAU;IAEX;GAED,KAAK;IACJ,IAAID,IAAO,OAAOl3B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC5BF,IAAOE,EAAE,OAAO,GAAG,CAAC,GACpBw3B,IAAO,OAAOx3B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEhC,AAAIF,KAAK,OAEE,MAAMo3B,CAAI,KAAK,MAAMM,CAAI,KAEzBA,KAAQ,KAAKA,IAAO,QAC9B,IAAU,MAJV,IAAU;EAOb;EAGD,OAAOR;CACR;CAEA,IAAIpB,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK;CACpC;CAEA,IAAID,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK;CACpC;AAKD;AAEK,eAAe,IAAI,iBAAiB,KACxC,eAAe,OAAO,mBAAmBiB,CAAa;;ACvMvD,IAAMa,IAAN,cAA2BvC,EAAoB;CAC3C;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAQhB,AAPA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,OAAO,GACzC,KAAKsC,KAAS,KAAK,cAAc,MAAM,GAEvC,KAAKxG,GAAW;CACpB;CAEA,IAAI,aAAa;EACb,OAAO,CACH;GAAE,OAAO,KAAK;GAAW,MAAM,KAAKyG;EAAU,GAC9C;GAAE,OAAO,KAAK;GAAY,MAAM,KAAKC;EAAW,CACpD;CACJ;CAEA,WAAmB;EAOf,AANI,KAAK,QAAQ,OAAO,KACpB,KAAKxC,GAAQ,iBAAiB,WAAW,MAAM;GAC3C,MAAM,MAAM,cAAc,yBAAyB,MAAM,KAAK,QAAQ,IAAI,iBAAiB,CAAC,EAAE,UAAU,EAAE,OAAO,OAAO;EAC5H,CAAC,GAGL,KAAKA,GAAQ,iBAAiB,WAAW,MAAU;GAC/C,AAAK,KAAK,QAAQ,OAAO,MAErB,KAAKyC,MACL,KAAK,UAAU,EAAK,GACpB,KAAK,QAAQ,KAAK,aAGlB,KAAK,QAAQtC,EAAM,OAAO,UAAU,KAAK,YAAY,KAAK,YAG9D,KAAK,MAAM,WAAW,QAAQ,EAAI;EACtC,CAAC;CACL;CAEA,WAAkB;EAEd,IAAMuC,IAAY,KAAK,WAGjBpM,IAAkB,KAAK,KAAK,aAAa,SAAS,KAAK,IACvDqM,IAAY,KAAKF,KAAW,8BAA8BC,EAAU,QAAQ,yCAAyCpM,EAAgB;EAE3I,KAAK,YAAY;cACXqM,EAAU;;CAEpB;CAEA,gBAAgB;EACZ,IAAM3hB,IAAM,MAAM,QAAQ;EAI1B,AAFA,KAAKgf,GAAQ,UAAWhf,MAAQ,KAAK,WAEjC,KAAK,QAAQ,KACb,KAAKsf,GAAUtf,CAAG;EAGtB,IAAM4hB,IAAe5hB,MAAQ,KAAK,YAAa,KAAKuhB,KAAcvhB,MAAQ,KAAK,aAAc,KAAKwhB,KAAaxhB;EAE/G,AAAI,KAAKshB,OACL,KAAKA,GAAO,cAAcM;CAElC;CAEA,MAAa,MAAQ;EAIjB,AAFA,KAAK,KAAK,UAAU,OAAO,SAAS,GAEhC5hB,MAAQ,MAAMA,KAAQ,QAClBA,MAAQ,KAAK,aAAaA,MAAQ,KAAK,cACvC,KAAK,KAAK,UAAU,IAAI,SAAS;CAG7C;CAEA,aAAa,MAAM;EACf,IAAI,KAAK,QAAQ,OAAO,GAAG;EAE3B,IAAMwe,IAAO,KAAK,KAAK,KAAK,SAAS,GAC/BnzB,IAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI;EAEhE,IAAI,MAAW,IAEf;QAAK,IAAImC,IAAI,GAAGA,IAAIgxB,EAAK,QAAQ,KAC7B,AAAI,KAAKqD,MAAW,MAAM,aAAa,KAAKA,IAASrD,EAAKhxB,IAAIA,GAAG,KAAK,IAAI,MAAM,MAC5E,KAAKs0B,MAAa,MAAM,aAAa,KAAKA,IAAWtD,EAAKhxB,IAAIA,GAAG,KAAK,IAAI,MAAM,MAChF,KAAKu0B,MAAY,MAAM,aAAa,KAAKA,IAAUvD,EAAKhxB,IAAIA,GAAG,KAAK,IAAI,MAAM,OAElF,EAAKA,EAAE,CAAC,EAAEnC,KAAYzB,IAAI,KAAK,YAAY,KAAK;GAGpD,MAAM,MAAM,WAAW;EAFvB;CAGJ;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CACnD;CACA,IAAI,aAAa;EACb,OAAO,KAAK,KAAK,aAAa,aAAa,KAAI;CACnD;CACA,IAAI23B,KAAY;EACZ,OAAO,KAAK,KAAK,aAAa,WAAW,KAAK;CAClD;CACA,IAAIC,KAAa;EACb,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CACnD;CACA,IAAIC,KAAW;EACX,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CACjD;CACA,IAAII,KAAU;EACV,OAAO,KAAK,KAAK,aAAa,QAAQ,KAAK;CAC/C;CACA,IAAIC,KAAY;EACZ,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CACjD;CACA,IAAIC,KAAW;EACX,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK;CAChD;AACJ;AAEK,eAAe,IAAI,eAAe,KACnC,eAAe,OAAO,iBAAiBV,CAAY;;ACtIvD,IAAMW,IAAN,cAAwBlD,EAAoB;CAC3C;CACA,KAAa,CAAC;CACd,KAAc,CAAC;CAEf,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAOnB,AANA,MAAM,kBAAkB,GAExB,KAAKlY,GAAU,GAEf,KAAKqb,GAAe,GAEpB,KAAKnH,GAAW;CACjB;CAEA,WAAmB;EAElB,KAAK,KAAK,iBAAiB,YAAW,MAAK;GAE1C,IAAI,OAAK,KAAK,aAAa,UAAU,KAAK,KAAK,KAAK,UAAU,SAAS,UAAU,MAC7E,KAAK,KAAK,aAAa,UAAU,MAAM,UAEvC,EAAE,SAAS,SAAS;IACvB,EAAE,eAAe;IAEjB,IAAIoH,IAAa;IAYjB,AAVA,KAAKC,GAAW,SAAS,GAAI,MAAU;KACtC,IAAI,KAAK,UAAU3mB,EAAI,aAAa,OAAO,GAE1C,OADA,IAAatO,GACN;IAET,CAAC,GAED,IAAcg1B,MAAe,KAAKC,GAAW,SAAS,IAAK,IAAKD,KAAc,IAAIA,IAAa,IAAI,GACnG,KAAK,QAAQ,KAAKC,GAAWD,EAAW,CAAC,aAAa,OAAO,GAE7D,KAAK,MAAM,WAAW,QAAQ,EAAI;GACnC;EACD,CAAC;CACF;CAEA,WAAuB;EAEtB,IAAI,CAAC,KAAK,MAAM;EAEhB,IAAMr2B,IAAa,KAAK,KAAK,aAAa,aAAa;EACvD,IAAKA,MAEL,KAAKo0B,KAAc,MAAM,aAAap0B,GAAY,KAAK,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,GAEnF,KAAKmzB,GAAQ,gBAAgB,GAEzB,KAAKiB,MAAe,MAAM,QAAQ,KAAKA,EAAW,IAAG;GAExD,IAAMpjB,IAAW,SAAS,uBAAuB;GA2BjD,AAzBA,KAAKojB,GAAY,SAAQ,MAAK;IAC7B,IAAMmC,IAAUx4B,EAAE,KAAKy4B,QAAc,KAAA,IAA+B,KAAnBz4B,EAAE,KAAKy4B,KAClDC,IAAU14B,EAAE,KAAK24B,QAAgB,KAAA,IAAiC,KAArB34B,EAAE,KAAK24B,KAEpDC,IAAQ,SAAS,cAAc,OAAO,GAEtCC,IAAQ,SAAS,cAAc,OAAO;IAE5C,AADA,EAAM,OAAO,SACb,EAAM,QAAQL;IAEd,IAAMM,IAAO,SAAS,cAAc,MAAM;IAK1C,AAJA,EAAK,cAAcJ,GAEnBE,EAAM,YAAYC,CAAK,GACvBD,EAAM,YAAYE,CAAI,GACtB7lB,EAAS,YAAY2lB,CAAK;GAC3B,CAAC,GAED,KAAKxD,GAAQ,YAAYniB,CAAQ,GAGjC,KAAKslB,KAAa,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,GAI3D,KAAKA,GAAW,SAAQ,MAAO;IAC9B,EAAI,iBAAiB,WAAW,MAAM;KAErC,AADA,KAAK,QAAQ,EAAE,OAAO,OACtB,KAAK,MAAM,WAAW,QAAQ,EAAI;IACnC,CAAC;GACF,CAAC;EACF;CACD;CAEA,WAAkB;EAMjB,AAJA,KAAK,YAAY,8BAIjB,KAAKnD,KAAU,KAAK,cAAc,KAAK;CACxC;CAEA,mBAAmB;EAElB,AADA,KAAKiD,GAAe,GACpB,KAAK,QAAQ;CACd;CAEA,gBAAgB;EAEf,IAAMr4B,IAAI,MAAM,QAAQ;EAMxB,AAJA,KAAKu4B,GAAW,SAAQ,MAAO;GAC9B,EAAI,UAAWv4B,MAAM4R,EAAI;EAC1B,CAAC,GAEG,KAAK,QAAQ,KAChB,KAAK8jB,GAAU;CAEjB;CAEA,WAAkB;EAEjB,AAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,MAAO,MAAM,QAAQ,KAAKW,EAAW,KAI/F,KAAKA,GAAY,WAAU,MAAK,KAAK,UAAUpO,EAAE,KAAKwQ,GAC5D,IAAI,KACT,KAAK,KAAK,UAAU,IAAI,SAAS;CAEnC;CAEA,IAAI,aAAa;EAChB,OAAO,KAAKpC;CACb;CAEA,IAAIoC,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CAC9C;CAEA,IAAIE,KAAa;EAChB,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CAChD;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAcP,CAAS;;ACpJ9C,IAAaW,IAAb,cAAoC,YAAY;CAC/C,KAAoB;CAEpB;CACA;CACA;CAGA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAInB,AAHA,KAAK/b,GAAU,GAEf,KAAKgc,KAAO,KAAK,cAAc,mBAAmB,GAClD,iBAAiB;GAEhB,AADA,KAAKnvB,KAAS,KAAKmvB,GAAK,WAAW,cAAc,kBAAkB,GACnE,KAAKrkB,GAAY;EAClB,CAAC;CACF;CAEA,MAAa,MAAkB;EAE9B,IAAI,CAAC,KAAKqkB,MAAQ,CAAC,KAAKv4B,GAAQ,cAAc,KAAKA,GAAQ,WAAW,WAAW,GAAG;EAEpF,IAAMw4B,IAAoB,KAAKx4B,GAAQ,MAAM,UAAU;EAgEvD,AA9DA,KAAKoJ,GAAO,OAAO,MAAM,iBAAiB,wBAAwB,CAAC,CAAC,SAAS,GAAK,MAAQ;GACzF,IAAMkL,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;GACxC,AAAImD,KAAO,MACV,EAAI,MAAM,UAAWA,IAAM,KAAKkkB,IAAqB,SAAS;EAEhE,CAAC,GAED,KAAKpvB,GAAO,iBAAiB,oBAAoB,CAAC,CAAC,SAAS,GAAK,MAAQ;GACxE,IAAMkL,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;GACxC,AAAImD,KAAO,MACV,EAAI,MAAM,UAAWA,IAAM,KAAKkkB,IAAqB,SAAS;EAEhE,CAAC,GAGD,KAAKD,GAAK,iBAAiBz4B,EAAW,MAAM,iBAAiB;GAC5D,iBAAiB;IAKhB,AAHA,KAAK,MAAM,UAAU,IACrB,KAAK,UAAU,IAAI,QAAQ,GAE3B,KAAKsJ,GAAO,iBAAiB,cAAc,CAAC,CAAC,SAAS,GAAK,MAAQ;KAClE,IAAMkL,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;KACxC,AAAImD,KAAO,KAAKnD,EAAI,MAAM,YAAY,UACrC,KAAK/H,GAAO,IAAI,QAAQkL,CAAG;IAE7B,CAAC;IAED,IAAMnT,IAAS,KAAKo3B,GAAK,OAAO,IAAI;IAEpC,IAAI,KAAKv4B,GAAQ,OAAO;KACvB,IAAMy4B,IAAe,KAAKz4B,GAAQ,QAAQ,OAAO,KAAKA,GAAQ,KAAK,CAAC,CAAC,MAAM,KAAKA,GAAQ,SAAS,CAAC,CAAC,KAAI,MAAKkF,EAAE,KAAK,CAAC,IAAI,CAAC,GACnHwzB,IAASv3B,EAAO,QAAQ,GAAG,GAC3Bw3B,IAAWx3B,EAAO,QAAQ,KAAK;KAErC,KAAKo3B,GAAK,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAU;MAC3C,EAAO,EAAEI,KAAaF,EAAa,SAAS,OAAOz2B,EAAO,EAAE02B,EAAO,CAAC,IAAK,MAAM;KAChF,CAAC;KAED,IAAM71B,IAAQ,KAAKuG,GAAO,KAAK,SAAS,CAAC,CAAC,WAAW,GAAQ,MACrDpH,EAAO,EAAE02B,OAAYD,EAAa,EACzC;KAED,KAAKG,GAAW/1B,CAAK;IACtB,OAAO;KACN,IAAMg2B,IAAe,KAAK74B,GAAQ,OAC5B04B,IAASv3B,EAAO,QAAQ,GAAG,GAC3B0B,IAAQ,KAAKuG,GAAO,KAAK,SAAS,CAAC,CAAC,WAAW,GAAQ,MACrDpH,EAAO,EAAE02B,OAAYG,CAC5B;KAED,KAAKD,GAAW/1B,CAAK;IACtB;GACD,CAAC;EACF,GAAG,EAAC,MAAM,GAAI,CAAC,GAEXi2B,EAAc,SAAS,KAAKC,KAC/B,KAAK,UAAU,IAAI,QAAQ,IAE3B,KAAK,UAAU,OAAO,QAAQ,GAG/B,KAAKR,GAAK,KAAK,IAAIO,CAAa;CACjC;CAEA,MAAiB,MAAS;EACzB,IAAM/H,IAASiI,EAAK,QAAQ,gBAAgB,GAEtCC,IAAUD,EAAK,sBAAsB,GACrCve,IAAYsW,EAAO,sBAAsB;EAI/C,OAHmBtW,EAAU,SAASwe,EAAQ,UAC3BA,EAAQ,MAAMxe,EAAU;CAG5C;CAEA,MAAyB,GAAM,GAAY,MAAS;EACnD,IAAMsW,IAASiI,EAAK,QAAQ,gBAAgB,GAEtCC,IAAUD,EAAK,sBAAsB,GACrCve,IAAYsW,EAAO,sBAAsB,GAGzCmI,KAAMC,IAAc1e,EAAU,SAASwe,EAAQ,SAAWA,EAAQ,MAAMxe,EAAU,OAAQ,GAC1F2e,IAAM5N,IAAO,KAAKpiB,GAAO,SAAS,UAAWoiB,IAAO,KAAKuN,KAAoB,KAAoB,KAAK;EAE5G,OAAO,KAAK,IAAIG,GAAIE,CAAE;CACvB;CAEA,MAAuB,MAAS;EAE/B,IAAMttB,IAAQktB,EAAK,QAAQ,OAAO,GAC5BjI,IAASjlB,EAAM,QAAQ,gBAAgB,GAGvCoM,IAAWpM,EAAM,sBAAsB,GACvC2O,IAAYsW,EAAO,sBAAsB,GAE3C3P,IAAOlJ,EAAS,OAAOuC,EAAU,MAE/BgJ,IAAa,KAAK;EASxB,OARIrC,IAAOqC,IAAahJ,EAAU,UACjC,IAAO,KAAK,IAAI,GAAGA,EAAU,QAAQgJ,IAAa,CAAC,IAGhDrC,IAAO,MACV,IAAO,IAGDA;CACR;CAEA,QAAQ,MAAW;EAIlB,AAHA,KAAKphB,KAAUC,GAEf,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAK,MAAM,UAAU;EAErB,IAAIo5B,IAAQ,KAAKr5B,GAAQ;EACzB,AAAIq5B,EAAM,WAAW,KACpBA,EAAM,KAAK,KAAKr5B,GAAQ,SAAS;EAGlC,IAAM84B,IAAgB,KAAK94B,GAAQ,WAAW,KAAI,MAAQ;GACzD,IAAMoC,IAAM;IACX,KAAK;IACL,GAAG,KAAKpC,GAAQ,WAAWO,EAAK,KAAKP,GAAQ,aAAa,KAAA,IAAYO,EAAK,KAAKP,GAAQ,WAAYO,EAAK,OAAO,KAAA,IAAsB,KAAVA,EAAK;GAClI;GAKA,OAHA84B,EAAM,SAAS,GAAK,MAAQ;IAC3B,EAAI,MAAMx4B,IAAM,OAAON,EAAKkN,OAAS,KAAA,IAAyBlN,EAAKM,OAAS,KAAA,IAAwB,KAAZN,EAAKM,KAA5CN,EAAKkN;GACvD,CAAC,GACMrL;EACR,CAAC;EAED,iBAAiB;GAEhB,IAAI,CAAC,KAAKm2B,MAAQ,CAAC,KAAKv4B,GAAQ,YAAY;GAG5C,AADA,KAAK,cAAc,eAAe,CAAC,CAAC,QAAQ,IAC5C,KAAK,cAAc,SAAS,CAAC,CAAC,UAAU;GAExC,IAAMoF,IAAQnF,EAAO,QAAQ,gBAAgB,GACvCg5B,IAAUh5B,EAAO,sBAAsB,GACvCwa,IAAYrV,EAAM,sBAAsB,GAExC+zB,IAAa,KAAKG,GAAcr5B,CAAM,GACtCX,IAAI,KAAKi6B,GAAsBt5B,GAAQk5B,GAAYL,EAAc,MAAM,GACvE9wB,IAAI,KAAKwxB,GAAoBv5B,CAAM,GACnCmU,IAAI+kB,IAAcF,EAAQ,SAASxe,EAAU,MAAQwe,EAAQ,MAAMxe,EAAU,MAAMnb;GAezF,AAbA,KAAK,MAAM,SAAS,GAAGA,EAAE,KACzB,KAAK,MAAM,OAAO,GAAG0I,EAAE,KACvB,KAAK,MAAM,MAAM,GAAGoM,EAAE,KAGlB,KAAKpU,GAAQ,SAChB,KAAK,UAAU,IAAI,OAAO,GAC1B,KAAKu4B,GAAK,UAAU,IAAI,OAAO,MAE/B,KAAK,UAAU,OAAO,OAAO,GAC7B,KAAKA,GAAK,UAAU,OAAO,OAAO,IAGnC,KAAKkB,GAAUX,CAAa;EAC7B,GAAG,GAAG;CACP;CAEA,cAAc;EAEb,AADA,KAAK,UAAU,OAAO,QAAQ,GAC1B,KAAK94B,MAAW,KAAKA,GAAQ,QAChC,KAAKA,GAAQ,KAAK,MAAM,EAAE,eAAe,GAAK,CAAC;CAEjD;CAGA,MAAY,MAAM;EACjB,IAAM8L,IAAQ,EAAE,OAAO,QAAQ,OAAO;EACtC,IAAI,KAAKysB,GAAK,UAAU,SAAS,OAAO,GAAG;GAC1C,IAAM11B,IAAQ,SAASiJ,GAAO,QAAQ,OAAO,EAAE;GAC/C,KAAK4tB,GAAU72B,CAAK;EACrB,OAIC,AAFY,SAASiJ,GAAO,QAAQ,KAAK,EAEnC,KAAK,KACV,KAAK6tB,GAAW;CAGnB;CAEA,MAAoB,MAAM;EACzB,QAAQ,EAAE,MAAV;GACC,KAAK;GACL,KAAK;IACJ,IAAM92B,IAAQ,KAAK01B,GAAK,IAAI,GAAG;IAC/B,AAAI11B,IAAQ,IACX,KAAK+1B,GAAW,CAAC,IAEjB,KAAKA,GAAW/1B,CAAK;IAEtB;GACD,KAAK,OACJ,KAAK+1B,GAAW,KAAKL,GAAK,IAAI,GAAG,CAAC;EAEpC;CACD;CAEA,MAAc,MAAM;EACnB,IAAI11B;EACJ,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,KAAK,MAAM;IACX;GACD,KAAK;IACJ,AAAI,KAAK,UAAU,SAAS,OAAO,IAClC,KAAKygB,GAAM,IAEX,KAAKqW,GAAW;IAEjB;GACD,KAAK;IACJ,AAAI,KAAK,UAAU,SAAS,QAAQ,MACnC,EAAE,eAAe,GACjB,KAAK,cAAc,oBAAoB,CAAC,CAAC,MAAM,EAAE,eAAe,GAAK,CAAC;IAEvE;GACD,KAAK;IAEJ,AADA,IAAQ,KAAKpB,GAAK,IAAI,GAAG,GACrB11B,IAAQ,KACX,KAAK+1B,GAAW,CAAC;IAElB;GACD,KAAK,SAEJ,AADA,EAAE,eAAe,GACb,CAAC,MAAK,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KACxC,KAAKc,GAAU,KAAKnB,GAAK,IAAI,GAAG,CAAC;EAIpC;CACD;CAEA,WAAc;EAEb,IAAMp3B,IAAS,KAAKo3B,GAAK,OAAO,IAAI,GAC9BG,IAASv3B,EAAO,QAAQ,GAAG,GAC3Bw3B,IAAWx3B,EAAO,QAAQ,KAAK,GAE/BU,IAAM,CAAC;EAUb,AATA,KAAKuH,GAAO,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAK;GACxC,AAAItH,EAAE,EAAE62B,OAAc,OACrB92B,EAAI,KAAKC,EAAE,EAAE42B,EAAO;EAEtB,CAAC,GAED,KAAK14B,GAAQ,QAAQ6B,EAAI,KAAK,KAAK7B,GAAQ,SAAS,GAEpD,KAAKA,GAAQ,MAAM,WAAW,QAAQ,EAAI,GAC1C,KAAK,MAAM;CACZ;CAEA,WAAmB;EAClB,IAAM6C,IAAQ,KAAK01B,GAAK,IAAI,GAAG;EAE/B,IAAI11B,KAAS,GAAG;GACf,IAAMb,IAAS,KAAKoH,GAAO,KAAK,IAAIvG,CAAK;GAIzC,AAFA,KAAK7C,GAAQ,QAAQgC,EAAO,GAC5B,KAAKhC,GAAQ,MAAM,WAAW,QAAQ,EAAI,GAC1C,KAAK,MAAM;EACZ;CACD;CAEA,MAAa,MAAU;EAEtB,IAAI,KAAKu4B,GAAK,UAAU,SAAS,OAAO,KAAK11B,KAAS,GAAG;GACxD,IAAMb,IAAS,KAAKoH,GAAO,KAAK,IAAIvG,CAAK;GAIzC,AAFA,KAAK01B,GAAK,KAAK,SAASv2B,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,QAAQ,OAAOkC,EAAO,QAAQ,MAAM,MAAM,GAAG,GAEtG,KAAKu2B,GAAK,QAAQ;EACnB;CACD;CAEA,MAAc,MAAU;EACvB,AAAI11B,MAAU,MAUb,KAAKuG,GAAO,IAAI,MAAM,UAAU,CAChC,CAAC,GAED,iBAAiB;GAKhB,AAJA,KAAKA,GAAO,UAAU,MAAM,GAE5B,KAAKA,GAAO,WAAW,cAAc,KAAKA,GAAO,cAAc,yCAAqC,GACpG,KAAKA,GAAO,MAAM,EAAE,eAAe,GAAK,CAAC,GACzC,KAAKA,GAAO,WAAW;EACxB,CAAC,KAlBD,KAAKA,GAAO,IAAI,MAAMvG,SAAa;GAClC,iBAAiB;IAChB,IAAMsS,IAAO,KAAK/L,GAAO,cAAc,kBAAkBvG,EAAM,oBAAoB;IAGnF,AAFA,KAAKuG,GAAO,WAAW,cAAc+L,GACrCA,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC,GAClC,KAAK/L,GAAO,WAAW;GACxB,CAAC;EACF,CAAC;CAaH;CAEA,MAAgB,MAAM;EAErB,IAAMoc,IAAS,KAAK+S,GAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK;EAMnD,AAJA,KAAKA,GAAK,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAU;GAC3C,EAAO,EAAE/S,KAAU,EAAE,OAAO,UAAU,MAAM;EAC7C,CAAC,GAED,KAAKpc,GAAO,WAAW;CACxB;CAGA,MAAY,MAAM;EACjB,IAAMgc,IAAQ,EAAE,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK;EAEhD,IAAI,CAACA,GACJ,KAAKhc,GAAO,UAAU,MAAM;OACtB;GACN,IAAMkD,IAAa,KAAKisB,GAAK,KAAK,SAAS,GACrCp3B,IAAS,KAAKo3B,GAAK,OAAO,IAAI,GAE9B33B,IAAQ,QACRykB,IAAWlkB,EAAO,QAAQP,CAAK,GAEjC0kB,IAAgB,CAAC;GAUrB,AATAhZ,EAAW,SAAQ,MAAU;IAC5B,IAAMqJ,IAAM0P,KAAY,KAAKrjB,EAAO,IAAIA,EAAO,EAAEqjB,KAAY;IAG7D,AAFgB,OAAO1P,CAAG,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC,YAE5C,CAAC,CAAC,SAASyP,CAAK,KACzBE,EAAc,KAAK3P,CAAG;GAExB,CAAC,GAED,KAAKvM,GAAO,UAAU,IAAI,GACxBxI,IAAQ,CAAC,GAAG,IAAI,IAAI0kB,CAAa,CAAC,EACpC,CAAC;EACF;CACD;CAEA,IAAI,aAAa;EAChB,OAAO,KAAKtlB;CACb;CAEA,WAAoB;EASnB,AARA,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,SAAS,KAAKojB,EAAQ,GAC3E,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,WAAW,KAAKwW,EAAgB,GACrF,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,SAAS,KAAKtW,EAAK,GACjE,KAAK,cAAc,SAAS,CAAC,CAAC,iBAAiB,UAAU,KAAKD,EAAY,GAE1E,KAAKja,GAAO,iBAAiB,WAAW,KAAKywB,EAAU,GACvD,KAAKzwB,GAAO,iBAAiB,SAAS,KAAKsc,EAAQ,GAEnD,SAAS,iBAAiB,cAAc,MAAM;GAI7C,CAFa,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,EAAA,CAEzC,SAAS,IAAI,KAGtB,KAAK,MAAM;EACZ,CAAC;CACF;CAEA,WAAkB;EACjB,KAAK,YAAY;CA2ClB;AACD;AAEK,eAAe,IAAI,kBAAkB,KACzC,eAAe,OAAO,oBAAoB4S,CAAc;;AChczD,IAAawB,IAAb,cAA+BrF,EAAoB;CAClD;CACA,KAAc,CAAC;CACf;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAInB,AAFA,MAAM,kBAAkB,GAExB,KAAKhxB,GAAM;CACZ;CAEA,mBAAmB;EAElB,AADA,KAAKg2B,GAAU,GACf,KAAK,QAAQ;CACd;CAGA,gBAAgB;EAIf,AAHA,MAAM,QAAQ,GAEd,KAAK9E,GAAQ,cAAc,KAAKoF,GAAgB,KAAK,UACrD,KAAKC,GAAe;CACrB;CAEA,WAAwB;EACvB,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAKpE,EAAW,GAAG,OAAO;EAE5D,IAAI,KAAK,OAAO;GACf,IAAMqE,IAAO,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,cAAc;GACzD,OAAO,KAAKrE,GACV,QAAO,MAAKqE,EAAK,SAAS,OAAOzS,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CACnD,KAAI,MAAKA,EAAE,KAAK,UAAU,CAAC,CAC3B,KAAK,KAAK,cAAc;EAC3B;EAAO;GACN,IAAM5jB,IAAQ,KAAKgyB,GAAY,MAAK,MAAK,OAAOpO,EAAE,KAAK,QAAQ,MAAM,OAAO,KAAK,KAAK,CAAC;GACvF,OAAO5jB,IAAQA,EAAM,KAAK,aAAa,KAAK;EAC7C;CACD;CAEA,WAAuB;EAItB,IAHI,CAAC,MAAM,SACX,MAAM,KAAK,UAAU,OAAO,SAAS,GAEjC,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,MAAM,CAAC,MAAM,QAAQ,KAAKgyB,EAAW,IAC1G;EAGD,IAAMsE,IAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,KAAK,KAAK;EACrF,KAAK,IAAM36B,KAAK26B,GAEf,IADY,KAAKtE,GAAY,WAAU,MAAK,OAAOr2B,CAAC,MAAM,OAAOioB,EAAE,KAAK,QAAQ,CAC1E,IAAI,GAAG;GACZ,MAAM,KAAK,UAAU,IAAI,SAAS;GAClC;EACD;CAEF;CAEA,WAAc;EAKb,AAHA,KAAKjL,GAAU,GAEf,KAAKkd,GAAU,GACf,KAAKhJ,GAAW;CACjB;CAEA,WAAkB;EAGjB,IAAMjvB,IAAa,KAAK,KAAK,aAAa,aAAa;EACvD,AAAIA,MACH,KAAKo0B,KAAc,MAAM,aAAap0B,GAAY,MAAM,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG;CAEvF;CAEA,WAAkB;EAMjB,AALA,KAAK,YAAY,gLAKjB,KAAKmzB,KAAU,KAAK,cAAc,OAAO;CAC1C;CAEA,WAAmB;EASlB,AARA,KAAK,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAO;GAC9C,EAAI,iBAAiB,UAAU,MAAM;IAEpC,AADA,EAAE,gBAAgB,GAClB,KAAKwF,GAAa;GACnB,CAAC;EACF,CAAC,GAGD,KAAK,KAAK,iBAAiB,YAAY,MAAM;GAC5C,AAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,KAC5B,KAAKA,GAAa;EAEpB,CAAC;CACF;CAEA,WAAqB;EAWpB,AATK,KAAK1hB,OACT,KAAKA,KAAS,KAAK,MAAM,cAAc,kBAAkB,GACpD,KAAKA,OACT,KAAKA,KAAS,SAAS,cAAc,kBAAkB,GACvD,KAAK,MAAM,YAAY,KAAKA,EAAM,KAKhC,KAAKA,GAAO,UAAU,SAAS,QAAQ,KAAK,KAAKA,GAAO,eAAe,OAC1E,KAAKA,GAAO,MAAM,IAElB,KAAKA,GAAO,KAAK,MAAM,KAAKmd,IAAa,KAAK,SAAS,KAAK,WAAW,KAAK,OAAO,KAAK,cAAc;CAExG;CAEA,IAAI,aAAa;EAChB,OAAO,KAAKA;CACb;CACA,IAAI,UAAU;EACb,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CAC9C;CACA,IAAI,YAAY;EACf,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CAChD;CACA,IAAI,QAAQ;EACX,OAAO,KAAK,KAAK,aAAa,OAAO,MAAM;CAC5C;CACA,IAAI,iBAAiB;EACpB,OAAO,KAAK,KAAK,aAAa,iBAAiB,KAAK;CACrD;CACA,IAAI,QAAQ;EACX,OAAO,KAAK,KAAK,aAAa,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAI,MAAK1wB,EAAE,KAAK,CAAC,KAAK,CAAC;CAC3E;CACA,IAAI,YAAY;EACf,OAAO,KAAK;CACb;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAc40B,CAAS;;ACnJ9C,IAAMM,IAAN,cAA2B3G,EAAY;CACtC;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAKnB,AAJA,MAAM,kBAAkB,GAExB,KAAKlX,GAAU,GAEf,KAAKoY,KAAU,KAAK,cAAc,MAAM;CACzC;CAEA,gBAAgB;EAIf,AAFA,MAAM,QAAQ,GAEV,KAAK,KAAK,aAAa,MAAM,MAAM,SACtC,KAAKA,GAAQ,YAAY,KAAK,eAAe,IAE7C,KAAKA,GAAQ,cAAc,KAAK,eAAe;CAEjD;CAEA,WAAkB;EACjB,KAAK,YAAY;CAGlB;AACD;AAEK,eAAe,IAAI,eAAe,KACtC,eAAe,OAAO,iBAAiByF,CAAY;;ACjCpD,IAAaC,IAAb,cAAgC5G,EAAY;CAC3C;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EASnB,AAPA,KAAKlX,GAAU,GAEf,MAAM,kBAAkB,GAExB,KAAKoY,KAAU,KAAK,cAAc,QAAQ,GAE1C,KAAKA,GAAQ,oBAAoB,SAAS,KAAK2F,EAAgB,GAC/D,KAAK3F,GAAQ,iBAAiB,SAAS,KAAK2F,EAAgB;CAC7D;CAEA,MAAmB,MAAK;EACvB,EAAE,gBAAgB;EAElB,IAAM34B,IAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,EAAE,GAE1C44B,IAAc,IAAI,YAAYz6B,EAAW,MAAM,mBAAmB;GACvE,SAAS;GACT,UAAU;GACV,QAAQ;IACP,eAAe;IACf,MAAM,KAAK;IACX,KAAK6B;IACL,KAAK,SAAS,KAAK,KAAK,QAAQ,KAAK,EAAE;IACvC,MAAM,KAAK,QAAQ;IACnB,MAAM,KAAK,KAAK,KAAK,IAAIA,CAAK;IAC9B,OAAO,KAAK;GACb;EACD,CAAC;EAED,KAAK,cAAc44B,CAAW;CAC/B;CAEA,gBAAgB;EACf,IAAMC,IAAW,MAAM,UAAU,MAAM,QAAQ,IAAI,KAAK;EAExD,KAAK7F,GAAQ,YAAY,KAAK,eAAe6F,CAAQ;CACtD;CAEA,WAAkB;EAIjB,KAAK,YAAY;CAGlB;AACD;AAEK,eAAe,IAAI,aAAa,KACpC,eAAe,OAAO,eAAeH,CAAU;;AC1DhD,IAAMI,IAAN,cAA+BhH,EAAY;CAC1C;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAWnB,AAVA,KAAKlX,GAAU,GACf,MAAM,kBAAkB,GAEpB,KAAK,SACR,KAAK,KAAK,gBAAgB,UAAU,GACpC,KAAK,KAAK,QAAQ,OAAO,aAG1B,KAAKme,KAAc,KAAK,cAAc,cAAc,GACpD,KAAKC,KAAa,KAAK,cAAc,aAAa,GAClD,KAAKC,KAAgB,KAAK,cAAc,aAAa;CACtD;CAEA,WAAkB;EACjB,KAAK,YAAY;CAKlB;CAEA,gBAAgB;EACf,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,IAAI;EAE5B,KAAK,UAAU,OAAO,aAAa,aAAa,WAAW;EAE3D,IAAMx4B,IAAM,KAAK;EACjB,IAAI,MAAMA,CAAG,GAAG;EAEhB,IAAM4xB,IAAY,KAAK,GAAG;EAE1B,IAAIA,GACH,QAAQA,EAAU,EAAE,EAAEl0B,EAAW,KAAK,MAAM,YAA5C;GACC,KAAKA,EAAW,UAAU;IACzB,KAAK,UAAU,IAAI,WAAW;IAC9B;GACD,KAAKA,EAAW,UAAU;IACzB,KAAK,UAAU,IAAI,WAAW;IAC9B;GACD,KAAKA,EAAW,UAAU,QACzB,KAAK,UAAU,IAAI,WAAW;EAIhC;EAGD,IAAM+6B,IAAa,KAAK,QAAQ,GAC1BC,IAAeD,EAAW,eAAe;EAE/C,IAAIA,KAAc,KAAO;GAExB,IAAME,IAAaD,EAAa,SAAS,GACnCE,IAAaF,EAAa,UAAU,GAAGC,IAAa,CAAC,GACrDE,IAAaH,EAAa,UAAUC,IAAa,CAAC;GAExD,KAAKL,GAAY,YAAY;2CACWM,EAAW;2CACXC,EAAW;;;EAGpD,OACC,KAAKP,GAAY,YAAY,GAAGI;EAGjC,IAAMI,IAAW,OAAK,MAAM,cAAc,wBAAwB,GAC5DC,IAAY,OAAK,MAAM,cAAc,yCAAyC;EAGpF,AADA,KAAKR,GAAW,YAAYv4B,GAC5B,KAAKu4B,GAAW,MAAM,UAAWO,KAAYC,IAAa,KAAK;CAChE;AACD;AAEK,eAAe,IAAI,oBAAoB,KAC3C,eAAe,OAAO,sBAAsBV,CAAgB;;ACrF7D,IAAaW,KAAb,cAA+B,YAAY;CACvC;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAsBhB,AArBA,KAAKzH,KAAQ,KAAK,QAAQ,QAAQ,GAClC,KAAKvqB,KAAS,KAAK,QAAQ,kBAAkB,GAEzC,KAAKuqB,OACL,KAAKA,GAAM,MAAM,WAAW,aAI5B,KAAK,aAAa,WAAW,MAAM,UACnC,KAAKA,IAAO,aAAa,WAAW,MAAM,SAG1C,4BAA4B;GACxB,KAAK,SAAS,EAAI;EACtB,CAAC,KAED,KAAK,UAAU,OAAO,WAAW,GACjC,KAAK,UAAU,IAAI,QAAQ,IAG/B,KAAK,oBAAoB,SAAS,KAAKjO,EAAQ,GAC/C,KAAK,iBAAiB,SAAS,KAAKA,EAAQ;CAChD;CAEA,MAAY,MAAM;EAId,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAEd,KAAK,UAAU,SAAS,QAAQ,IAChC,KAAK,SAAS,IAEd,KAAK,OAAO;CAEpB;CAEA,eAAe;EACX,IAAI,CAAC,KAAKtc,IAAQ,cAAc,CAAC,KAAKuqB,IAAO;EAC7C,IAAM3yB,IAAW,SAAS,KAAK2yB,GAAM,QAAQ,KAAK,EAAE,GAC9C5f,IAAU,KAAK4f,GAAM,WAAW;EAKtC,AAHA,KAAK,UAAU,OAAO,WAAW,GACjC,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAKA,GAAM,aAAa,aAAa,OAAO,GAC5C,KAAKA,GAAM,MAAM,QAAQ;EAEzB,IAAMpI,IAAc,SAAS,KAAKoI,GAAM,QAAQ,aAAa,EAAE,KAAK;EAEpE,IAAI5f,MAAY,GACZ,KAAK3K,GAAO,WAAW,eAAepI,GAAUuqB,CAAW;OACxD;GACH,IAAM8P,IAAc,KAAK,IAAI,IAAI,KAAK,MAAM9P,IAAcxX,CAAO,CAAC;GAClE,KAAK,IAAI5Q,IAAI,GAAGA,IAAI4Q,GAAS,KACzB,KAAK3K,GAAO,WAAW,eAAepI,IAAWmC,GAAGk4B,CAAW;EAEvE;EAEA,4BAA4B;GACxB,AAAI,OAAO,KAAKjyB,GAAO,iBAAkB,cACrC,KAAKA,GAAO,cAAc;EAElC,CAAC;CACL;CAEA,YAAY,IAAgB,OAAU;EAClC,IAAI,CAAC,KAAKA,IAAQ,cAAc,CAAC,KAAKuqB,IAAO;EAC7C,IAAM3yB,IAAW,SAAS,KAAK2yB,GAAM,QAAQ,KAAK,EAAE,GAC9C5f,IAAU,KAAK4f,GAAM,WAAW;EAEtC,IAAI,KAAK,UAAU,SAAS,QAAQ,GAAG;GACnC,IAAMrf,IAAM,KAAKlL,GAAO,cAAc,0BAA0BpI,EAAS,GAAG,GACtEs6B,IAAWhnB,IAAM,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,IAAI;GACjE,AAAIgnB,IAAA,OACA,KAAK3H,GAAM,QAAQ,cAAc,OAAO2H,IAAWvnB,CAAO;EAElE;EAOA,IALA,KAAK,UAAU,OAAO,QAAQ,GAC9B,KAAK,UAAU,IAAI,WAAW,GAC9B,KAAK4f,GAAM,aAAa,aAAa,MAAM,GAC3C,KAAKA,GAAM,MAAM,QAAQ,eAErB5f,MAAY,GACZ,KAAK3K,GAAO,WAAW,eAAepI,GAAA,EAAyB;OAC5D;GACH,IAAMu6B,IAAa,KAAK,IAAI,IAAI,KAAK,MAAA,KAAwBxnB,CAAO,CAAC;GACrE,KAAK,IAAI5Q,IAAI,GAAGA,IAAI4Q,GAAS,KACzB,KAAK3K,GAAO,WAAW,eAAepI,IAAWmC,GAAGo4B,CAAU;EAEtE;EAEA,4BAA4B;GACxB,AAAI,OAAO,KAAKnyB,GAAO,iBAAkB,cACrC,KAAKA,GAAO,cAAc;EAElC,CAAC;CACL;CAEA,uBAAuB;EACnB,KAAK,oBAAoB,SAAS,KAAKsc,EAAQ;CACnD;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyB0V,EAAS;;AChH5D,IAAaI,KAAb,cAAiC,YAAY;CACzC;CACA;CAEA,oBAAoB;EAChB,IAAM3lB,IAAO,KAAK,YAAY;EAO9B,AANA,KAAK4lB,KAAa5lB,aAAgB,aAAaA,EAAK,OAAQ,KAAK,QAAQ,YAAY,KAAKA,EAAK,MAE/F,AACI,KAAK4lB,OAAa,KAAK,eAAe,QAAQ,YAAY,KAAK,KAAK,cAAc,QAAQ,YAAY,GAGrG,KAAKA;CACd;CAEA,MAAkB,MAAM;EACpB,IAAM5X,IAAO,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,GAC5C1N,IAAa0N,EAAK,MAAK,MAAMtlB,EAAG,YAAY,QAAQA,EAAG,YAAY,IAAI;EAE7E,IAAI,CAAC4X,GAAY;EAEjB,IAAMulB,IAAc7X,EAAK,MAAK,MAAMtlB,EAAG,YAAY,OAAO,KAAK4X,EAAW,QAAQ,OAAO;EAKzF,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAElB,KAAK,SAAS,EAAE,SAAS,EAAE,SAASA,GAAYulB,CAAW;CAC/D;CAEA,GAAgB,GAAY;EACxB,OAAOvlB,GAAY,QAAQ,kBAAkB,KAAK,KAAKslB,GAAW,eAAe,KAAKA;CAC1F;CAEA,GAAe,GAAY;EACvB,IAAMr2B,IAAQ,KAAKu2B,GAAgBxlB,CAAU;EAM7C,OALK/Q,KAEL,AACIA,EAAM,WAAS,IAAI4c,EAAc5c,CAAK,GAEnCA,EAAM,UALM;CAMvB;CAEA,GAAsB,GAAkB,GAAa;EACjD,IAAMi0B,IAAQ,CAAC,GACTuC,IAAgBC,GAAa;EAYnC,OATA,MAFqB,KAAKC,EAAiB,iBAAiB,aAAa,CAEpE,CAAC,CAAC,SAAQ,MAAU;GACrB,IAAMC,IAAkBC,EAAO,aAAa,cAAc;GAE1D,IAAI,CAACD,KAAoBH,KAAiBG,MAAoBH,GAAgB;IAC1E,IAAMK,IAAa,KAAKC,GAAYF,CAAM;IAC1C,EAAM,KAAK,GAAGC,CAAU;GAC5B;EACJ,CAAC,GAEM5C;CACX;CAEA,GAAY,GAAM;EACd,IAAMa,IAAO,CAAC;EAqCd,OApCA,MAAM,KAAKiC,EAAK,QAAQ,CAAC,CAAC,SAAQ,MAAS;GACvC,IAAMvR,IAAUwR,EAAM,QAAQ,YAAY;GAE1C,IAAIxR,MAAY,QAAQwR,EAAM,UAAU,SAAS,WAAW,GACxD,EAAK,KAAK,EAAE,MAAM,YAAY,CAAC;QAInC,IAAIxR,MAAY,MAAM;IAClB,IAAI3mB,IAAO,IACLo4B,IAASD,EAAM,cAAc,eAAe;IAClD,AAGIn4B,IAHAo4B,IACOA,EAAO,YAAY,KAAK,IAExB,MAAM,KAAKD,EAAM,UAAU,CAAC,CAC9B,QAAO,MAAKlQ,EAAE,aAAa,KAAK,SAAS,CAAC,CAC1C,KAAI,MAAKA,EAAE,YAAY,KAAK,CAAC,CAAC,CAC9B,KAAK,EAAE;IAGhB,IAAMoQ,IAAQF,EAAM,cAAc,aAAa,GACzC77B,IAAO;KACT,QAAQ67B,EAAM,MAAMn4B;KACd;KACN,WAAWm4B,EAAM,aAAa;KAC9B,UAAUA,EAAM,aAAa,UAAU,KAAKA,EAAM,aAAa,UAAU,MAAM;KAC/E,UAAU;IACd;IAMA,AAJIE,MACA,EAAK,QAAQ,KAAKJ,GAAYI,CAAK,IAGvCpC,EAAK,KAAK35B,CAAI;GAClB;EACJ,CAAC,GACM25B;CACX;CAEA,GAAgB,GAAa,GAAc,GAAY;EACnD,IAAMqC,IAAa,KAAK,aAAa,kBAAkB,MAAM,SACzDC,IAAW,CAAC,GAEVC,IAAc,KAAKC,GAAsB,MAAMb,CAAW;EAChE,AAAIY,EAAY,SAAS,KACrBD,EAAS,KAAK,GAAGC,CAAW;EAGhC,IAAME,IAAa,KAAKC,GAAezmB,CAAU,GAC3C0mB,IAAkBF,GAAY,YAAYxmB,GAAY0lB,CAAW,KAAK,QACtEiB,IAAYC,MAAiBJ,GAAY,aAAaxmB,GAAY0lB,CAAW,KAAK,KAEpFmB,IAAc;EAiBlB,AAhBA,AAQIA,IARAH,MAAoB,UAAUA,MAAoB,UACpC;GACV,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACE;EACf,IAEc;GACV,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACD;EACf,GAGAP,KACAC,EAAS,KACL,EAAE,MAAM,YAAY,GACpB;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACO;EACf,GACAC,GACA,EAAE,MAAM,YAAY,GACpB;GAAE,QAAQ;GAAa,MAAM;GAAa,WAAW;EAAoB,GACzE;GAAE,QAAQ;GAAY,MAAM;GAAY,WAAW;EAAW,GAC9D;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,OAAO,CACH;IAAE,QAAQ;IAAgB,MAAM;IAAS,WAAW;GAAe,GACnE;IAAE,QAAQ;IAAc,MAAM;IAAO,WAAW;IAAc,UAAU;GAAK,CACjF;EACJ,GACA;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,OAAO;IACH;KAAE,QAAQ;KAAkB,MAAM;KAAuB,WAAW;IAAiB;IACrF;KAAE,QAAQ;KAAmB,MAAM;KAAwB,WAAW;IAAkB;IACxF;KAAE,QAAQ;KAAgB,MAAM;KAAoB,WAAW;IAAe;GAClF;EACJ,CACJ;EAGJ,IAAMC,IAAe,CAAC;EActB,OAbAT,EAAS,SAAS,MAAS;GACvB,CAAIj8B,EAAK,SAAS,eACV08B,EAAa,WAAW,KAAKA,EAAaA,EAAa,SAAS,EAAE,CAAC,SAAS,gBAIpFA,EAAa,KAAK18B,CAAI;EAC1B,CAAC,GAEG08B,EAAa,SAAS,KAAKA,EAAaA,EAAa,SAAS,EAAE,CAAC,SAAS,eAC1EA,EAAa,IAAI,GAGdA;CACX;CAEA,SAAS,GAAG,GAAG,GAAY,GAAa;EACpC,IAAMC,IAAe,KAAKzB,GAAW,cAAc,KAAKA;EAExD,AAAK,KAAKhjB,OACN,KAAKA,KAAS,SAAS,cAAc,uBAAuB,GAC5DykB,EAAa,YAAY,KAAKzkB,EAAM;EAGxC,IAAMskB,IAAe,CAAC,CAAC5mB,EAAW,QAAQ,OAAO,GAC3CgnB,IAAY,KAAKC,GAAgB1B,GAAaqB,GAAc5mB,CAAU;EAE5E,KAAKsC,GAAO,OAAO0kB,IAAY,MAAM,KAAKE,GAAiB,GAAGlnB,GAAYulB,CAAW,CAAC;EAEtF,IAAM51B,IAAc,KAAK61B,GAAgBxlB,CAAU;EAGnD,AAFA,KAAKmnB,GAAgBx3B,CAAW,GAEhC,KAAK2S,GAAO,OAAOrQ,GAAGuU,CAAC;CAC3B;CAEA,GAAgB,GAAa;EACzB,IAAI,CAAC,KAAKlE,MAAU,CAAC3S,GAAa;EAElC,IAAMy3B,IAAcz3B,EAAY,WAAW,cAAc,KAAK;EAC9D,KAAK2S,GAAO,gBAAgB,aAAa,MAAM8kB,CAAW;EAE1D,IAAMC,IAAU,KAAK/B,GAAW,aAAa,cAAc,MAAM;EACjE,KAAKhjB,GAAO,gBAAgB,gBAAgB,MAAM+kB,CAAO;EAEzD,IAAMC,IAAY,KAAKhC,GAAW,aAAa,gBAAgB,MAAM;EACrE,KAAKhjB,GAAO,gBAAgB,kBAAkB,MAAMglB,CAAS;CACjE;CAEA,GAAiB,GAAG,GAAY,GAAa;EACzC,IAAMC,IAAS,EAAE,QAEXnD,IAAc,IAAI,YAAY,cAAc;GAC9C,QAAQ;IAAE;IAAQ;IAAY;IAAa,eAAe;GAAE;GAC5D,SAAS;GACT,UAAU;EACd,CAAC;EACD,KAAK,cAAcA,CAAW;EAE9B,IAAMtY,IAAU,SAAS9L,EAAW,QAAQ,KAAK,EAAE,GAC7CrQ,IAAc,KAAK61B,GAAgBxlB,CAAU;EAEnD,QAAQunB,GAAR;GACI,KAAK;GACL,KAAK;IAED,KADwBd,GAAezmB,CAC9B,CAAC,EAAE,iBAAiBunB,GAAQvnB,CAAU;IAC/C;GAEJ,KAAK;IACD,AAAK,MAAM8L,CAAO,KACdnc,EAAY,SAAS,qBAAqBmc,GAAS9L,CAAU;IAEjE;GAEJ,KAAK;IACD,GAAa,WAAW,OAAO;IAC/B;GAEJ,KAAK;IACD,KAAKslB,GAAW,aAAa,gBAAgB,KAAKA,GAAW,aAAa,cAAc,MAAM,SAAS,UAAU,MAAM;IACvH;GAEJ,KAAK,kBACD,KAAKA,GAAW,aAAa,kBAAkB,KAAKA,GAAW,aAAa,gBAAgB,MAAM,SAAS,UAAU,MAAM;EAEnI;EAEA,KAAKhjB,GAAO,MAAM;CACtB;CAEA,uBAAuB;EACnB,KAAKgjB,IAAY,oBAAoB,eAAe,KAAKkC,EAAc;CAC3E;AACJ;AAEK,eAAe,IAAI,iBAAiB,KACrC,eAAe,OAAO,mBAAmBnC,EAAW;;ACxQxD,IAAaoC,KAAb,cAA+B,YAAY;CACvC;CACA,KAAgB;CAEhB,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAMhB,AAJA,KAAK,MAAM,WAAW,SACtB,KAAK,MAAM,UAAU,QACrB,KAAK,MAAM,SAAS,SAEpB,KAAK,YAAY;CAKrB;CAEA,OAAO,GAAO,GAAU;EACpB,KAAKC,KAAc1R;EACnB,IAAMhc,IAAY,KAAK,cAAc,iBAAiB;EACtD,AAAKA,MAEL,EAAU,YAAY,IAEtB,KAAK2tB,GAAa3tB,GAAWkpB,CAAK,GAClC,KAAK0E,GAAiB;CAC1B;CAEA,OAAO,GAAG,GAAG,IAAa,MAAM;EAG5B,IAFA,KAAK,MAAM,UAAU,SAEjB5nB,GAAY;GACZ,IAAM+B,IAAW/B,EAAW,sBAAsB,GAC5C6nB,IAAa9lB,EAAS;GAE5B,4BAA4B;IACxB,IAAM+lB,IAAU,KAAK,cAAc,eAAe;IAClD,IAAI,CAACA,GAAS;IACd,IAAMxa,IAAawa,EAAQ,sBAAsB,CAAC,CAAC,OAE/CC,IAAiBF,IAAava;IAElC,AAAIya,IAAiB,MACjB,IAAiBhmB,EAAS;IAG9B,IAAMimB,IAAcF,EAAQ,sBAAsB,CAAC,CAAC,QAChDG,IAAgBzhB;IAMpB,AALIA,IAAIwhB,IAAc,OAAO,gBACzB,IAAgBxhB,IAAIwhB,IAGxB,KAAK,MAAM,OAAO,GAAGD,EAAe,KACpC,KAAK,MAAM,MAAM,GAAGE,EAAc;GACtC,CAAC;EACL,OAII,AAHA,KAAK,MAAM,OAAO,GAAGh2B,EAAE,KACvB,KAAK,MAAM,MAAM,GAAGuU,EAAE,KAEtB,4BAA4B;GACxB,IAAMshB,IAAU,KAAK,cAAc,eAAe;GAClD,IAAI,CAACA,GAAS;GACd,IAAM/nB,IAAO+nB,EAAQ,sBAAsB;GAK3C,AAHI71B,IAAI8N,EAAK,QAAQ,OAAO,eACxB,KAAK,MAAM,OAAO,GAAG9N,IAAI8N,EAAK,MAAM,MAEpCyG,IAAIzG,EAAK,SAAS,OAAO,gBACzB,KAAK,MAAM,MAAM,GAAGyG,IAAIzG,EAAK,OAAO;EAE5C,CAAC;EAcL,AAXI,KAAK+M,MACL,OAAO,oBAAoB,eAAe,KAAKA,EAAa,GAGhE,KAAKA,MAAiB,MAAM;GAExB,AAAI,EADS,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,EAAA,CACxC,SAAS,IAAI,KAAK,CAAC,KAAK,SAAS,EAAE,MAAM,KAC/C,KAAK,MAAM;EAEnB,GAEA,iBAAiB;GACb,OAAO,iBAAiB,eAAe,KAAKA,EAAa;EAC7D,GAAG,CAAC;CACR;CAEA,QAAQ;EAEJ,AADA,KAAK,MAAM,UAAU,QACrB,AAEI,KAAKA,QADL,OAAO,oBAAoB,eAAe,KAAKA,EAAa,GACvC;CAE7B;CAEA,gBAAgB,GAAQ,GAAW,GAAW;EAC1C,IAAMob,IAAK,KAAK,cAAc,eAAeX,EAAO,GAAG;EACvD,AAAIW,MACAC,IAAYD,EAAG,UAAU,IAAIzN,CAAS,IAAIyN,EAAG,UAAU,OAAOzN,CAAS;CAE/E;CAEA,GAAa,GAAU,GAAO;EAC1B,EAAM,SAAQ,MAAQ;GAClB,IAAIrwB,EAAK,SAAS,aAAa;IAC3B,IAAMg+B,IAAM,SAAS,cAAc,IAAI;IAEvC,AADA,EAAI,YAAY,qBAChBC,EAAS,YAAYD,CAAG;IACxB;GACJ;GAEA,IAAMF,IAAK,SAAS,cAAc,IAAI;GAEtC,AADAA,EAAG,aAAa,WAAW99B,EAAK,MAAM,GACtC,EAAG,YAAY,GAAGA,EAAK,aAAa,GAAG,GAAGA,EAAK,QAAQ,YAAY,GAAG,GAAGA,EAAK,WAAW,aAAa,KAAK,KAAK;GAEhH,IAAM83B,IAAO,SAAS,cAAc,MAAM;GAI1C,IAHA,EAAK,cAAc93B,EAAK,MACxB89B,EAAG,YAAYhG,CAAI,GAEf93B,EAAK,SAASA,EAAK,MAAM,SAAS,GAAG;IACrC,IAAM+7B,IAAQ,SAAS,cAAc,IAAI;IAGzC,AAFA,EAAM,YAAY,mBAClB,KAAKwB,GAAaxB,GAAO/7B,EAAK,KAAK,GACnC89B,EAAG,YAAY/B,CAAK;GACxB;GAEA,EAAS,YAAY+B,CAAE;EAC3B,CAAC;CACL;CAEA,KAAmB;EACf,KAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAM;GAC/C,EAAG,iBAAiB,UAAU,MAAM;IAEhC,IADAv1B,EAAE,gBAAgB,GACdu1B,EAAG,UAAU,SAAS,UAAU,GAAG;IAEvC,IAAMX,IAASW,EAAG,aAAa,SAAS;IAExC,AADA,KAAKR,KAAc;KAAE;KAAQ,QAAQQ;IAAG,CAAC,GACzC,KAAK,MAAM;GACf,CAAC;EACL,CAAC;CACL;CAEA,uBAAuB;EACnB,KAAK,MAAM;CACf;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBT,EAAS"}
|