canvas-datagrid 0.3.18 → 0.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/dom.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', '&nbsp;&nbsp;&nbsp;'],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '&#x25BA;'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '&#x25BC;'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['frozenMarkerHoverColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos = cell.paddingLeft + cell.treeArrowWidth + cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos = cell.paddingLeft + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n cellHeight = self.style.cellHeight;\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n (en.verticalBar.height - self.scrollBox.scrollBoxHeight) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n drawText(cell);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n const hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue = self.hasActiveFilters()\n ? filteredRowNumber\n : rowIndex + 1;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 0;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n };\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n }\n function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nexport {\n isSupportedHtml,\n sanitizeElementData,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n};\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n ch = self.style.cellHeight,\n s = self.getSchema();\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n (self.style.height !== 'auto' &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width = self.width - rowHeaderCellWidth;\n self.scrollBox.height = self.height - columnHeaderCellHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height: columnHeaderCellHeight + dataHeight + cellBorder + 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder,\n };\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n self.scrollCache.x = [];\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n column = s[self.orders.columns[columnIndex]];\n if (column.hidden) {\n self.scrollCache.x[columnIndex] = accumulator;\n return accumulator;\n }\n var va =\n accumulator + self.getColumnWidth(self.orders.columns[columnIndex]);\n self.scrollCache.x[columnIndex] = va;\n return va;\n }, 0) || 0;\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top = columnHeaderCellHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height - columnHeaderCellHeight) / dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d;\n n.width =\n self.width - self.style.scrollBarWidth - rowHeaderCellWidth - d - m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight;\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height - columnHeaderCellHeight - self.style.scrollBarWidth - d - m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n };\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n }\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n self.selectRow(cell.rowIndex, ctrl, null, true);\n } else if (self.attributes.selectionMode !== 'row') {\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !== -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) === -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n const event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n self.selections = [];\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else if (dragBounds.top !== -1) {\n self.selectArea(sBounds, true);\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectColumn(i.header.index, ctrl, e.shiftKey);\n self.draw();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n pos.x > 0 &&\n pos.x - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n pos.y - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n pos.y > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n self.scrollBox.scrollLeft += x;\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function () {\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n document.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata,\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n cr[self.dragMode].splice(oIndex, 1);\n cr[self.dragMode].splice(tIndex, 0, self.reorderObject[i]);\n self.orders.columns = cr[self.dragMode];\n } else {\n // self.orders.rows = cr[self.dragMode];\n odata = self.viewData[oIndex];\n self.viewData[oIndex] = self.viewData[tIndex];\n self.viewData[tIndex] = odata;\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode);\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\n self.selections = [];\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n document.addEventListener('mousemove', self.scrollGrid, false);\n document.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n self.attributes.columnHeaderClickBehavior === 'select'\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n self.draw();\n }\n document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n var ctrl = e.ctrlKey || e.metaKey;\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n if (self.draggingItem) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n self.draw();\n }\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n var isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey) {\n const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) {\n self.selections = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n self.fitColumnToValues(self.currentCell.header.name);\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (['cell', 'activeCell'].indexOf(self.currentCell.style) !== -1) {\n self.beginEditAt(self.currentCell.columnIndex, self.currentCell.rowIndex);\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(pasteValue, pasteType, startCell[0], startCell[1]);\n\n self.draw();\n });\n };\n self.cut = function (e) {\n self.copy(e);\n const schema = self.getSchema();\n\n var affectedCells = [];\n for (const [rowIndex, row] of self.selections.entries()) {\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (const columnIndex of row) {\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const colName = schema[boundColumnIndex].name;\n\n self.viewData[rowIndex][colName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n if (self.dispatchEvent('cut', { NativeEvent: e, cells: affectedCells })) {\n return;\n }\n };\n self.copy = function (e) {\n if (self.dispatchEvent('copy', { NativeEvent: e })) {\n return;\n }\n if (!self.hasFocus || !e.clipboardData) {\n return;\n }\n var t = '',\n d = '',\n textRows = [],\n sData = self.getSelectedData(),\n s = self.getSchema(),\n sSorted = [],\n firstRowKeys,\n isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n function htmlSafe(v) {\n return v.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n s.forEach(function (column, columnIndex) {\n sSorted.push(s[self.orders.columns[columnIndex]]);\n });\n if (sData.length > 0) {\n sData.forEach((row) => {\n if (!row) return;\n var rowKeys = Object.keys(row);\n var textRow = [];\n if (!firstRowKeys) firstRowKeys = Object.keys(row);\n if (isNeat && rowKeys.length !== firstRowKeys.length) isNeat = false;\n sSorted.forEach(function (column, columnIndex) {\n if (rowKeys.indexOf(column.name) < 0) {\n if (firstRowKeys.indexOf(column.name) < 0) {\n return;\n } else if (isNeat) {\n isNeat = false;\n }\n }\n textRow.push(row[column.name] || '');\n });\n textRows.push(textRow);\n });\n if (isNeat) {\n t = textRows.map((row) => row.join('\\t')).join('\\n');\n /**\n * The html content copied by Excel has not header\n */\n d += '<table>';\n d += textRows\n .map(\n (row) =>\n '<tr>' +\n row.map((value) => '<td>' + htmlSafe(value) + '</td>').join('') +\n '</tr>',\n )\n .join('');\n d += '</table>';\n } else {\n t = textRows.map((row) => row.join('')).join('');\n d = t;\n }\n if (t) {\n e.clipboardData.setData('text/html', d);\n e.clipboardData.setData('text/plain', t);\n e.clipboardData.setData('text/csv', t);\n e.clipboardData.setData('application/json', JSON.stringify(sData));\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n if (/vertical-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test(self.startingCell.style) &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.selections = [];\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle, 10);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n function addDefaultContextMenuItem(e) {\n var isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[e.cell.columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function () {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDiposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDiposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n document.addEventListener('mouseup', createDiposeEvent);\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n self.input.style.left =\n pos.left + cell.x + self.canvasOffsetLeft - s.left + 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n self.changes[y] = self.changes[y] || {};\n self.changes[y][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (y === self.viewData.length) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n document.body.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n if (\n self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n }).length === 0\n ) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n };\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = function (dontDraw) {\n self.selections = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(self.orders.columns[columnIndex]) ===\n -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n self.sizes.columns[\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index\n ] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n var sel = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n });\n });\n self.selections = sel;\n };\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'row-resize';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'col-resize';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n cell.context = 'cell';\n cell.dragContext = 'column-reorder';\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} bounds A rect object representing the selected values.\n */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.headerCellPaddingRight +\n self.style.headerCellPaddingLeft;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","radiusRect","w","h","radius","r","b","beginPath","moveTo","lineTo","quadraticCurveTo","fillRect","strokeRect","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","stroke","strokeCircle","addBorderLine","c","pos","t","l","internal","isChildGrid","parentGrid","visible","checkScrollHeight","cx","cy","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","my","mx","xHover","yHover","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","cellHeight","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","getSchema","visibleCells","offsetTop","offsetLeft","fillStyle","gridBackgroundColor","ln","min","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","showNewRow","showRowHeaders","scrollIndexLeft","columns","drawCell","newRow","restore","drawRows","cl","activeCell","frozenColumn","selectionMode","lineWidth","activeCellOverlayBorderWidth","strokeStyle","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","hidden","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","frozenColumnsWidth","s","getColumnWidth","getFrozenColumnsWidth","htmlImages","scale","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","selections","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","row","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingLeft","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","cellHeightWithChildGrid","cellWidthWithChildGrid","tree","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","isSorting","orderings","showRowNumberGaps","previousRowNumber","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","includes","col","parseText","parseData","mimeType","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","ch","scrollCache","accumulator","column","va","setCanvasSize","args","top","left","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","draggingItem","dragItem","cursor","selecting","dragStart","dragStartObject","shiftKey","bottom","right","getSelectionBounds","ignoreNextClick","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","selectColumn","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","source","reorderDeadZone","stopDragReorder","oIndex","tIndex","odata","cr","dragMove","stopDragMove","moveSelection","freezeMove","stopFreezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","mouseup","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","Number","isArrowKey","firstSelectedRowIndex","findIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","join","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","assign","colIndex","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","from","clipboardData","items","supportedMimeTypes","pasteableItems","itemToPaste","startCell","len","pasteType","getAsString","cut","copy","entries","firstRowKeys","textRows","sData","sSorted","isNeat","rowKeys","textRow","setData","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","rect","getBoundingClientRect","clientX","clientY","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","contextmenuEvent","touchContextMenuTimeMs","setInterval","touchEndEvents","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","refresh","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrab","cursorGrabing","cursorGrabbing","appendTo","getVisibleCellByIndex","clearChangeLog","gotoCell","gotoRow","findColumnScrollLeft","findRowScrollTop","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","find","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","contextMenuWindowMargin","innerWidth","clickIndex","Event","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","columnWidth","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","createDiposeEvent","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","cellPaddingLeft","ignoreScrollOffset","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","verticalAlign","marginLeft","padding","border","contextFilterInputBorder","borderRadius","contextFilterInputBorderRadius","fontWeight","fontFamily","contextFilterInputFontFamily","contextFilterInputFontSize","contextMenuBackground","contextMenuColor","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","contextMenuFontFamily","contextMenuFontSize","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","opacity","contextMenuOpacity","overflow","contextMenuHoverBackground","contextMenuHoverColor","display","boxSizing","outline","margin","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuItemMargin","contextMenuItemBorderRadius","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","maxWidth","contextMenuLabelMaxWidth","contextMenuCursor","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","offsetX","offsetY","targetX","targetY","sbh","isColumnSelected","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","dontSetStorageData","sorter","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","headerCellPaddingRight","headerCellPaddingLeft","cellFont","cellPaddingRight","cellAutoResizePadding","total","getRowHeight","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"opFAIe,kBAAUA,GACvBA,EAAKC,SAAW,CACdC,WAAY,CACV,CAAC,yBAAyB,GAC1B,CAAC,qBAAqB,GACtB,CAAC,6BAA6B,GAC9B,CAAC,qBAAqB,GACtB,CAAC,wBAAwB,GACzB,CAAC,wBAAwB,GACzB,CAAC,wBAAwB,GACzB,CAAC,sBAAsB,GACvB,CAAC,kBAAkB,GACnB,CAAC,0BAA0B,GAC3B,CAAC,gBAAgB,GACjB,CAAC,sBAAsB,GACvB,CAAC,qBAAqB,GACtB,CAAC,kBAAkB,GACnB,CAAC,yBAAyB,GAC1B,CAAC,mBAAoB,GACrB,CAAC,aAAc,YACf,CAAC,qBAAsB,QACvB,CAAC,mBAAoB,IACrB,CAAC,0BAA2B,wBAC5B,CAAC,4BAA6B,QAC9B,CAAC,2BAA4B,sBAC7B,CAAC,qBAAsB,sBACvB,CAAC,4BAA6B,KAC9B,CAAC,2BAA4B,GAC7B,CAAC,2BAA4B,GAC7B,CAAC,0BAA0B,GAC3B,CAAC,WAAY,QACb,CAAC,SAAS,GACV,CAAC,YAAY,GACb,CAAC,eAAgB,OACjB,CAAC,mBAAoB,aACrB,CAAC,mBAAoB,eACrB,CAAC,oBAAoB,GACrB,CAAC,mBAAmB,GACpB,CAAC,iBAAkB,WACnB,CAAC,YAAa,QACd,CAAC,uBAAuB,GACxB,CAAC,uBAAwB,KACzB,CAAC,aAAa,GACd,CAAC,OAAQ,IACT,CAAC,oBAAqB,GACtB,CAAC,YAAa,SACd,CAAC,2BAA2B,GAC5B,CAAC,yBAA0B,uBAC3B,CAAC,kBAAmB,GACpB,CAAC,mBAAoB,IACrB,CAAC,kBAAmB,GACpB,CAAC,kBAAkB,GACnB,CAAC,8BAA+B,KAChC,CAAC,qBAAqB,GACtB,CAAC,mBAAoB,IACrB,CAAC,8BAA8B,GAC/B,CAAC,0BAA2B,QAC5B,CAAC,gBAAiB,QAClB,CAAC,2BAA4B,IAC7B,CAAC,sBAAuB,IACxB,CAAC,2BAA2B,GAC5B,CAAC,qBAAqB,GACtB,CAAC,sBAAsB,GACvB,CAAC,YAAY,GACb,CAAC,cAAc,GACf,CAAC,cAAc,GACf,CAAC,qBAAqB,GACtB,CAAC,2BAA4B,yBAC7B,CAAC,4BAA6B,0BAC9B,CAAC,aAAa,GACd,CAAC,mBAAmB,GACpB,CAAC,kBAAkB,GACnB,CAAC,kBAAkB,GACnB,CAAC,qBAAqB,GACtB,CAAC,uBAAuB,GACxB,CAAC,aAAa,GACd,CAAC,kBAAkB,GACnB,CAAC,yBAA0B,KAC3B,CAAC,gBAAiB,GAClB,CAAC,oBAAqB,eACtB,CAAC,2BAA4B,KAC7B,CAAC,kCAAmC,KACpC,CAAC,kBAAmB,IACpB,CAAC,wBAAyB,IAC1B,CAAC,uBAAwB,MACzB,CAAC,eAAgB,IACjB,CAAC,eAAgB,MACjB,CAAC,gBAAiB,GAClB,CAAC,QAAQ,GACT,CAAC,wBAAwB,IAE3BC,OAAQ,CACN,CAAC,4BAA6B,0BAC9B,CAAC,wBAAyB,0BAC1B,CAAC,wBAAyB,GAC1B,CAAC,kBAAmB,oBACpB,CAAC,iBAAkB,mBACnB,CAAC,iCAAkC,0BACnC,CAAC,gCAAiC,QAClC,CAAC,uBAAwB,oBACzB,CAAC,+BAAgC,yBACjC,CAAC,+BAAgC,GACjC,CAAC,0BAA2B,GAC5B,CAAC,wBAAyB,GAC1B,CAAC,yBAA0B,GAC3B,CAAC,uBAAwB,GACzB,CAAC,oCAAqC,0BACtC,CAAC,0BAA2B,oBAC5B,CAAC,8BAA+B,UAChC,CAAC,wCAAyC,0BAC1C,CAAC,8BAA+B,oBAChC,CAAC,qCAAsC,0BACvC,CAAC,2BAA4B,oBAC7B,CAAC,2BAA4B,IAC7B,CAAC,4BAA6B,GAC9B,CAAC,kBAAmB,GACpB,CAAC,wBAAyB,IAC1B,CAAC,sBAAuB,0BACxB,CAAC,kBAAmB,0BACpB,CAAC,kBAAmB,GACpB,CAAC,YAAa,oBACd,CAAC,WAAY,mBACb,CAAC,iBAAkB,KACnB,CAAC,aAAc,IACf,CAAC,0BAA2B,KAC5B,CAAC,0BAA2B,QAC5B,CAAC,2BAA4B,0BAC7B,CAAC,iBAAkB,oBACnB,CAAC,oBAAqB,GACtB,CAAC,kBAAmB,GACpB,CAAC,mBAAoB,GACrB,CAAC,iBAAkB,GACnB,CAAC,8BAA+B,0BAChC,CAAC,oBAAqB,oBACtB,CAAC,wBAAyB,UAC1B,CAAC,YAAa,KACd,CAAC,yBAA0B,KAC3B,CAAC,iBAAkB,UACnB,CAAC,iBAAkB,GACnB,CAAC,kBAAmB,GACpB,CAAC,6BAA8B,uBAC/B,CAAC,4BAA6B,YAC9B,CAAC,8BAA+B,IAChC,CAAC,6BAA8B,GAC/B,CAAC,kCAAmC,0BACpC,CAAC,8BAA+B,0BAChC,CAAC,8BAA+B,GAChC,CAAC,qCAAsC,0BACvC,CAAC,iCAAkC,0BACnC,CAAC,iCAAkC,GACnC,CAAC,wBAAyB,uBAC1B,CAAC,uBAAwB,mBACzB,CAAC,yBAA0B,IAC3B,CAAC,sCAAuC,QACxC,CAAC,uCAAwC,0BACzC,CAAC,6BAA8B,oBAC/B,CAAC,gCAAiC,GAClC,CAAC,8BAA+B,GAChC,CAAC,+BAAgC,GACjC,CAAC,6BAA8B,GAC/B,CAAC,oCAAqC,UACtC,CAAC,sCAAuC,0BACxC,CAAC,sCAAuC,GACxC,CAAC,gCAAiC,0BAClC,CAAC,iCAAkC,GACnC,CAAC,qCAAsC,GACvC,CAAC,sCAAuC,GACxC,CAAC,oCAAqC,GACtC,CAAC,gCAAiC,IAClC,CAAC,4BAA6B,oCAC9B,CAAC,kCAAmC,OACpC,CAAC,0BAA2B,YAC5B,CAAC,+BAAgC,uBACjC,CAAC,2BAA4B,oCAC7B,CAAC,iCAAkC,KACnC,CAAC,0BAA2B,iBAC5B,CAAC,+BAAgC,cACjC,CAAC,6BAA8B,QAC/B,CAAC,uCAAwC,sBACzC,CAAC,kCAAmC,0BACpC,CAAC,wBAAyB,uBAC1B,CAAC,2BAA4B,YAC7B,CAAC,yBAA0B,YAC3B,CAAC,wBAAyB,0BAC1B,CAAC,oBAAqB,oCACtB,CAAC,0BAA2B,OAC5B,CAAC,gCAAiC,QAClC,CAAC,mBAAoB,uBACrB,CAAC,oBAAqB,WACtB,CAAC,oCAAqC,cACtC,CAAC,kCAAmC,QACpC,CAAC,oCAAqC,0BACtC,CAAC,wBAAyB,cAC1B,CAAC,sBAAuB,QACxB,CAAC,6BAA8B,0BAC/B,CAAC,wBAAyB,wBAC1B,CAAC,8BAA+B,OAChC,CAAC,wBAAyB,OAC1B,CAAC,0BAA2B,gBAC5B,CAAC,yBAA0B,aAC3B,CAAC,2BAA4B,SAC7B,CAAC,2BAA4B,QAC7B,CAAC,wBAAyB,GAC1B,CAAC,wBAAyB,GAC1B,CAAC,qBAAsB,QACvB,CAAC,qBAAsB,OACvB,CAAC,0BAA2B,IAC5B,CAAC,oBAAqB,KACtB,CAAC,4BAA6B,0BAC9B,CAAC,wBAAyB,0BAC1B,CAAC,uBAAwB,qBACzB,CAAC,aAAc,wBACf,CAAC,qBAAsB,4BACvB,CAAC,YAAa,mBACd,CAAC,2BAA4B,0BAC7B,CAAC,0BAA2B,4BAC5B,CAAC,wBAAyB,4BAC1B,CAAC,yBAA0B,4BAC3B,CAAC,wBAAyB,2BAC1B,CAAC,sBAAuB,4BACxB,CAAC,sBAAuB,2BACxB,CAAC,UAAW,gBACZ,CAAC,0BAA2B,SAC5B,CAAC,iBAAkB,oCACnB,CAAC,oBAAqB,6BACtB,CAAC,gBAAiB,SAClB,CAAC,qBAAsB,cACvB,CAAC,mBAAoB,QACrB,CAAC,sBAAuB,GACxB,CAAC,iBAAkB,KACnB,CAAC,yBAA0B,0BAC3B,CAAC,+BAAgC,0BACjC,CAAC,0BAA2B,0BAC5B,CAAC,gCAAiC,0BAClC,CAAC,oBAAqB,0BACtB,CAAC,0BAA2B,0BAC5B,CAAC,0BAA2B,GAC5B,CAAC,oBAAqB,GACtB,CAAC,sBAAuB,0BACxB,CAAC,qBAAsB,YACvB,CAAC,kBAAmB,0BACpB,CAAC,kBAAmB,GACpB,CAAC,SAAU,QACX,CAAC,YAAa,WACd,CAAC,WAAY,WACb,CAAC,iBAAkB,IACnB,CAAC,YAAa,WACd,CAAC,eAAgB,IACjB,CAAC,WAAY,WACb,CAAC,0BAA2B,IAC5B,CAAC,wBAAyB,IAC1B,CAAC,uBAAwB,cACzB,CAAC,qBAAsB,QACvB,CAAC,yBAA0B,GAC3B,CAAC,yBAA0B,yBAC3B,CAAC,4BAA6B,SAC9B,CAAC,OAAQ,WACT,CAAC,YAAa,QACd,CAAC,YAAa,QACd,CAAC,+BAAgC,sBACjC,CAAC,2BAA4B,sBAC7B,CAAC,2BAA4B,MAC7B,CAAC,gCAAiC,yBAClC,CAAC,gCAAiC,MAClC,CAAC,+BAAgC,0BACjC,CAAC,2BAA4B,0BAC7B,CAAC,2BAA4B,GAC7B,CAAC,qBAAsB,uBACvB,CAAC,oBAAqB,mBACtB,CAAC,sBAAuB,IACxB,CAAC,mCAAoC,QACrC,CAAC,oCAAqC,0BACtC,CAAC,0BAA2B,oBAC5B,CAAC,6BAA8B,GAC/B,CAAC,2BAA4B,GAC7B,CAAC,4BAA6B,GAC9B,CAAC,0BAA2B,GAC5B,CAAC,kCAAmC,GACpC,CAAC,iCAAkC,uBACnC,CAAC,uCAAwC,0BACzC,CAAC,6BAA8B,uBAC/B,CAAC,iCAAkC,UACnC,CAAC,qBAAsB,IACvB,CAAC,uBAAwB,0BACzB,CAAC,2BAA4B,0BAC7B,CAAC,uBAAwB,0BACzB,CAAC,uBAAwB,IACzB,CAAC,2BAA4B,OAC7B,CAAC,oBAAqB,0BACtB,CAAC,qBAAsB,GACvB,CAAC,sBAAuB,IACxB,CAAC,oBAAqB,GACtB,CAAC,iCAAkC,0BACnC,CAAC,6BAA8B,0BAC/B,CAAC,iBAAkB,IACnB,CAAC,6BAA8B,0BAC/B,CAAC,6BAA8B,KAC/B,CAAC,uBAAwB,yBACzB,CAAC,sBAAuB,GACxB,CAAC,sBAAuB,UACxB,CAAC,8BAA+B,yBAChC,CAAC,8BAA+B,GAChC,CAAC,uBAAwB,0BACzB,CAAC,uBAAwB,GACzB,CAAC,uBAAwB,GACzB,CAAC,iBAAkB,0BACnB,CAAC,kBAAmB,GACpB,CAAC,sBAAuB,GACxB,CAAC,uBAAwB,GACzB,CAAC,qBAAsB,GACvB,CAAC,iBAAkB,IACnB,CAAC,iBAAkB,KACnB,CAAC,QAAS,UCtTD,yBACTC,EACFC,EAAY,UACdA,EAAUC,oBAAsB,SAA2BC,GACzDA,EAAOA,EAAKC,QAAQ,SAAU,QAE5BC,EADEC,EAAI,UAERC,MAAMC,UAAUC,QAAQC,KAAKP,GAAM,SAAUQ,MACvCN,SACFA,GAAgB,OAChBC,GAAKK,EAAKC,eAGC,MAATD,EAIJL,GAAKK,EAHHN,GAAgB,KAKbC,GAETL,EAAUY,kBAAoB,SAA2BV,EAAMW,OACzDR,EAAI,UACRC,MAAMC,UAAUC,QAAQC,KAAKP,GAAM,SAAUQ,GACvCA,IAASA,EAAKC,cAIlBN,GAAKK,EAHHL,GAAK,IAAMK,EAAKI,kBAKZD,EAAO,SAAW,IAAMR,GAelCL,EAAUe,oBAAsB,SAAUC,EAA4BC,MAC/DA,EAAKC,iBAGNC,EAASC,OAAOC,iBACC,oBAAjBJ,EAAKK,QAAgCL,EAAOA,EAAKM,OACjD,MAEFC,EAAO,GACTP,EAAKQ,cAAgBN,EACrBvB,SAAS4B,IACTA,EAAOA,EAAK5B,SAASE,QAChBU,SAAQ,SAAUkB,OACjBC,EAEQ,MADZA,EAAMR,EAAOS,iBAAiB5B,EAAUY,kBAAkBc,EAAI,IAAI,OAEhEC,EAAMR,EAAOS,iBACX5B,EAAUY,kBAAkBc,EAAI,IAAI,KAG5B,KAARC,GAA6B,iBAARA,GACvBV,EAAKY,iBACHH,EAAI,GACJ3B,UAAe2B,EAAI,KACjBC,EAAIxB,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,IACxCuB,EAAI,KAEN,OAIDV,GAA8BC,EAAKa,gBACtCC,uBAAsB,WACpBd,EAAKe,QAAO,MAEdf,EAAKa,cAAc,eAAgBb,EAAKgB,UAG5ClC,EAAU,CACRmC,KAAM,SAAUC,cAELC,KAAKC,MAAMF,GAClB,MAAOG,SACD,IAAIC,MAAM,oDAGpBC,OAAQ,SAAUC,cAEPL,KAAKC,MAAMI,GAClB,MAAOH,SACD,IAAIC,MACR,gEAING,OAAQ,SAAUC,EAAQjB,OACpBkB,EAAIC,SAASF,EAAQ,WAClBG,MAAMF,GAAKlB,EAAMkB,GAE1BG,QAAS,SAAUC,SACV,QAAQC,KAAKD,IAEtBE,OAAQ,SAAUC,UACTA,IAGXnD,EAAUoD,wBAA0B,eAC9BC,EAAI,GACNC,EAAQ,CAAC,OAAQ,SAAU,QAAS,YAAa,eACnD1D,SAASyD,GACTA,EAAEzD,SAASC,WAAWW,SAAQ,SAAU+C,GACtCD,EAAME,KAAKD,EAAK,GAAGzC,kBAEdwC,GAETtD,EAAUyD,qBAAuB,gBAC1BC,WAAY,GAEnB1D,EAAU2D,kBAAoB,eACxB1C,EAAO2C,KACX3C,EAAK4C,cAAcC,UAAY,GAC/B7C,EAAK4C,cAAcE,YAAY9C,EAAKM,QACpCN,EAAKyC,WAAY,EACjB1D,EAAUgE,QAAQ/C,GAClBjB,EAAUe,qBAAoB,EAAME,GACpCA,EAAKe,QAAO,IAEdhC,EAAUiE,gBAAkB,gBACrBjC,UAEPhC,EAAUkE,yBAA2B,SAAUC,EAAUC,EAAQC,OAC3DC,EAEF5C,EADAT,EAAO2C,QAEQ,UAAbO,MAIa,SAAbA,QACoB,kCAAlBlD,EAAKsD,WACPtD,EAAKsD,SAAW,2CAElBtD,EAAKiB,KAAOmC,MAGG,WAAbF,KAIa,SAAbA,MAIa,UAAbA,GAAqC,cAAbA,OA9HNK,EAAMC,EACxBpB,KADkBmB,EAiID,aAjIOC,EAiION,EA9HnCvE,SAFIyD,EAAI,IAgIR3B,EA7HI2B,EAAEzD,SAAS4E,GAAME,QAAO,SAAUrB,UAElCA,EAAE,GAAGvC,gBAAkB2D,EAAK3D,eAC5Bd,EAAUY,kBAAkByC,EAAE,MAAQoB,EAAK3D,eAC3Cd,EAAUY,kBAAkByC,EAAE,IAAI,KAAUoB,EAAK3D,iBAElD,UAyHDwD,EAAMvE,UAAe2B,EAAI,UACzBT,EAAKpB,WAAW6B,EAAI,IAAM4C,EAAID,IAG5B,MAAMpB,KAAKkB,IACblD,EAAK0D,iBAAiB,KAAOR,EAAUS,SAAS,IAAKP,UAbrDpD,EAAK4D,KAAOR,OAJZpD,EAAKuB,OAASzC,EAAQyC,OAAO6B,QAX7BrE,EAAUe,qBAAoB,EAAOE,IAgCzCjB,EAAUgE,QAAU,SAAU/C,OACxB6D,EACC1D,OAAO2D,mBAGZ9D,EAAKF,oBAAsB,WACzBf,EAAUe,qBAAoB,EAAOE,GACrCA,EAAKe,WAQP8C,EAAW,IAAI1D,OAAO2D,kBAAiB,SAAUC,OAC3CC,EAAgBC,EACpB5E,MAAMC,UAAUC,QAAQC,KAAKuE,GAAW,SAAUG,GAEnB,UAA3BA,EAASC,eACkB,UAA3BD,EAASC,eAKsB,UAA7BD,EAASE,OAAOC,SAKlBH,EAASE,OAAOE,YACwB,UAAxCJ,EAASE,OAAOE,WAAWD,SAE3BJ,GAAa,EAIbC,EAASE,SAAWpE,IACnBkE,EAASK,WAAWC,OAAS,GAAuB,kBAAlBN,EAASO,QAE5CT,GAAiB,GAlBjBC,GAAa,KAqBbA,GACFjE,EAAKF,qBAAoB,EAAOE,GAE9BgE,IACoB,kCAAlBhE,EAAKsD,WACPtD,EAAKsD,SAAW,sCAElBtD,EAAKiB,KAAOjB,EAAK6C,eAGZE,QAAQ/C,EAAM,CACrB0E,eAAe,EACfC,WAAW,EACX/F,YAAY,EACZgG,SAAS,IAEXvF,MAAMC,UAAUC,QAAQC,KACtBqF,SAASC,iBAAiB,UAC1B,SAAUC,GACRlB,EAASd,QAAQgC,EAAI,CACnBL,eAAe,EACfC,WAAW,EACX/F,YAAY,EACZgG,SAAS,SAKV7F,ECrPM,cAAUL,OACnBsG,EAAe,GACjBC,GAAoB,EACpBC,EAAY,EACZC,EAAiB,IACjBC,EAAc,GAEdC,EAAsB,GACtBC,EAAmB,YAGZC,EAAUC,EAAKC,EAAMC,EAAMjF,GAClCiF,EAAOA,GAAQ,MAEbC,EADEvD,EAAI,OAEHuD,EAAIH,EAAKG,GAAKF,EAAME,GAAKD,EAC5BtD,EAAEuD,QAAaC,IAARnF,EAAoBkF,EAAmB,mBAARlF,EAAqBA,EAAIkF,GAAKlF,SAE/D2B,WAqCAyD,EAASC,OACZC,EACFC,EAAIF,EAAKjD,WAAaiD,EAAKG,eAC3BC,EACEF,EAAEG,WAAaL,EAAKM,SAASD,WAAaL,EAAKO,YAAYF,WAC7DR,EAAIW,KAAKC,MAAMT,EAAKH,EAAIjH,EAAK8H,kBAC7BC,EAAIH,KAAKC,MAAMT,EAAKW,EAAI/H,EAAKgI,oBAC3BhI,EAAKiI,eAAeT,GAAW,IACjCH,EAAMrH,EAAKiI,eAAeT,GAAUH,IAElCrH,EAAKiI,eAAeT,GAAUU,SAAWd,EAAKc,QAC9ClI,EAAKiI,eAAeT,GAAUW,QAAUf,EAAKe,MAIxC,KACAd,EAAIe,uBAGFpI,EAAKqI,IAAIC,UAAUjB,EAAKJ,EAAGc,GALlC/H,EAAKiI,eAAeT,QAAYN,OAQlCX,GAAoB,EAEtBc,EAAM,IAAIkB,MAAMnB,EAAKe,MAAOf,EAAKc,QACjClI,EAAKiI,eAAeT,GAAY,CAC9BH,IAAAA,EACAc,MAAOf,EAAKe,MACZD,OAAQd,EAAKc,QAEfb,EAAImB,OAAS,eAzCTC,EA0CFzI,EAAKqI,IAAIC,UAAUjB,EAAKJ,EAAGc,GA1CzBU,GAAS,EACbC,OAAOC,KAAK3I,EAAKiI,gBAAgBpH,SAAQ,SAAU+H,GAC5C5I,EAAKiI,eAAeW,GAAMvB,IAAIe,WACjCK,GAAS,MAGTA,IAAWlC,IACbA,GAAoB,EACpBvG,EAAK6I,SAqCPxB,EAAIyB,IACF,6BACAC,KACE,kDACE3B,EAAKe,MACL,aACAf,EAAKc,OAHP,qJAOEZ,EAPF,gDAsEG0B,EAAW/B,EAAGc,EAAGkB,EAAGC,EAAGC,OAG1BC,GAFJnC,GAAKjH,EAAK8H,kBAEEmB,EACVI,GAFFtB,GAAK/H,EAAKgI,iBAEAkB,EACVlJ,EAAKqI,IAAIiB,YACTtJ,EAAKqI,IAAIkB,OAAOtC,EAAIkC,EAAQpB,GAC5B/H,EAAKqI,IAAImB,OAAOJ,EAAID,EAAQpB,GAC5B/H,EAAKqI,IAAIoB,iBAAiBL,EAAGrB,EAAGqB,EAAGrB,EAAIoB,GACvCnJ,EAAKqI,IAAImB,OAAOJ,EAAGrB,EAAImB,EAAIC,GAC3BnJ,EAAKqI,IAAIoB,iBAAiBL,EAAGC,EAAGD,EAAID,EAAQE,GAC5CrJ,EAAKqI,IAAImB,OAAOvC,EAAIkC,EAAQE,GAC5BrJ,EAAKqI,IAAIoB,iBAAiBxC,EAAGoC,EAAGpC,EAAGoC,EAAIF,GACvCnJ,EAAKqI,IAAImB,OAAOvC,EAAGc,EAAIoB,GACvBnJ,EAAKqI,IAAIoB,iBAAiBxC,EAAGc,EAAGd,EAAIkC,EAAQpB,YAErC2B,EAASzC,EAAGc,EAAGkB,EAAGC,GACzBjC,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIqB,SAASzC,EAAGc,EAAGkB,EAAGC,YAEpBS,EAAW1C,EAAGc,EAAGkB,EAAGC,GAC3BjC,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIsB,WAAW1C,EAAGc,EAAGkB,EAAGC,YAEtBU,EAASC,EAAM5C,EAAGc,GACzBd,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIuB,SAASC,EAAM5C,EAAGc,YAgBpB+B,EAAeC,GAItB/J,EAAKqI,IAAIiB,YACI,IAATS,IACF/J,EAAKqI,IAAIkB,OAAOvJ,EAAKgK,sBAAuBhK,EAAKiK,oBACjDjK,EAAKqI,IAAImB,OAAOxJ,EAAKgK,sBAAuBhK,EAAKkI,QACjDlI,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAOnI,EAAKiK,qBAEtB,IAATF,IACF/J,EAAKqI,IAAIkB,OAAO,EAAGvJ,EAAKiK,oBACxBjK,EAAKqI,IAAImB,OAAO,EAAGxJ,EAAKkI,QACxBlI,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAOnI,EAAKiK,qBAEtB,IAATF,IACF/J,EAAKqI,IAAIkB,OAAOvJ,EAAKgK,sBAAuB,GAC5ChK,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAO,GAC5BnI,EAAKqI,IAAImB,OAAOxJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAImB,OAAOxJ,EAAKgK,sBAAuBhK,EAAKkI,SAEnDlI,EAAKqI,IAAI6B,gBAEFC,EAAWlD,EAAGc,EAAGqB,MACe,WAAnCpJ,EAAKsC,MAAM8H,oCAxCGnD,EAAGc,EAAGqB,GACxBnC,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIiB,YACTtJ,EAAKqI,IAAIgC,IAAIpD,EAAGc,EAAGqB,EAAG,EAAG,EAAIxB,KAAK0C,IAClCtK,EAAKqI,IAAIkC,OAoCAC,CAAWvD,EAAGc,EAAO,GAAJqB,GAE1BM,EAASzC,EAAQ,GAAJmC,EAASrB,EAAQ,GAAJqB,EAASA,EAAGA,YAE/BqB,EAAaxD,EAAGc,EAAGqB,MACa,WAAnCpJ,EAAKsC,MAAM8H,oCAvCKnD,EAAGc,EAAGqB,GAC1BnC,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIiB,YACTtJ,EAAKqI,IAAIgC,IAAIpD,EAAGc,EAAGqB,EAAG,EAAG,EAAIxB,KAAK0C,IAClCtK,EAAKqI,IAAIqC,SAmCAC,CAAa1D,EAAGc,EAAO,GAAJqB,GAE5BO,EAAW1C,EAAQ,GAAJmC,EAASrB,EAAQ,GAAJqB,EAASA,EAAGA,YAwBjCwB,EAAcC,EAAGC,GACxB9K,EAAKqI,IAAIiB,YACD,CACNyB,EAAG,WACD/K,EAAKqI,IAAIkB,OACPsB,EAAE5D,EAAIjH,EAAK8H,iBACX+C,EAAE9C,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAImB,OACPqB,EAAE5D,EAAIjH,EAAK8H,iBAAmB+C,EAAE1C,MAChC0C,EAAE9C,EAAI/H,EAAKgI,kBAGfoB,EAAG,WACDpJ,EAAKqI,IAAIkB,OACPsB,EAAE5D,EAAIjH,EAAK8H,iBAAmB+C,EAAE1C,MAChC0C,EAAE9C,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAImB,OACPqB,EAAE5D,EAAIjH,EAAK8H,iBAAmB+C,EAAE1C,MAChC0C,EAAE9C,EAAI/H,EAAKgI,gBAAkB6C,EAAE3C,SAGnCmB,EAAG,WACDrJ,EAAKqI,IAAIkB,OACPsB,EAAE5D,EAAIjH,EAAK8H,iBACX+C,EAAE9C,EAAI/H,EAAKgI,gBAAkB6C,EAAE3C,QAEjClI,EAAKqI,IAAImB,OACPqB,EAAE5D,EAAIjH,EAAK8H,iBAAmB+C,EAAE1C,MAChC0C,EAAE9C,EAAI/H,EAAKgI,gBAAkB6C,EAAE3C,SAGnC8C,EAAG,WACDhL,EAAKqI,IAAIkB,OACPsB,EAAE5D,EAAIjH,EAAK8H,iBACX+C,EAAE9C,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAImB,OACPqB,EAAE5D,EAAIjH,EAAK8H,iBACX+C,EAAE9C,EAAI/H,EAAKgI,gBAAkB6C,EAAE3C,UAInC4C,KACF9K,EAAKqI,IAAIqC,SA9SX1K,EAAKiI,eAAiB,GAqhBtBjI,EAAK6I,KAAO,SAAUoC,OAChBjL,EAAKmC,cAAc,aAAc,MAGhCnC,EAAKkL,aAAiBlL,EAAKkI,QAAWlI,EAAKmI,UAG5CnI,EAAKkL,aAAeD,EACtB7I,sBAAsBpC,EAAKmL,WAAWtC,eAGd,IAAtB7I,EAAKsB,KAAK8J,aAIVC,EAEF3K,EACA4K,EACAC,EACAC,EACAC,EACAC,EACAC,EACA5D,EACAd,EACA4D,EACA3B,EACAD,EACApG,EACA6E,EACAkE,EACAC,EA2kCIC,EACFC,EACAC,EAEAC,EA3jCEC,EACFC,EACAC,EA6uCEC,EAlwCJC,EAAWtM,EAAKsM,UAAY,GAC5BC,EAAuC,aAAlCvM,EAAKsC,MAAMkK,mBAChBC,EAAmB,GACnBC,EAAc,GACdC,EAAmB,GACnBC,EAAa,GACb5B,EAAIsB,EAASxG,OACb+G,EAAI7M,EAAK8M,aAAe,GACxBC,EAAyB/M,EAAKgN,4BAC9BC,EAAqBjN,EAAKkN,wBAC1BC,EAAanN,EAAKsC,MAAM6K,WAC1B3G,GAAa,EACb9F,EAAI0M,YAAYC,MAChBrN,EAAKsN,kBAAoB,GAErBhB,EAASxG,OAAS9F,EAAKuN,OAAOC,KAAK1H,QACrC9F,EAAKyN,kBA+0CPzN,EAAKqI,IAAIqF,OA7jBP1N,EAAK2N,YAAc,GACnB9K,EAAS7C,EAAK4N,YACd5N,EAAK6N,aAAe,GACpB7N,EAAKgI,gBAAkBhI,EAAKkL,YAAclL,EAAK4F,WAAWkI,UAAY,GACtE9N,EAAK8H,iBAAmB9H,EAAKkL,YACzBlL,EAAK4F,WAAWmI,YACf,GACL7E,EAAIlJ,EAAKkI,OAITc,EAAW,EAAG,EAHdC,EAAIjJ,EAAKmI,MAGWe,EAAG,GACvBlJ,EAAKqI,IAAI6B,OACTlK,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM2L,oBAChCvE,EAAS,EAAG,EAAGT,EAAGC,kBAIhBgF,EAAKtG,KAAKuG,IAAI7B,EAASxG,OAAQ9F,EAAKoO,eACtCnH,GACGjH,EAAKqO,UAAUC,WAChBtO,EAAKuO,gBACLvO,EAAKsC,MAAMkM,gBACbzG,EAAIgF,EACCrF,EAAW,EAAGA,EAAWwG,GAEvBO,GADWzO,EAAKuN,OAAOC,KAAK9F,GACLA,GAFIA,GAAY,GAM1C1H,EAAKE,WAAWwO,oBAGlB3G,GACE/H,EAAKsC,MAAMqM,wBACX3O,EAAKsC,MAAMsM,kBACX,aAEJ5O,EAAKiK,mBAAqBlC,EA0hB5B8G,cAvhBE7O,EAAKqI,IAAIqF,OACL1N,EAAKoO,UAAY,IACnBpF,EACE,EACAhJ,EAAKiK,mBACLjK,EAAKmI,MACLnI,EAAKkI,OAASlI,EAAKiK,mBACnB,GAEFjK,EAAKqI,IAAI6B,YAEP4E,EACFC,EACAC,EACAC,EAAIpM,EAAOiD,WACbmB,GACGjH,EAAKqO,UAAUC,WAChBtO,EAAKuO,gBACLvO,EAAKsC,MAAMkM,gBACRxO,EAAKE,WAAWgP,YACnBnH,IACG/H,EAAKqO,UAAUc,UAChBnP,EAAKoP,eACLpP,EAAKsC,MAAMkM,iBAGb9G,EAAW1H,EAAKoO,UAAYpO,EAAKqP,eACjC3H,EAAWsD,IAGX+D,EAAgB/O,EAAKuN,OAAOC,KAAK9F,GACjC1H,EAAKsP,kBAAoB5H,EACzB1H,EAAKuP,kBAAoBxH,EACpB0G,GAAQM,EAAerH,IAL5BA,GAAY,MASV1H,EAAKE,WAAWsP,WAAY,KAC1BxP,EAAKE,WAAWuP,iBAClBxI,GAAKgG,GAEPvB,EAAYyB,EAAanN,EAAKsC,MAAM6K,WACpC1B,GAAU,EAERqD,EAAmB9O,EAAK0P,gBACxBZ,EAAmBG,IAGnBD,EAAchP,EAAKuN,OAAOoC,QAAQb,MAClC7H,GAAK2I,GAAS5P,EAAK6P,OAAQvD,EAASxG,OAAQwG,EAASxG,OAAhD8J,CACH/M,EAAOmM,GACPA,EACAF,IAEM9O,EAAKmI,MAAQnI,EAAKqO,UAAUC,aARpCQ,GAAoB,GAYtBlC,EAAW/I,KAAK,CACd7D,EAAK6P,OACLvD,EAASxG,OACTwG,EAASxG,OACTiC,EACA2D,IAGJ1L,EAAKqI,IAAIyH,UAsdXC,iBAzTOlE,GAGL7L,EAAKqI,IAAIqF,WACLsC,EACAhQ,EAAKiQ,WAAWtI,YAAc,EAAI3H,EAAKkQ,cACvClQ,EAAKiQ,WAAWvI,SAAW,EAAI1H,EAAKoO,UAKxCpF,EAJQgH,EAAKhQ,EAAKgK,sBAAwB,EAClCgG,EAAKhQ,EAAKiK,mBAAqB,EAC/B+F,EAAKhQ,EAAKmI,MAAQnI,EAAKgK,sBAAwBhK,EAAKmI,MACpD6H,EAAKhQ,EAAKkI,OAASlI,EAAKiK,mBAAqBjK,EAAKkI,OAC3B,GAC/BlI,EAAKqI,IAAI6B,OAC6B,QAAlClK,EAAKE,WAAWiQ,cACdnQ,EAAKiQ,YAAcjQ,EAAKiQ,WAAWvI,WAAamE,EAAMnE,WACxD1H,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAM+N,6BAChCrQ,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMiO,6BAClC5G,EACE,EACAkC,EAAM9D,EACN/H,EAAKwQ,iBAAmBvD,EACxBjN,EAAKsN,kBAAkBzB,EAAMnE,aAIjC1H,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAM+N,6BAChCrQ,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMiO,6BAClC5G,EAAWkC,EAAM5E,EAAG4E,EAAM9D,EAAG8D,EAAM1D,MAAO0D,EAAM3D,SAElDlI,EAAKqI,IAAIyH,WA6RXW,kBA5wBMpE,EAEF3I,EACAgN,EACAC,EACAC,EACAC,EALA5B,EAAIpM,EAAOiD,gBAMJgL,EAAsBC,EAAOC,OACpCA,EAAMpJ,KAAKuG,IAAI6C,EAAK/B,GACfyB,EAAIK,EAAOL,EAAIM,IAClBtN,EAAI1D,EAAKuN,OAAOoC,QAAQe,IACxBE,EAAS/N,EAAOa,IACJuN,SACV5E,EAAI,CACF6E,MAAON,EAAOM,MACdhM,KAAM0L,EAAO1L,KACbiD,MAAOyI,EAAOzI,OAASnI,EAAKsC,MAAM6O,UAClC7O,MAAO,mBACPyD,KAAM,SACNqL,MAAOV,EACPW,MAAO3N,GAETiN,EAAmB,CACjBA,iBAAkBC,EAAOM,OAASN,EAAO1L,SAE3C+B,GAAK2I,GAASe,GAAmB,GAAI,EAAhCf,CAAmCvD,EAAG3I,EAAGgN,IACtC1Q,EAAKmI,MAAQnI,EAAKqO,UAAUC,cAjBfoC,GAAK,IAuBhC9D,EAAW/L,SAAQ,SAAUyQ,EAAOC,GAClCxJ,EAAIuJ,EAAM,GACVnE,EAAamE,EAAM,GACfC,IAAYvR,EAAKoO,YACnBpO,EAAKqI,IAAIqF,OACT1E,EACE,EACAhJ,EAAKiK,mBACLjK,EAAKmI,MACLnI,EAAKkI,OAASlI,EAAKiK,mBACnB,GAEFjK,EAAKqI,IAAI6B,iBAjFQ0B,EAASlE,EAAUqH,MACpC/O,EAAKE,WAAWuP,eAAgB,CAClCxI,EAAI,MAMEuK,EACJxR,EAAKsM,UAAY5E,EAAW1H,EAAKsM,SAASxG,OACtC9F,EAAKyR,iCAAiC/J,GAAY,EAClD1H,EAAK0R,aACL1R,EAAK0R,aAAa5L,OAAS,EAC3BiJ,EAAgB,EAEhB4C,EAAiB3R,EAAK4R,mBACxBJ,EACA9J,EAAW,EAETmK,EAAgB,CAAEA,cAAeF,GACjCG,EAAoB,CACxB5M,KAAM,gBACNiD,MAAOnI,EAAK+R,MAAMpC,SAAS,IAAM3P,EAAKsC,MAAM2K,mBAC5C3K,MAAO,gBACPyD,KAAM,SACNxD,KAAMoP,EACNP,OAAQ,GAEV3F,EAAUzL,EAAKgS,aAAatK,GAC5BkI,GAASiC,EAAe9C,EAAerH,EAAvCkI,CACEkC,GACC,GACA,IAmDHG,CAAcX,EAAM,GAAIA,EAAM,GAAIA,EAAM,OAE1CtR,EAAKqI,IAAIyH,UACL9P,EAAKE,WAAWgS,oBAClBjL,GACGjH,EAAKqO,UAAUC,WAChBtO,EAAKuO,gBACLvO,EAAKsC,MAAM6P,4BACTnS,EAAKE,WAAWuP,iBAClBxI,GAAKgG,GAEPlF,EAAI,EAEJoF,EAAanN,EAAKgN,4BAClB8D,EAAsB9Q,EAAK0P,gBAAiBT,GAC5C4B,EAAuB5J,EACvBA,EAAIjH,EAAKsC,MAAM6P,4BACXnS,EAAKE,WAAWuP,iBAClBxI,GAAKgG,GAEP6D,EAAsB,EAAG9Q,EAAKkQ,eAE9BjJ,EAAI4J,GACI5H,IACN4B,EAAI,CACF3F,KAAM,GACNiD,MAAOnI,EAAKsC,MAAM8P,eAClB9P,MAAO,sBACP+P,oBAAoB,EACpBC,uBAAuB,EACvBvM,KAAM,SACNqL,MAAOvO,EAAOiD,QAEhB8J,GAAS,CAAE2C,OAAQ,KAAO,GAAI,EAA9B3C,CAAiC/E,GAAI,GAAI,IAGvC7K,EAAKE,WAAWuP,iBAClB9D,EAAa,CAAEA,WAAY,IAC3B1E,EAAI,EACJ4D,EAAI,CACF3F,KAAM,aACNiD,MAAOnI,EAAKsC,MAAM2K,mBAClB3K,MAAO,aACPyD,KAAM,SACNqL,OAAQ,GAEVxB,GAASjE,GAAa,GAAI,EAA1BiE,CAA6B/E,GAAI,GAAI,KAirB3C2H,GA3RM1G,EAAK9L,EAAKiK,mBAAqBjK,EAAKsC,MAAMsM,kBAC5C7C,EAAK/L,EAAKgK,sBAAwBhK,EAAKsC,MAAMqM,wBAC7C3C,EACEhM,EAAK8M,aAA0C,sBAA3B9M,EAAK8M,YAAYxK,MACvC2J,EACEjM,EAAK8M,aAA0C,yBAA3B9M,EAAK8M,YAAYxK,MACzCtC,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMqM,wBAC5B3O,EAAKE,WAAWuS,uBAClBzS,EAAKqI,IAAI2F,UAAY/B,EACjBjM,EAAKsC,MAAMoQ,uBACX1S,EAAKsC,MAAMqQ,kBACf3S,EAAKqI,IAAIiI,YAAcrE,EACnBjM,EAAKsC,MAAMsQ,6BACX5S,EAAKsC,MAAMuQ,wBACfnJ,EAASqC,EAAI,EAAG/L,EAAKsC,MAAMsM,kBAAmB5O,EAAKkI,QACnDyB,EAAWoC,EAAI,EAAG/L,EAAKsC,MAAMsM,kBAAmB5O,EAAKkI,QACrDlI,EAAK6N,aAAaiF,QAAQ,CACxB7L,EAAG8E,EACHhE,EAAG,EACHG,OAAQlI,EAAKkI,OACbC,MACEnI,EAAKsC,MAAMsM,kBAAoB5O,EAAKsC,MAAMqM,wBAC5CrM,MAAO,0BAGPtC,EAAKE,WAAWwO,oBAClB1O,EAAKqI,IAAI2F,UAAYhC,EACjBhM,EAAKsC,MAAMoQ,uBACX1S,EAAKsC,MAAMqQ,kBACf3S,EAAKqI,IAAIiI,YAActE,EACnBhM,EAAKsC,MAAMsQ,6BACX5S,EAAKsC,MAAMuQ,wBACfnJ,EAAS,EAAGoC,EAAI9L,EAAKmI,MAAOnI,EAAKsC,MAAMsM,mBACvCjF,EAAW,EAAGmC,EAAI9L,EAAKmI,MAAOnI,EAAKsC,MAAMsM,mBACzC5O,EAAK6N,aAAaiF,QAAQ,CACxB7L,EAAG,EACHc,EAAG+D,EACH5D,OACElI,EAAKsC,MAAMsM,kBAAoB5O,EAAKsC,MAAMqM,wBAC5CxG,MAAOnI,EAAKmI,MACZ7F,MAAO,uBAGPtC,EAAK+S,uBACP/S,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM0Q,wBAChChT,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAM2Q,8BACZ,yBAAlBjT,EAAKkT,UACPxJ,EACE1J,EAAK+S,qBAAqB9L,EAC1B,EACAjH,EAAKsC,MAAMsM,kBACX5O,EAAKkI,QAEPyB,EACE3J,EAAK+S,qBAAqB9L,EAC1B,EACAjH,EAAKsC,MAAMsM,kBACX5O,EAAKkI,UAGPwB,EACE,EACA1J,EAAK+S,qBAAqBhL,EAC1B/H,EAAKmI,MACLnI,EAAKsC,MAAMsM,mBAEbjF,EACE,EACA3J,EAAK+S,qBAAqBhL,EAC1B/H,EAAKmI,MACLnI,EAAKsC,MAAMsM,sBA5Hb5O,EAAKmT,QAAUnT,EAAKE,WAAWkT,wBACjCpT,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAM+Q,2BAChCrT,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMgR,2BAClCtT,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMiR,qBAChC5G,EAAiB9L,SAAQ,SAAUgK,aAn2CbA,EAAGC,OACzB0I,EAAKxT,EAAKsC,MAAMmR,qBACd,CACFC,GAAI,WACFvJ,EAAWU,EAAE5D,EAAI4D,EAAE1C,MAAO0C,EAAE9C,EAAGyL,GAC/B/I,EAAaI,EAAE5D,EAAI4D,EAAE1C,MAAO0C,EAAE9C,EAAGyL,IAEnCG,GAAI,WACFxJ,EAAWU,EAAE5D,EAAI4D,EAAE1C,MAAO0C,EAAE9C,EAAI8C,EAAE3C,OAAQsL,GAC1C/I,EAAaI,EAAE5D,EAAI4D,EAAE1C,MAAO0C,EAAE9C,EAAI8C,EAAE3C,OAAQsL,IAE9CI,GAAI,WACFzJ,EAAWU,EAAE5D,EAAG4D,EAAE9C,EAAGyL,GACrB/I,EAAaI,EAAE5D,EAAG4D,EAAE9C,EAAGyL,IAEzBK,GAAI,WACF1J,EAAWU,EAAE5D,EAAG4D,EAAE9C,EAAI8C,EAAE3C,OAAQsL,GAChC/I,EAAaI,EAAE5D,EAAG4D,EAAE9C,EAAI8C,EAAE3C,OAAQsL,MAGtC1I,KAg1CIgJ,CAAmBjJ,EAAE,GAAIA,EAAE,QACvBkJ,EAAK/T,EAAKE,WAAW8T,sBAAwB,EAC/CC,EACEpJ,EAAE,GAAG5D,GAAc,OAAT4D,EAAE,IAAwB,OAATA,EAAE,GAAc,EAAIA,EAAE,GAAG1C,OAAS4L,EAC/DG,EACErJ,EAAE,GAAG9C,GAAc,OAAT8C,EAAE,IAAwB,OAATA,EAAE,GAAcA,EAAE,GAAG3C,OAAS,GAAK6L,EAClE/T,EAAK6N,aAAaiF,QAAQ,CACxB7L,EAAGgN,EACHlM,EAAGmM,EACHhM,OAAQlI,EAAKsC,MAAMmR,oBAAsBM,EACzC5L,MAAOnI,EAAKsC,MAAMmR,oBAAsBM,EACxCzR,MAAO,oBAAsBuI,EAAE,uBAxIhC7K,EAAKmU,mBAGN9K,EAAI,CACJnB,OAAQlI,EAAKmU,cAAcjM,OAC3BC,MAAOnI,EAAKmU,cAAchM,MAC1BlB,EAAGjH,EAAKmU,cAAclN,EAAIjH,EAAKmU,cAAcC,WAAWnN,EACxDc,EAAG/H,EAAKmU,cAAcpM,EAAI/H,EAAKmU,cAAcC,WAAWrM,GAE1DqE,EAAI,CACFjE,MAAOc,EACPf,OAAQgB,EACRjC,EAAG,EACHc,EAAG,GAEP/H,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM+R,6BAChCrU,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMgS,yBAChCtU,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMiS,yBACZ,gBAAlBvU,EAAKkT,UACP7J,EAAElB,MAAQc,EACVI,EAAEpC,EAAI,EACNmF,EAAEjE,MAAQc,EACVmD,EAAElE,OAASlI,EAAK8M,YAAY5E,OAC5BkE,EAAErE,EAAI/H,EAAK8M,YAAY/E,EACvB2B,EAASL,EAAEpC,EAAGoC,EAAEtB,EAAGsB,EAAElB,MAAOkB,EAAEnB,QAC9ByB,EAAWN,EAAEpC,EAAGoC,EAAEtB,EAAGsB,EAAElB,MAAOkB,EAAEnB,QAChClI,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMkS,8BAChCxU,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMmS,8BAEhCzU,EAAK8M,YAAYpF,WAAa1H,EAAKmU,cAAczM,UACjD1H,EAAK8M,YAAYpF,UAAY,GAC7B1H,EAAK8M,YAAYpF,SAAWsD,GAE5BJ,EACEwB,EACApM,EAAK0U,cAAcC,aAAe3U,EAAKmU,cAAcQ,aACjD,IACA,MAGmB,mBAAlB3U,EAAKkT,UAAiClT,EAAKmU,gBACpD9K,EAAEnB,OAASgB,EACXG,EAAEtB,EAAI,EACNqE,EAAElE,OAASgB,EACXkD,EAAEjE,MAAQnI,EAAK8M,YAAY3E,MAC3BiE,EAAErE,EAAI,EACNqE,EAAEnF,EAAIjH,EAAK8M,YAAY7F,EACvByC,EAASL,EAAEpC,EAAGoC,EAAEtB,EAAGsB,EAAElB,MAAOkB,EAAEnB,QAC9ByB,EAAWN,EAAEpC,EAAGoC,EAAEtB,EAAGsB,EAAElB,MAAOkB,EAAEnB,QAChClI,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMkS,8BAChCxU,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMmS,8BAEhCzU,EAAK8M,YAAY8H,kBACf5U,EAAKmU,cAAcS,iBACrB5U,EAAK8M,YAAY8H,iBAAmB,GACpC5U,EAAK8M,YAAY8H,gBAAkB/R,EAAOiD,QAE1C8E,EACEwB,EACApM,EAAK0U,cAAc/M,YAAc3H,EAAKmU,cAAcxM,YAChD,IACA,OA+YZkN,GAxdO7U,EAAK8U,kBAGV9U,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMyS,uBAChC/U,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAM0S,uBAClChV,EAAKqI,IAAI4M,YAAYjV,EAAKsC,MAAM4S,2BAChCxI,EAAY7L,SAAQ,SAAUgK,GAC5BD,EAAcC,EAAE,GAAIA,EAAE,OAExB7K,EAAKqI,IAAI4M,YAAY,KAsErBjV,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAM6S,gBAChCnV,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAM8S,gBAClCzL,EAAW,EAAG,EAAG3J,EAAKmI,MAAOnI,EAAKkI,4BAKzBmN,EAAIxK,GACXD,EAAcC,EAAE,GAAIA,EAAE,IAHxB7K,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMgT,4BAChCtV,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMiT,4BAIlC9I,EACG1H,QAAO,SAAU8F,UAEdA,EAAE,GAAGnD,SAAW1H,EAAKoO,WACrBvD,EAAE,GAAGlD,YAAc3H,EAAKkQ,gBAG3BrP,QAAQwU,GACXrV,EAAKqI,IAAIqF,OACT5D,EAAe,GACf2C,EACG1H,QAAO,SAAU8F,UAEdA,EAAE,GAAGnD,UAAY1H,EAAKoO,WACtBvD,EAAE,GAAGlD,aAAe3H,EAAKkQ,gBAG5BrP,QAAQwU,GACXrV,EAAKqI,IAAIyH,UACT9P,EAAKqI,IAAIqF,OACT5D,EAAe,GACf2C,EACG1H,QAAO,SAAU8F,UAEdA,EAAE,GAAGnD,UAAY1H,EAAKoO,WACtBvD,EAAE,GAAGlD,YAAc3H,EAAKkQ,gBAG3BrP,QAAQwU,GACXrV,EAAKqI,IAAIyH,UACT9P,EAAKqI,IAAIqF,OACT5D,EAAe,GACf2C,EACG1H,QAAO,SAAU8F,UAEdA,EAAE,GAAGnD,SAAW1H,EAAKoO,WACrBvD,EAAE,GAAGlD,aAAe3H,EAAKkQ,gBAG5BrP,QAAQwU,GACXrV,EAAKqI,IAAIyH,UA0VX0F,GAv1CIrJ,EAAKnM,EAAKqO,UAAUoH,SACpBrJ,EAAoC,EAAhCpM,EAAKsC,MAAMoT,mBACjB1V,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMqT,qBAClC3V,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMsT,qBAChCzJ,EAAG0J,cAAc5O,EACfgG,EACAjN,EAAKsC,MAAMoT,oBACVvJ,EAAG2J,cAAc3N,MAAQnI,EAAKqO,UAAU0H,iBACtC/V,EAAKqO,UAAUC,WAAatO,EAAKqO,UAAU2H,aAChD7J,EAAG8J,YAAYlO,EACbgF,EACA/M,EAAKsC,MAAMoT,oBACVvJ,EAAG+J,YAAYhO,OAASlI,EAAKqO,UAAU8H,kBACrCnW,EAAKqO,UAAUc,UAAYnP,EAAKqO,UAAU+H,cAC3CpW,EAAKqO,UAAUgI,uBACjBrW,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMgU,yBAChC5M,EACEyC,EAAG2J,cAAc7O,EACjBkF,EAAG2J,cAAc/N,EACjBoE,EAAG2J,cAAc3N,MAAQiE,EACzBD,EAAG2J,cAAc5N,QAEnByB,EACEwC,EAAG2J,cAAc7O,EACjBkF,EAAG2J,cAAc/N,EACjBoE,EAAG2J,cAAc3N,MAAQiE,EACzBD,EAAG2J,cAAc5N,QAEnBlI,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMiU,kBAC5BvW,EAAKqO,UAAUmI,uBACb,aAAalT,KAAKuJ,EAAE4J,WACtBzW,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMoU,sBAElC1N,EACEmD,EAAG0J,cAAc5O,EACjBkF,EAAG0J,cAAc9N,EACjBoE,EAAG0J,cAAc1N,MACjBgE,EAAG0J,cAAc3N,OACjBlI,EAAKsC,MAAMqU,0BAEb3W,EAAKqI,IAAIqC,SACT1K,EAAKqI,IAAIkC,QAEX2B,GAAa,EACblM,EAAK6N,aAAaiF,QAAQ3G,EAAG2J,eAC7B9V,EAAK6N,aAAaiF,QAAQ3G,EAAG0J,gBAE3B7V,EAAKqO,UAAUuI,qBACjB5W,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMgU,yBAChC5M,EACEyC,EAAG+J,YAAYjP,EACfkF,EAAG+J,YAAYnO,EACfoE,EAAG+J,YAAY/N,MACfgE,EAAG+J,YAAYhO,OAASkE,GAE1BzC,EACEwC,EAAG+J,YAAYjP,EACfkF,EAAG+J,YAAYnO,EACfoE,EAAG+J,YAAY/N,MACfgE,EAAG+J,YAAYhO,OAASkE,GAEtBpM,EAAKqO,UAAUwI,qBACjB7W,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMiU,kBAC5B,WAAWjT,KAAKuJ,EAAE4J,WACpBzW,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMoU,sBAElC1N,EACEmD,EAAG8J,YAAYhP,EACfkF,EAAG8J,YAAYlO,EACfoE,EAAG8J,YAAY9N,MACfgE,EAAG8J,YAAY/N,OACflI,EAAKsC,MAAMqU,0BAEb3W,EAAKqI,IAAIqC,SACT1K,EAAKqI,IAAIkC,QAEX2B,GAAa,EACblM,EAAK6N,aAAaiF,QAAQ3G,EAAG+J,aAC7BlW,EAAK6N,aAAaiF,QAAQ3G,EAAG8J,cAE3B/J,IAEFlM,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMwU,2BAClC9W,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMyU,+BAChC/N,EACEmD,EAAG6K,OAAO/P,EACVkF,EAAG6K,OAAOjP,EACVoE,EAAG6K,OAAO7O,MACVgE,EAAG6K,OAAO9O,OACV,GAEFlI,EAAKqI,IAAIqC,SACT1K,EAAKqI,IAAIkC,OACTvK,EAAK6N,aAAaiF,QAAQ3G,EAAG6K,SA4vC7B3L,GACFrL,EAAKqC,QAAO,GA7GZrC,EAAKqI,IAAIqF,QAEL1N,EAAKE,WAAW+W,iBAAmBjX,EAAKE,WAAWgX,SACzB,IAAxB5Q,EAAaR,SACfQ,EAAeO,EAAU,EAAGJ,EAAgB,EAAG,IAEjDH,EAAa6Q,MACb7Q,EAAawM,QAAQ1F,YAAYC,MAAQ3M,IAEtCV,EAAKE,WAAWgX,OAIrBlX,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAM+U,WAC3BhL,EAAI,IACFiL,MACAhR,EAAaiR,QAAO,SAAUC,EAAGnO,UACxBmO,EAAInO,IACV,GAAKzB,KAAKuG,IAAI3H,EAAWF,EAAaR,SACzC2R,QAAQ,GACVpL,EAAEqL,UAAYpR,EAAa,GAAGmR,QAAQ,GACtCpL,EAAEsL,sCA71CA1O,EAAI,EACN2O,EAAI5X,EAAK4N,YACT3G,EAAI,EACJhE,EAAI2E,KAAKuG,IAAInO,EAAKkQ,aAAc0H,EAAE9R,QAG7BmB,EAAIhE,GACA2U,EAAE3Q,GACAgK,SAGThI,GAAKjJ,EAAK6X,eAAe5Q,IAE3BA,GAAK,SAEAgC,EA80CkB6O,GACvBzL,EAAE0L,WAAarP,OAAOC,KAAK3I,EAAKiI,gBAAgBnC,OAChDuG,EAAE8H,cACA,OACCnU,EAAKmU,eAAiB,CAAExM,YAAa,IAAKA,YAC3C,SACC3H,EAAKmU,eAAiB,CAAEzM,SAAU,IAAKA,SAC1C2E,EAAEqI,cACA,OACC1U,EAAK0U,eAAiB,CAAE/M,YAAa,IAAKA,YAC3C,SACC3H,EAAK0U,eAAiB,CAAEhN,SAAU,IAAKA,SAC1C2E,EAAE2L,MAAQhY,EAAKgY,MACf3L,EAAE4L,WAAajY,EAAKiY,WACpB5L,EAAE6L,WAAalY,EAAKkY,WACpB7L,EAAE8L,eAAiBnY,EAAKmY,eACxB9L,EAAE+L,YAAcpY,EAAKoY,YACrB/L,EAAEgM,QACA,QACCrY,EAAKsY,eAAiB,CAAEvQ,EAAG,IAAKA,EACjC,SACC/H,EAAKuY,gBAAkB,CAAExQ,EAAG,IAAKA,EACpCsE,EAAEgC,UAAYrO,EAAKqO,UAAU5G,WAC7B4E,EAAEmM,YACA,MAAQxY,EAAK0P,gBAAkB,QAAU1P,EAAKqP,eAChDhD,EAAEoM,YACA,MAAQzY,EAAKuO,gBAAkB,QAAUvO,EAAKoP,eAChD/C,EAAEqM,aACA,MAAQ1Y,EAAK8H,iBAAmB,QAAU9H,EAAKgI,gBACjDqE,EAAEsM,WAAa,MAAQ3Y,EAAK2Y,WAAW1R,EAAI,QAAUjH,EAAK2Y,WAAW5Q,EACrEsE,EAAEuM,eACA,MAAQ5Y,EAAK4Y,eAAe3R,EAAI,QAAUjH,EAAK4Y,eAAe7Q,EAChEsE,EAAEwM,gBACA,MAAQ7Y,EAAK6Y,gBAAgB5R,EAAI,QAAUjH,EAAK6Y,gBAAgB9Q,EAClEsE,EAAEyM,SAAW,MAAQ9Y,EAAK+Y,KAAO,QAAU/Y,EAAKgZ,KAChD3M,EAAE4M,UAAY,MAAQjZ,EAAKkZ,MAAQ,QAAUlZ,EAAKmZ,MAClD9M,EAAE+M,cAAgBpZ,EAAKoZ,cACvB/M,EAAEgN,oBAAsBrZ,EAAKqZ,oBACzBrZ,EAAKqZ,oBAAoBpS,EAAI,KAAOjH,EAAKqZ,oBAAoBtR,EAC7D,GACJsE,EAAEiN,KAAO,MAAQtZ,EAAKmI,MAAQ,QAAUnI,EAAKkI,OAC7CmE,EAAEkN,MAAQ,MAAQvZ,EAAKuZ,MAAMtS,EAAI,QAAUjH,EAAKuZ,MAAMxR,EACtDsE,EAAEmN,MAASxZ,EAAKyZ,WAEZ,MAAQzZ,EAAKyZ,WAAWxS,EAAI,QAAUjH,EAAKyZ,WAAW1R,EADtD,GAEJsE,EAAEoJ,SAAWzV,EAAK6N,aAAa/H,OAC/BuG,EAAEqN,SAAW1Z,EAAK0Z,SAClBrN,EAAE6G,SAAWlT,EAAKkT,SACdlT,EAAK8M,cACPT,EAAE1E,YAAc3H,EAAK8M,YAAYnF,YACjC0E,EAAE3E,SAAW1H,EAAK8M,YAAYpF,SAC9B2E,EAAEuI,gBAAkB5U,EAAK8M,YAAY8H,gBACrCvI,EAAEsI,aAAe3U,EAAK8M,YAAY6H,aAClCtI,EAAEoK,QAAUzW,EAAK8M,YAAY2J,QAC7BpK,EAAEsN,YAAc3Z,EAAK8M,YAAY6M,YACjCtN,EAAE/J,MAAQtC,EAAK8M,YAAYxK,MAC3B+J,EAAEtG,KAAO/F,EAAK8M,YAAY/G,MAE5B/F,EAAKqI,IAAIuR,UAAY,QACrB5Z,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMuX,qBAChCnQ,EAAS,EAAG,EAAG1J,EAAKmI,MAAOnI,EAAKkI,QAChCQ,OAAOC,KAAK0D,GAAGxL,SAAQ,SAAUiZ,EAAK1I,OAChChF,EAAI0N,EAAM,KAAOzN,EAAEyN,GAEvB9Z,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMyX,WAChCnQ,EACEwC,EACAnD,EAAI,IACHjJ,EAAKE,WAAW+W,gBAAkB,IAAM,IALpC,GAK0C7F,MAGnDpR,EAAKqI,IAAIyH,WAlFP9P,EAAKqI,IAAIyH,wBArHN9P,EAAKE,WAAW+W,qBAInB+C,EACEha,EAAKmI,MAFA,IAILnI,EAAKsC,MAAM8P,eACuB,EAAlCpS,EAAKsC,MAAMsT,qBACbqE,EAAKlN,EAE4B,IAA/BpG,EAAoBb,SACtBa,EAAsBE,EAAU,EAAGJ,EAAgB,GAAG,iBAC7C,CAAC,EAAG,OAGiB,IAA5BG,EAAiBd,SACnBc,EAAmBC,EAAU,EAAGJ,EAAgB,GAAG,iBAC1C,CAAC,EAAG,OAGY,IAAvBC,EAAYZ,SACdY,EAAcG,EAAU,EAAGJ,EAAgB,EAAG,IAEhDzG,EAAKqI,IAAI+H,UAAY,GAcrBpQ,EAAKqI,IAAIuR,UAAY,OACrB5Z,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAM+U,UAC3BrX,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM4X,yBAChCxQ,EAASsQ,EAAIC,EAtCJ,IAOF,MAiCL,CACE,gBACAtT,EACA,EACA3G,EAAKqO,UAAU+H,aACfpW,EAAKsC,MAAM6X,wBACX,GAEF,CACE,eACAxT,EACA,EACA3G,EAAKqO,UAAU2H,YACfhW,EAAKsC,MAAM8X,uBACX,GAEF,CACE,cACA9T,OACAY,EACA,IACAlH,EAAKsC,MAAM+X,uBACX,GAEF,CACE,WACA3T,OACAQ,EACA,KACAlH,EAAKsC,MAAMgY,oBACX,GAEF,CACE,YACA1T,EACA,EACA,IACA5G,EAAKsC,MAAMiY,qBACX,GAEF,CACE,YACA3T,EACA,EACA,IACA5G,EAAKsC,MAAMkY,qBACX,IAEF3Z,SAAQ,SAAU6C,EAAG0N,GACrB1N,EAAEG,KAAKuN,GACPqJ,EAAIC,MAAM,KAAMhX,MAElB1D,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM4X,yBAChCxT,EAAYyQ,MACZzQ,EAAYoM,QAAQ9S,EAAK6N,aAAa/H,QACtCa,EAAoBwQ,MACpBxQ,EAAoBmM,QAAQ,CAC1B9S,EAAKqO,UAAUc,UACfnP,EAAKqO,UAAUC,aAEjB1H,EAAiBuQ,MACjBvQ,EAAiBkM,QAAQ,CAAC9S,EAAKgZ,KAAMhZ,EAAK+Y,gBA/EjC0B,EAAIvV,EAAMyV,EAASC,EAAUC,EAAKC,EAAOC,EAAQrT,OACpDJ,YA3tDY2B,EAAGC,EAAGjC,EAAGc,EAAG4S,EAASC,EAAUC,EAAKC,EAAOC,OAC3DrX,EAAIuF,EAAI0R,EAAQ7U,OAClBsD,EAAIF,EAAI2R,EACV5T,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIiB,YACTtJ,EAAKqI,IAAIkB,OAAOtC,EAAGc,EAAImB,GACvByR,EAAQ9Z,SAAQ,SAAUoC,OAEtBqI,EACAC,EAFEvJ,OAAmBkF,IAAb0T,EAAyB3X,EAAIA,EAAE2X,GAGrCG,IACF/Y,EAAM4F,KAAKoT,IAAIhZ,IAEjBsJ,EAAKrE,EAAIvD,EACT6H,EAAKxD,EAAImB,EAAIlH,EAAMoH,EACnBpJ,EAAKqI,IAAImB,OAAO8B,EAAIC,GACpBtE,GAAKvD,KAEP1D,EAAKqI,IAAIkB,OAAOtC,EAAIgC,EAAGlB,EAAImB,GAC3BlJ,EAAKqI,IAAIiI,YAAcwK,EACvB9a,EAAKqI,IAAIqC,SAusDLuQ,CAxBO,IAOF,IAiBgBjB,EAAIC,EAAIU,EAASC,EAAUC,EAAKC,EAAOC,GAC5D/a,EAAKqI,IAAI2F,UAAY8M,EACrBpR,EAAS,EAAIsQ,EAAIC,EAAK,EAAe,GAAXvS,EAAe,EAAG,GAC5C1H,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAM4Y,wBAChC5T,OAAiBJ,IAAb0T,EAAyBD,EAAQ,GAAGC,GAAYD,EAAQ,GAC5D/Q,EACE1E,EAAO,KAAO/B,MAAMmE,GAAK,EAAIA,GAAGmQ,QAAQ,GACxC,GAAKuC,EACLC,EAAK,GAAgB,GAAXvS,IAwLhByT,GACInb,EAAKmC,cAAc,YAAa,KAGpCnC,EAAKqI,IAAIyH,mBA7tCAsL,GACPhU,EACAiU,EACAC,EACAC,GAEAA,EAAcA,GAAe,CAAEtU,EAAG,EAAGc,EAAG,GACxCX,EAAKoU,gBAAkB,IAEpBpU,EAAKqU,aACNzb,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,KAGtC,IAFP/H,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,GAAG4T,QAC9CvU,EAAKO,aAAe4T,EAAYtU,KAI9BjH,EAAK0b,WAAWtU,EAAKM,SAAW,EAAK6T,EAAYxT,KAG1C,IAFP/H,EAAK0b,WAAWtU,EAAKM,SAAW,EAAK6T,EAAYxT,GAAG4T,QAClDvU,EAAKO,aAAe4T,EAAYtU,IAEhB,IAAlBG,EAAKM,UACNN,EAAKwU,WAENP,EAAUxX,KAAK,CAACuD,EAAM,MACtBA,EAAKkU,EAAa,cAAe,EACjClU,EAAKkU,EAAa,WAAa,KAG9Btb,EAAK0b,WAAWtU,EAAKM,SAAW,GAAK6T,EAAYxT,KAG3C,IAFP/H,EAAK0b,WAAWtU,EAAKM,SAAW,GAAK6T,EAAYxT,GAAG4T,QAClDvU,EAAKO,aAAe4T,EAAYtU,KAGlCoU,EAAUxX,KAAK,CAACuD,EAAM,MACtBA,EAAKkU,EAAa,iBAAkB,EACpClU,EAAKkU,EAAa,WAAa,KAG9Btb,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,IACzB,IAArBX,EAAKO,cAGE,IAFP3H,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,GAAG4T,QAC9CvU,EAAKO,YAAc,EAAK4T,EAAYtU,KAGtCoU,EAAUxX,KAAK,CAACuD,EAAM,MACtBA,EAAKkU,EAAa,eAAgB,EAClClU,EAAKkU,EAAa,WAAa,KAG9Btb,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,IAC9CX,EAAKO,cAAgB9E,EAAOiD,SAGrB,IAFP9F,EAAK0b,WAAWtU,EAAKM,UAAY6T,EAAYxT,GAAG4T,QAC9CvU,EAAKO,YAAc,GAAK4T,EAAYtU,KAGtCoU,EAAUxX,KAAK,CAACuD,EAAM,MACtBA,EAAKkU,EAAa,gBAAiB,EACnClU,EAAKkU,EAAa,WAAa,eAI5B1L,GAAShE,EAASmD,EAAerH,UACjC,SAAkBkJ,EAAQ5B,EAAaF,MACxC8B,EAAOK,cACF,MAGP4K,EACAzU,EA4BApF,EA9BE8Z,EAAYlL,EAAOtO,OAAS,OAG9BsZ,EAAW,aAAatY,KAAKwY,GAC7BC,EAAW,aAAazY,KAAKwY,GAC7BL,EAAc,kBAAoBK,EAClCE,EAAiB,qBAAuBF,EACxCG,EAAqC,WAA9Bjc,EAAKsC,MAAM4Z,eAClBC,EACEnc,EAAK0b,WAAW3M,KAC8C,IAA9D/O,EAAK0b,WAAW3M,GAAe4M,QAAQ7M,GACzCsN,EACEpc,EAAKqc,OAAO3U,WAAaqH,IACM,QAA9B/O,EAAKE,WAAWoc,WACftc,EAAKqc,OAAO1U,cAAgBmH,GAChCyN,EACEvc,EAAKiQ,WAAWvI,WAAaqH,GAC7B/O,EAAKiQ,WAAWtI,cAAgBmH,EAClCwD,EAAsC,wBAAdwJ,EACxBU,EAAW5Q,EAAUA,EAAQgF,EAAO1L,WAAQgC,EAC5CuV,EAAyB,oBAAhB7L,EAAO7K,KAChB2W,IACG1c,EAAKuN,OAAOC,KAAKxN,EAAKiQ,WAAWvI,YAAcqH,GAC9C/O,EAAKuN,OAAOoC,QAAQ3P,EAAKiQ,WAAWtI,eAClCqH,IACmB,IAAtBF,IAA8C,IAAnBC,KACxB0M,EACE,sBACA,0BAGRkB,EAAI3c,EAAK4c,WAAWhM,EAAO7K,MAAQ,UACnC8W,EAAmB,EACnBC,EAAgB,EAChB3L,EAAYnR,EAAK+R,MAAMpC,QAAQX,IAAgB4B,EAAOzI,MACtD4U,EAAK,CACHC,MAAOR,EACPS,IAAKrR,EACLgF,OAAQA,MAER0B,IACFnB,EAAYlI,EAAIhC,QAGAC,IAAdiK,IACFA,EAAYnR,EAAKsC,MAAM6O,WAEzBA,GAAwBnR,EAAKgY,MACzB/Q,EAAIkK,EAAYnR,EAAKsC,MAAMkM,gBAAkB,IAC/CvH,GAAKkK,EAAYnR,EAAKsC,MAAMkM,iBAE1B+N,GAAwB,eAAdT,IACZA,EAAY,eAE8B,IAAxC9b,EAAK2N,YAAYgO,QAAQjU,IAAqBkU,GAChD5b,EAAK2N,YAAY9J,KAAK6D,GAExB1F,EAAMhC,EAAKmC,cAAc,kBAAmB4a,GAC5CzR,EAAKrE,EACLsE,EAAKxD,EACa,eAAd+T,GACFxQ,EAAK,EACLC,EAAK,GACIkQ,EACTnQ,EAAK,EACIsQ,IACTrQ,EAAK,IAEPnE,EAAO,CACLrB,KAAM0W,EAAS,uBAAyB7L,EAAO7K,KAC/CzD,MAAOwZ,EACPoB,SAAU,uBACVjW,EAAGqE,EACHvD,EAAGwD,EACH4R,YAAand,EAAKsC,MAAMwZ,EAAY,eAAiB,GAAK9b,EAAKgY,MAC/DoF,oBAAqBpd,EAAKsC,MAAMwZ,EAAY,uBAC5CuB,kBAAmBrd,EAAKsC,MAAMwZ,EAAY,qBAC1CwB,aACGtd,EAAKsC,MAAMwZ,EAAY,gBAAkB,GAAK9b,EAAKgY,MACtDuF,YAAavd,EAAKsC,MAAMwZ,EAAY,eAAiB,GAAK9b,EAAKgY,MAC/DwF,cACGxd,EAAKsC,MAAMwZ,EAAY,iBAAmB,GAAK9b,EAAKgY,MACvDyF,eACGzd,EAAKsC,MAAMwZ,EAAY,kBAAoB,GAAK9b,EAAKgY,MACxD0F,WAAY1d,EAAKsC,MAAM4Z,eACvByB,WAAY3d,EAAKsC,MAAMsb,eACvBC,YAAa7d,EAAKsC,MAAMwb,gBACxBhQ,UAAW9N,EAAKgI,gBAAkBuD,EAClCwC,WAAY/N,EAAK8H,iBAAmBwD,EACpC6D,UAAWnP,EAAKqO,UAAUc,UAC1Bb,WAAYtO,EAAKqO,UAAUC,WAC3BiO,OAAQA,GAAUG,EAClBN,QAASA,EACTD,SAAUA,EACVhU,MAAOgJ,EACPjJ,OAAQiF,EACR4Q,YAAa5M,EACb6M,aAAc7Q,EACdvH,WAAY5F,EAAKsB,KAAKsE,WACtBqY,aAAcje,EAAKsB,KAAKsE,WACxBrD,KAAMqJ,EACNmQ,SAAUA,EACVH,SAAUA,EACVI,eAAgBA,EAChB1J,sBAAuBA,EACvBmJ,YAAaA,EACbhQ,QAASA,EACTmF,OAAQA,EAERjJ,YAAamH,EACbpH,SAAUqH,EAEVmP,aAAcnP,EACdoP,gBAAiBrP,EAEjBsP,cAAepe,EAAKyR,iCAAiC1C,GACrDsP,iBAAkBre,EAAKse,uCACrBxP,GAGF8F,gBAAiB5F,EACjB2F,aAAcjN,EAEd+U,OAAQA,EACR8B,UAAW9B,IAAWV,IAAaH,EACnC4C,QAASxe,EAAKE,WAAWgF,MAAQ,IAAMwC,EAAW,IAAMsH,EACxD7D,WAAYnL,EAAKsB,KACjB6C,UAAW,GACXuY,aAAcA,EACdM,MACEpB,IAAaH,EAAc7K,EAAOM,OAASN,EAAO1L,KAAOsX,IAExDiC,qBACHrX,EAAK+V,WAAa/V,EAAKuW,WAAavW,EAAKyW,YAC3CzW,EAAKsX,YAActX,EAAKe,MAAQf,EAAKoW,aAAepW,EAAKkW,YACzDlW,EAAKuX,aAAevX,EAAKc,OAASd,EAAKmW,WAAanW,EAAKqW,cACzDV,EAAG3V,KAAOA,EACVA,EAAKwX,WAAaxX,EAAKwU,SAAW5b,EAAK+R,MAAMvE,MAAM,GAAK9B,EACxDtE,EAAKyX,UAAYzX,EAAKwU,SAClB5b,EAAK+R,MAAMpC,QAAQhE,WACnB3L,EAAK+R,MAAMpC,QAAQX,GACvBhP,EAAK6N,aAAaiF,QAAQ1L,IACtBpH,EAAKmC,cAAc,mBAAoB4a,OAG3C/c,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMwZ,EAAY,mBAC5C9b,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMwZ,EAAY,eAC9C9b,EAAKqI,IAAI+H,UAAYpQ,EAAKsC,MAAMwZ,EAAY,eACxCM,IACFpc,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMwZ,EAAY,wBAC5C9b,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMwZ,EAAY,qBAE5CK,IACFnc,EAAKqI,IAAI2F,UACPhO,EAAKsC,MAAMwZ,EAAY,2BACzB9b,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMwZ,EAAY,wBAE5CY,IACF1c,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMoa,EAAe,oBAEjD1c,EAAKmC,cAAc,aAAc4a,GAC7B3V,EAAKqV,SACHrV,EAAKc,SAAWwD,IAClBtE,EAAKc,OAASwD,GAAa1L,EAAKsC,MAAMwc,wBACtCzT,GAAoB,GAEtBjE,EAAKe,MACHnI,EAAK+R,MAAMpC,QAAQX,IACnBhP,EAAKsC,MAAMyc,wBAEXtT,IAAYrE,EAAKqU,cACnBrU,EAAKc,OAASlI,EAAK+R,MAAMvE,KAAK9F,IAAa1H,EAAKsC,MAAM6K,YAEnD/F,EAAKqV,SACR/S,EAAS4B,EAAIC,EAAInE,EAAKe,MAAOf,EAAKc,QAClCyB,EAAW2B,EAAIC,EAAInE,EAAKe,MAAOf,EAAKc,SAEtClI,EAAKqI,IAAIqF,OACT1E,EAAW5B,EAAKH,EAAGG,EAAKW,EAAGX,EAAKe,MAAOf,EAAKc,OAAQ,GACpDlI,EAAKqI,IAAI6B,OACTlK,EAAKmC,cAAc,kBAAmB4a,GAClC3V,EAAKc,SAAWiF,GAAgB1B,IAAYrE,EAAKqU,cACnDzb,EAAK+R,MAAMvE,KAAKoO,GAAY,EAAIlU,GAAYN,EAAKc,OACjDmD,GAAoB,GAElBjE,EAAKe,QAAUgJ,IACjBnR,EAAK+R,MAAMpC,QAAQX,GAAe5H,EAAKe,MACvCkD,GAAoB,GAElBoQ,GAAezb,EAAKE,WAAW8e,OAC5Bhf,EAAKmC,cAAc,kBAAmB4a,KACzCD,WAl1Ba1V,EAAMH,EAAGc,OAC1BkX,EAAKjf,EAAKsC,MAAM4c,mBAAqBlf,EAAKgY,MAC5CmH,EAAKnf,EAAKsC,MAAM8c,qBAAuBpf,EAAKgY,MAC5CqH,EAAKrf,EAAKsC,MAAMgd,oBAAsBtf,EAAKgY,MAC3CuH,EAAKvf,EAAKsC,MAAMkd,eAAiBxf,EAAKgY,MACtCyH,EAAKzf,EAAKsC,MAAMod,gBAAkB1f,EAAKgY,aACzC/Q,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMqd,eAChC3f,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMsd,qBAClC5f,EAAKqI,IAAIiB,YACTrC,GAAQoY,EACRtX,GAAQkX,EACJjf,EAAKgS,aAAa5K,EAAKM,WACzB1H,EAAKqI,IAAIkB,OAAOtC,EAAGc,GACnB/H,EAAKqI,IAAImB,OAAOvC,EAAIsY,EAAIxX,GACxB/H,EAAKqI,IAAImB,OAAOvC,EAAS,GAALsY,EAAUxX,EAAI0X,GAClCzf,EAAKqI,IAAIkB,OAAOtC,EAAGc,KAEnB/H,EAAKqI,IAAImB,OAAOvC,EAAGc,GACnB/H,EAAKqI,IAAImB,OAAOvC,EAAIwY,EAAI1X,EAAS,GAALwX,GAC5Bvf,EAAKqI,IAAImB,OAAOvC,EAAGc,EAAIwX,GACvBvf,EAAKqI,IAAImB,OAAOvC,EAAGc,IAErB/H,EAAKqI,IAAIqC,SACT1K,EAAKqI,IAAIkC,OACF8U,EAAKE,EAAKJ,EAwzBOU,CACdzY,EACApH,EAAKsC,MAAMwZ,EAAY,eACvBvQ,KAKDvL,EAAKE,WAAW4f,gBAAkBrE,IAAiBA,KAClDrU,EAAKqV,SAAWzc,EAAKmC,cAAc,uBAAwB4a,GAAK,KAC7D/c,EAAK+f,WAAW3Y,EAAKoX,QAAS,KAIjC3C,EAAqB7b,EAAK6b,oBACP3W,KAAOlF,EAAKE,WAAW8f,eACtC5Y,EAAKoX,YACLtX,EACJ2U,EAAmBxb,WAAY,EAC/Bwb,EAAmBjW,WAAawB,EAChCyU,EAAmBtZ,KAAOia,EAC1BO,EAAGlB,mBAAqBA,EACpB7b,EAAKmC,cAAc,uBAAwB4a,UAG/C/c,EAAK+f,WAAW3Y,EAAKoX,QAAUxe,EAAKigB,WAClCpE,GAEF7b,EAAK+R,MAAMvE,KAAK9F,GACd1H,EAAK+R,MAAMvE,KAAK9F,IAAa1H,EAAKsC,MAAM4d,eAC1C7U,GAAoB,EAEtBjE,EAAK+Y,KAAOngB,EAAK+f,WAAW3Y,EAAKoX,QACjCpX,EAAK+Y,KAAKva,WAAawB,EACvBA,EAAK+Y,KAAK/U,SAAU,EACpBhE,EAAK+Y,KAAKtX,OACV7I,EAAKmC,cAAc,iBAAkB4a,QAC3B3V,EAAKqV,SACXzc,EAAK+f,WAAW3Y,EAAKoX,UACvBxe,EAAK+f,WAAW3Y,EAAKoX,QAAQ5Y,WAAWoY,aAAe,GAErDpC,GAAY5b,EAAKogB,UAAYxP,EAAO1L,OACjClF,EAAKmC,cAAc,qBAAsB4a,KAC5CF,WAz5BY5V,EAAGc,OACvBkX,EAAKjf,EAAKsC,MAAM+d,kCAAoCrgB,EAAKgY,MAC3DqH,EAAKrf,EAAKsC,MAAMge,mCAAqCtgB,EAAKgY,MAC1DmH,EAAKnf,EAAKsC,MAAMie,oCAAsCvgB,EAAKgY,MAC3DuH,EAAKvf,EAAKsC,MAAMke,8BAAgCxgB,EAAKgY,MACrDyH,EAAKzf,EAAKsC,MAAMme,+BAAiCzgB,EAAKgY,aACxD/Q,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMoe,8BAChC1gB,EAAKqI,IAAIiI,YAActQ,EAAKsC,MAAMqe,oCAClC3gB,EAAKqI,IAAIiB,YACTrC,GAAQoY,EACRtX,GAAQkX,EACoB,QAAxBjf,EAAK4gB,gBACP5gB,EAAKqI,IAAImB,OAAOvC,EAAGc,EAAI0X,GACvBzf,EAAKqI,IAAImB,OAAOvC,EAAIsY,EAAIxX,EAAI0X,GAC5Bzf,EAAKqI,IAAImB,OAAOvC,EAAS,GAALsY,EAAUxX,GAC9B/H,EAAKqI,IAAImB,OAAOvC,EAAGc,EAAI0X,KAEvBzf,EAAKqI,IAAIkB,OAAOtC,EAAGc,GACnB/H,EAAKqI,IAAImB,OAAOvC,EAAIsY,EAAIxX,GACxB/H,EAAKqI,IAAImB,OAAOvC,EAAS,GAALsY,EAAUxX,EAAI0X,GAClCzf,EAAKqI,IAAIkB,OAAOtC,EAAGc,IAErB/H,EAAKqI,IAAIqC,SACT1K,EAAKqI,IAAIkC,OACF8U,EAAKE,EAAKJ,EA+3Bc0B,CACjBvV,EAAKtL,EAAKsC,MAAMwZ,EAAY,eAC5B,KAIN9b,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMwZ,EAAY,SACxCM,IACFpc,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMwZ,EAAY,eAE1CK,IACFnc,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMwZ,EAAY,kBAE1CY,IACF1c,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMoa,EAAe,UAEjDtV,EAAKoY,eAAiB1C,EACtB1V,EAAK0Z,kBAAoBjE,OAGb3V,KADZlF,OAAckF,IAARlF,EAAoBA,EAAM2a,EAAIA,EAAEI,GAAM,KAClBJ,IACxB3a,EAAM,GACN+e,QAAQC,KACN,mCACEpQ,EAAO7K,KACP,wBAGNqB,EAAKG,gBAAkBvF,MAAAA,EACnBA,EACA,IACFyF,WAEAzH,EAAKihB,oBACuB/Z,IAA5BlH,EAAKihB,cAAcjf,IACnB4Z,IAEAxU,EAAKG,eAAiBvH,EAAKE,WAAWghB,iBAAmBlf,GAE3DhC,EAAKqI,IAAI+O,KACPpX,EAAKsC,MAAMwZ,EAAY,cAAgB9b,EAAKgY,MAC5C,MACAhY,EAAKsC,MAAMwZ,EAAY,YACpB9b,EAAKmC,cAAc,aAAc4a,KACpC3V,EAAKyC,cAzuBCzC,EAAM+Z,kBACjB/Z,EAAKG,qBACD,CACL6Z,MAAO,CAAC,CAAEjZ,MAAO,EAAG6U,MAAO,KAC3B7U,MAAO,EACPD,OAAQd,EAAKqX,0BAKfxX,EACAoa,EAOAC,EAGAC,EACAC,EAEAC,EAZAC,EAAQta,EAAKG,eAAeoa,MAAMR,GAClCS,EAAaxa,EAAKqX,qBAClB2C,EAAQ,GAERnF,EAAqC,WAA9Bjc,EAAKsC,MAAM4Z,eAClB2F,EAAa7hB,EAAKE,WAAW4hB,gBAAkB7F,EAE/C8F,EAAK/hB,EAAKE,WAAW8hB,aAMrBC,EAAO,CACL9Z,MAAO,EACP6U,MAAO,IAETkF,EAAUjG,EAAO7U,EAAKuX,aAAevX,EAAKqX,yBAC5C2C,EAAMvd,KAAKoe,GACXX,EAAUthB,EAAKqI,IAAI8Z,YAAY,IAAMJ,GAAI5Z,MACpClB,EAAI,EAAGA,EAAIya,EAAM5b,OAAQmB,GAAK,EAAG,KAEhCmb,EAAyC,OAD7Cf,EAAOK,EAAMza,IACWoa,EAAKvb,OAAS,GAAa,GAAKqb,EACpDkB,EAAUriB,EAAKqI,IAAI8Z,YAAYd,EAAOe,MACtCH,EAAK9Z,MAAQka,EAAQla,MAAQmZ,EAAUla,EAAKsX,YAC9CuD,EAAKjF,OAASqE,EAAOe,EACrBH,EAAK9Z,OAASka,EAAQla,cAOpB,QAAQ7E,KAAK+d,IAASja,EAAKsX,YAAc2D,EAAQla,WAC/Cma,EAAMjB,EAAKM,MAAM,KACrBW,EAAMA,EAAIC,IAAI,SAACzd,EAAMsM,iCACZA,IAAUkR,EAAIxc,OAAS,EAAIhB,EAAOA,EAAO,iBAElD4c,EAAMc,aAANd,GAAaza,EAAG,6BAAMqb,KACtBrb,GAAK,UAGPgb,EAAO,CACL9Z,MAAOka,EAAQla,MACf6U,MAAOqE,EAAOe,GAEN,IAANnb,IACFma,EAAQ,IACFvd,KAAKoe,IAEbL,GAAcxa,EAAKqX,sBACFyD,IAAYL,EAAY,IAClB,IAAjBT,EAAMtb,iBAIV2b,EAAeL,EAAMA,EAAMtb,OAAS,IACnBqC,MAAQf,EAAKsX,aAAgC,IAAjBgD,EAAM5b,iBAK/C2c,EAFJjB,EAAaC,EAAazE,MAAQqE,MAClCE,EAAUvhB,EAAKqI,IAAI8Z,YAAYX,EAAaO,GAAI5Z,OAElCf,EAAKsX,oBACbgE,EAAaxf,SAASse,EAAW1b,OAAS,GAC1C6c,GAAa,EACVD,EAAa,GAClBlB,EAAaiB,EAAWG,OACtB,EACAF,EAAaC,EAAYnB,EAAW1b,QAGtC6c,GADApB,EAAUvhB,EAAKqI,IAAI8Z,YAAYX,EAAaO,GAAI5Z,OAC1Bf,EAAKsX,aAAe,EAAI,EAC9CgE,EAAaxf,SAASwf,EAAa,GAGvClB,GACgBiB,EAAW3c,QAAU0b,EAAW1b,OAASic,EAAK,GAC9DN,EAAazE,MAAQwE,EACrBC,EAAatZ,MAAQoZ,QAGnBta,EAAI,GACNma,EAAMvd,KAAKoe,UAGR,CACLb,MAAOA,EACPjZ,MA5FQ,EA6FRD,OAAQd,EAAKqX,qBAAuB2C,EAAMtb,QAooBtB+c,CAASzb,EAAM,MAExBpH,EAAKmC,cAAc,aAAc4a,KAChC3V,EAAKjD,WAA6B,SAAhByM,EAAO7K,KAC3BoB,EAASC,YAroBLA,GACPA,EAAKyC,KAAKuX,MAAMtb,WAEvBmB,EACAgb,EAFA/Y,EAAI9B,EAAK+V,WAAa/V,EAAKuW,WAG3B1B,EAAqC,WAA9Bjc,EAAKsC,MAAM4Z,eAClB0F,EAAa,MACV3a,EAAI,EAAGA,EAAIG,EAAKyC,KAAKuX,MAAMtb,OAAQmB,GAAK,EAAG,CAC9Cgb,EAAO7a,EAAKyC,KAAKuX,MAAMna,OACnB6b,EACAlb,KAAKiT,IAGD,IAFDzT,EAAKc,QACH+T,EAAO7U,EAAKyC,KAAK3B,OAASd,EAAKqX,uBAElC,GACEvV,EACN6Z,EAAO3b,EAAKkW,YAAclW,EAAKoY,eAAiBpY,EAAK0Z,kBACtB,UAA7B1Z,EAAKgW,oBACP2F,EAAO3b,EAAKkW,YAAclW,EAAKsX,YAAcuD,EAAK9Z,MACZ,WAA7Bf,EAAKgW,sBACd2F,EACE3b,EAAKkW,aACJlW,EAAKsX,YAActX,EAAKoW,cAAgB,EACzCyE,EAAK9Z,MAAQ,GAEc,QAA3Bf,EAAKiW,kBACPyF,EAAO1b,EAAKqX,qBACwB,WAA3BrX,EAAKiW,oBACdyF,EAAO1b,EAAKc,OAASd,EAAKqW,cAAgBrW,EAAKyC,KAAK3B,QAEtD+Z,EAAK/Z,OAASgB,EAAI9B,EAAKyW,YACvBoE,EAAKlU,WAAagV,EAClBd,EAAKnU,UAAYgV,EACjBb,EAAKhb,EAAIG,EAAKH,EAAI8b,EAClBd,EAAKla,EAAIX,EAAKW,EAAI6Z,EAAakB,EAC/BlB,GAAcK,EAAK/Z,OACnB0B,EAASqY,EAAKjF,MAAOiF,EAAKhb,EAAGgb,EAAKla,GAEhC/H,EAAKE,WAAWgX,OAAS9P,EAAKmV,QAChCna,uBAAsB,WACpBpC,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAM+U,UAC3BrX,EAAKqI,IAAI2F,UAAYhO,EAAKsC,MAAMyX,WAChCnQ,EACEnH,KAAKugB,UACH,CACE/b,EAAGG,EAAKH,EACRc,EAAGX,EAAKW,EACRmB,EAAG9B,EAAKc,OACRe,EAAG7B,EAAKe,MACR8a,GAAI7b,EAAKsX,YACTwE,IAAK9b,EAAKO,YACVwb,QAAS/b,EAAKwN,iBAEhB,KACA,MAEFxN,EAAKH,EAAI,GACTG,EAAKW,EAAI,IAEX6B,EACEnH,KAAKugB,UACH5b,EAAKyC,KAAKuX,MAAMmB,KAAI,SAAUvX,SACrB,CAAE/B,EAAG+B,EAAE7C,MAAOb,EAAG0D,EAAEgS,MAAMlX,WAElC,KACA,MAEFsB,EAAKH,EAAI,GACTG,EAAKW,EAAI,OAmkBHqb,CAAShc,GAGP6U,GAAQ7U,EAAKyC,MAAQzC,EAAKyC,KAAK3B,OAASwD,IAC1C1L,EAAK+R,MAAMvE,KAAKoO,GAAY,EAAIlU,GAAYN,EAAKyC,KAAK3B,OACtDmD,GAAoB,KAKxBkR,IACF1Q,EAAQzE,GAEVgU,GAAyBhU,EAAMqF,EAAkB,sBA/YlBrF,IAC7BpH,EAAKE,WAAWkT,sBAAwBpT,EAAKmT,UAE7C/L,EAAKic,oBACLjc,EAAKkc,sBACLtjB,EAAKmT,SAELxG,EAAiB9I,KAAK,CAACuD,EAAM,OAC7BA,EAAKmc,gBAAkB,MAGvBnc,EAAKic,oBACLjc,EAAKoc,qBACLxjB,EAAKmT,SAELxG,EAAiB9I,KAAK,CAACuD,EAAM,OAC7BA,EAAKmc,gBAAkB,MAGvBnc,EAAKqc,uBACLrc,EAAKoc,qBACLxjB,EAAKmT,SAELxG,EAAiB9I,KAAK,CAACuD,EAAM,OAC7BA,EAAKmc,gBAAkB,MAGvBnc,EAAKqc,uBACLrc,EAAKkc,uBACwC,SAA5CtjB,EAAKE,WAAWwjB,yBAAsC1jB,EAAKmT,UAE5DxG,EAAiB9I,KAAK,CAACuD,EAAM,OAC7BA,EAAKmc,gBAAkB,OAiXzBI,CAA0Bvc,GACtBpH,EAAK8U,iBACPsG,GAAyBhU,EAAMsF,EAAa,OAAQ1M,EAAK4jB,YAE3D5jB,EAAKqI,IAAIyH,cAOH+T,EACJ7jB,EAAK8jB,UAAUnU,SAAW3P,EAAK8jB,UAAUnU,QAAQ7J,OAAS,KAG1D2V,GACAzb,EAAKE,WAAW4f,gBAChB9f,EAAKE,WAAW6jB,oBACF,IAAdF,EACA,KACMG,EAAoBhkB,EAAKyR,iCAC7B1C,EAAgB,WAGM7H,IAAtB8c,GACA5c,EAAKgX,cAAgB,GACrBhX,EAAKgX,cAAgB4F,EAAoB,EAE5B,KACPC,EAAYjkB,EAAKsC,MAAM4hB,gCACvBC,EAAWnkB,EAAKsC,MAAM8hB,+BAE5BpkB,EAAKqI,IAAIqF,OAET1N,EAAKqI,IAAI2F,UAAYmW,EAErBza,EAAStC,EAAKH,EAAGG,EAAKW,EAAIkc,EAAY,EAAG7c,EAAKe,MAAO8b,GAErDjkB,EAAKqI,IAAIyH,kBAIb7I,GAAKG,EAAKe,OAASoE,EAAK,EAAIvM,EAAKsC,MAAMkM,iBAChCpH,EAAKe,iBAwIPsG,GAAQM,EAAerH,OAC1BsH,EACFqV,EACAC,EACAxV,EACAG,EAAIpM,EAAOiD,UACTiC,EAAiB,EAAboF,EAAiBjE,SAChB,KAET0C,EAAUU,EAASyC,GACnBtD,EAAUzL,EAAKgS,aAAajD,GAC5BuV,GACGtkB,EAAK+R,MAAMvE,KAAKuB,IAAkB/O,EAAKsC,MAAM6K,YAAcnN,EAAKgY,MACnEqM,GAAc5Y,EAAUzL,EAAK+R,MAAMwS,MAAMxV,GAAiB,GAAK/O,EAAKgY,MAEhEjQ,IADJ2D,EAAY4Y,EAAoBD,UAEvB,MAELrkB,EAAKE,WAAWuP,iBAClBxI,GAAKgG,GAEPE,EAAazB,EAGXoD,EAAmB9O,EAAK0P,gBACxBZ,EAAmBG,EACnBH,GAAoB,KAEpBE,EAAchP,EAAKuN,OAAOoC,QAAQb,IAClC7H,GAAK2I,GAAShE,EAASmD,EAAerH,EAAjCkI,CACH/M,EAAOmM,GACPA,EACAF,IAEM9O,EAAKmI,MAAO,CAClBnI,EAAKwkB,iBAAmB1V,EACxB9O,EAAKykB,iBAAmBxd,YAK5BA,EAAI,EACAjH,EAAKE,WAAWuP,iBAClBxI,GAAKgG,GAGL6B,EAAmB,EACnBA,EAAmB9O,EAAKkQ,eAGxBlB,EAAchP,EAAKuN,OAAOoC,QAAQb,MAClC7H,GAAK2I,GAAShE,EAASmD,EAAerH,EAAjCkI,CACH/M,EAAOmM,GACPA,EACAF,IAEM9O,EAAKmI,QARb2G,GAAoB,UAYtB9O,EAAKgK,sBAAwB/C,EAE7BkG,EAAazB,EACbzE,GACGjH,EAAKqO,UAAUC,WAChBtO,EAAKuO,gBACLvO,EAAKsC,MAAMkM,gBAEbhD,EAAWxL,EAAK+f,WAAWhR,GACvBA,IAAkBzC,EAASxG,QAAU2F,GACvCD,EAASJ,SAAU,EACnBI,EAAS5F,WAAa,CACpBkI,UAAW/F,EAAIuc,EAAoBtkB,EAAKgI,gBACxC+F,WAAYd,EAAqB,EAAIjN,EAAK8H,iBAC1CkW,aAAcqG,EACdtG,YACE/d,EAAKmI,MAAQ8E,EAAqBjN,EAAKsC,MAAM8P,eAAiB,EAChE6L,aAAcje,EAAKsB,KAAKsE,WACxBA,WAAY5F,EAAKsB,KAAKsE,WACtBtD,MAAOtC,EAAKsC,MACZ4a,SAAU,uBACV/N,UAAWnP,EAAKqO,UAAUc,UAC1Bb,WAAYtO,EAAKqO,UAAUC,WAC3B5G,SAAUqH,GAEZ/O,EAAK6N,aAAaiF,QAAQ,CACxBpL,SAAUqH,EACVpH,YAAa,EACbI,EAAGyD,EAAS5F,WAAWkI,UACvB7G,EAAGuE,EAAS5F,WAAWmI,WACvB7F,OAAQsD,EAAStD,OACjBC,MAAOqD,EAASrD,MAChB7F,MAAO,YACPyD,KAAMyF,EAAS5F,WAAWsX,WAE5B1R,EAAS3C,QACA2C,IACTA,EAAS5F,WAAWoY,aAAe,SAC5Bhe,EAAK+R,MAAMwS,MAAMxV,IAE1BnC,EAAW/I,KAAK,CAAC+H,EAASmD,EAAerH,EAAUK,EAAG2D,IACtD1L,EAAKsN,kBAAkByB,GAAiBrD,EACxC3D,GAAKoF,GAAcZ,EAAK,EAAIvM,EAAKsC,MAAMkM,kBAChC,0bCl2CbkW,UAAe,SAAS/hB,OAAO+N,EAAE,YAAY8G,EAAEzM,MAAM2F,EAAE3F,GAAG,OAAO2F,EAAE3F,GAAG4Z,YAAYvb,EAAEsH,EAAE3F,GAAG,CAACrH,EAAEqH,EAAEC,GAAE,EAAG2Z,QAAQ,WAAWhiB,EAAEoI,GAAGjK,KAAKsI,EAAEub,QAAQvb,EAAEA,EAAEub,QAAQnN,GAAGpO,EAAE4B,GAAE,EAAG5B,EAAEub,eAAenN,EAAEpL,EAAEzJ,EAAE6U,EAAE3M,EAAE6F,EAAE8G,EAAEnL,EAAE,SAAS1J,EAAE+N,EAAE3F,GAAGyM,EAAE9G,EAAE/N,EAAE+N,IAAIhI,OAAOkc,eAAejiB,EAAE+N,EAAE,CAACmU,YAAW,EAAGC,IAAI/Z,KAAKyM,EAAEpO,EAAE,SAASzG,uBAAuBoiB,QAAQA,OAAOC,aAAatc,OAAOkc,eAAejiB,EAAEoiB,OAAOC,YAAY,CAAChI,MAAM,WAAWtU,OAAOkc,eAAejiB,EAAE,aAAa,CAACqa,OAAM,KAAMxF,EAAEzM,EAAE,SAASpI,EAAE+N,MAAM,EAAEA,IAAI/N,EAAE6U,EAAE7U,IAAI,EAAE+N,EAAE,OAAO/N,KAAK,EAAE+N,GAAG,kBAAiB/N,IAAGA,GAAGA,EAAEsiB,WAAW,OAAOtiB,MAAMoI,EAAErC,OAAOwc,OAAO,SAAS1N,EAAEpO,EAAE2B,GAAGrC,OAAOkc,eAAe7Z,EAAE,UAAU,CAAC8Z,YAAW,EAAG7H,MAAMra,IAAI,EAAE+N,GAAG,iBAAiB/N,EAAE,IAAI,IAAIyG,KAAKzG,EAAE6U,EAAEnL,EAAEtB,EAAE3B,EAAE,SAASsH,UAAU/N,EAAE+N,IAAIyU,KAAK,KAAK/b,WAAW2B,GAAGyM,EAAEvU,EAAE,SAASN,OAAO+N,EAAE/N,GAAGA,EAAEsiB,WAAW,kBAAkBtiB,EAAEyiB,SAAS,kBAAkBziB,UAAU6U,EAAEnL,EAAEqE,EAAE,IAAIA,GAAGA,GAAG8G,EAAE9G,EAAE,SAAS/N,EAAE+N,UAAUhI,OAAO9H,UAAUykB,eAAevkB,KAAK6B,EAAE+N,IAAI8G,EAAE9W,EAAE,GAAG8W,EAAEA,EAAEI,EAAE,GAAj5B,CAAq5B,CAAC,SAASjV,EAAE+N,EAAE8G,GAAgB9O,OAAOkc,eAAelU,EAAE,aAAa,CAACsM,OAAM,QAASjS,EAAEyM,EAAE,GAAGpO,EAAEV,OAAOC,KAAKoC,EAAEqa,SAAS7N,QAAQ,SAAS5U,EAAE+N,UAAU/N,EAAE2iB,OAAOva,EAAEqa,QAAQ1U,MAAM,IAAIA,EAAE0U,QAAQ,SAASziB,UAAU,IAAIyG,EAAEuS,QAAQhZ,EAAEmX,OAAO,SAASnX,EAAE+N,EAAE8G,GAAgB9O,OAAOkc,eAAelU,EAAE,aAAa,CAACsM,OAAM,IAAKtM,EAAE0U,QAAQ,CAACG,SAAS,CAAC,MAAM,WAAW,WAAW,UAAU,KAAK,SAAS,OAAO,UAAU,aAAa,QAAQ,SAAS,cAAcC,eAAe,CAAC,QAAQ,SAAS9H,WAAW,CAAC,QAAQ,OAAO+H,WAAW,CAAC,YAAY,YAAY,aAAa,UAAU,MAAM,OAAO,WAAW,UAAUC,QAAQ,CAAC,YAAY,QAAQ,OAAO,QAAQ,MAAM,SAAS,WAAW,QAAQ,SAAS,QAAQ,OAAO,QAAQC,GAAG,CAAC,SAAS,QAAQ,OAAO,SAAS,cAAc,SAAS,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ,SAAS,SAAS,WAAWC,OAAO,CAAC,iBAAiB,eAAe,QAAQ,SAAS,QAAQ,WAAW,cAAc,YAAY,UAAU,UAAUC,mBAAmB,CAAC,gBAAgB,eAAe,YAAY,UAAU,UAAU,OAAO,YAAY,aAAa,YAAY,YAAY,gBAAgB,aAAa,gBAAgB,aAAa,oBAAoB,UAAU,mBAAmBC,eAAe,CAAC,aAAa,YAAY,aAAaC,iBAAiB,CAAC,OAAO,UAAU,WAAW,mBAAmB,WAAW,YAAY,WAAW,SAAS,UAAU,kBAAkBC,eAAe,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,SAASC,WAAW,CAAC,cAAc,YAAY,QAAQ,cAAc,YAAY,WAAW,aAAa,mBAAmB,aAAa,YAAY,iBAAiB,cAAc,cAAc,YAAY,iBAAiB,qBAAqB,MAAM,OAAO,QAAQ,OAAO,cAAcC,iBAAiB,CAAC,QAAQ,SAASC,MAAM,CAAC,mBAAmB,oBAAoB,qBAAqB,uBAAuB,mBAAmB,kBAAkB,iBAAiB,wBAAwB,kBAAkB,gBAAgB,kBAAkB,gBAAgB,kBAAkB,mBAAmB,uBAAuB,qBAAqB,wBAAwBC,OAAO,CAAC,uBAAuB,qBAAqBC,YAAY,CAAC,qBAAqB,qBAAqB,iBAAiB,iBAAiB,aAAa,oBAAoB,oBAAoB,cAAc,oBAAoB,oBAAoB,mBAAmB,eAAe,uBAAuBC,QAAQ,CAAC,cAAc,mBAAmB,iBAAiB,cAAc,iBAAiB,gBAAgB,eAAeC,YAAY,CAAC,YAAY,OAAO,SAAS,cAAc,UAAU,SAAS,SAAS,cAAc,mBAAmB,eAAe,aAAa,aAAaC,GAAG,CAAC,KAAK,WAAW,iBAAiB,qBAAqB,4BAA4B,0BAA0B,iBAAiB,gBAAgB,UAAU,oBAAoB,oBAAoB,oBAAoB,oBAAoB,eAAe,eAAe,eAAe,eAAe,cAAc,iBAAiB,YAAY,gBAAgB,UAAU,iBAAiB,cAAc,gBAAgB,gBAAgB,oBAAoB,sBAAsB,uBAAuB,WAAWC,cAAc,CAAC,WAAW,WAAW,aAAa,eAAe,gBAAgB,cAAc,cAAc,eAAe,sBAAsB,SAAS,cAAc,MAAM,OAAO,iBAAiB,iBAAiB,iBAAiB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,iBAAiB,iBAAiB,QAAQ,eAAe,mBAAmB,OAAO,gBAAgB,OAAO,cAAc,cAAc,OAAO,YAAY,kBAAkB,YAAY,oBAAoB,mBAAmB,oBAAoB,mBAAmB,eAAe,aAAa,eAAe,cAAc,mBAAmB,sBAAsB,kBAAkB,WAAW,UAAU,WAAW,WAAW,aAAa,SAAS,gBAAgB,iBAAiB,cAAc,eAAe,eAAe,kBAAkB,WAAW,qBAAqB,iBAAiB,WAAW,oBAAoB,WAAW,WAAW,WAAW,WAAW,gBAAgB,OAAO,kBAAkBrB,6DCE7mKsB,gBAAkB,SAAUC,oBAUzB,CANY,uCAEE,yCADD,wCAED,2CACG,4CAQpBC,KAAK,SAACC,iCAAeA,EAAWvjB,KAAKqjB,iBAInCG,iBAAmB,CAAC,EAAG,GAEvBC,YAAc,SAAUJ,SACrB,gCAAgCrjB,KAAKqjB,IAGxCK,oBAAsB,SAAUC,OAEhCC,EAAmC,IAArBD,EAAQ/J,SAAiB+J,EAAQE,UAAYF,EAAQ1kB,YAEhE6kB,OAAOF,GAAa1mB,QAAQ,OAAQ,KAAK6mB,QAG5CC,cAAgB,SAAU/kB,cACxBglB,GAAM,IAAIC,WAAYC,gBAAgBllB,EAAM,aAC5C0kB,EAAUM,EAAIG,cAAc,QAAUH,EAAIG,cAAc,eAC1CV,oBAAoBC,GAGrCtF,MAAM,MACNY,IAAI,SAACzd,4CAASA,EAAK6c,MAAM,MAAMY,IAAI,SAACvF,iCAAW,CAAEA,MAAO,CAAC,CAAEA,MAAAA,gCAG1D2K,eAAiB,SAAUplB,SAGzBiL,EAAO,iCAFD,IAAIga,WAAYC,gBAAgBllB,EAAM,aAClC6D,iBAAiB,4CAGX,OAAXsN,UACHuJ,EAAM,gCAEYvJ,EAAGkU,2CAAY,KAA5BC,cACLf,iBAAiBgB,SAASD,EAAU3K,eAElC6K,EAAM,CAAE/K,MAAO,IACfA,EAAQgK,oBAAoBa,GAE9B7K,GAAO+K,EAAI/K,MAAMnZ,KAAK,CAAEmZ,MAAAA,IAE5BC,EAAIpZ,KAAKkkB,mCAGXva,EAAK3J,KAAKoZ,yCAGLzP,GAGHwa,UAAY,SAAUzlB,qBACnBA,EACJof,MAAM,MACNY,IAAI,SAACzd,4CAASA,EAAK6c,MAAM,MAAMY,IAAI,SAACvF,iCAAW,CAAEA,MAAO,CAAC,CAAEA,MAAAA,gCAG1DiL,UAAY,SAAU1lB,EAAM2lB,SACf,cAAbA,GAA4BnB,YAAYxkB,GACnColB,eAAeplB,GACA,cAAb2lB,EACFZ,cAAc/kB,GAKhBylB,UAAUzlB,IC9EJ,gBAAUvC,OACnBmoB,EACJnoB,EAAKooB,gBAAkB,SAAUzlB,GAC/BA,EAAEylB,mBAUJpoB,EAAKgF,iBAAmB,SAAU+X,EAAIsL,GACpCroB,EAAKsoB,OAAOvL,GAAM/c,EAAKsoB,OAAOvL,IAAO,GACrC/c,EAAKsoB,OAAOvL,GAAIjK,QAAQuV,IAU1BroB,EAAKuoB,oBAAsB,SAAUxL,EAAIsL,IACtCroB,EAAKsoB,OAAOvL,IAAO,IAAIlc,SAAQ,SAA4B2nB,EAAKtF,GAC3DmF,IAAOG,GACTxoB,EAAKsoB,OAAOvL,GAAIyF,OAAOU,EAAK,OAYlCljB,EAAKmC,cAAgB,SAAU4a,EAAIpa,OAG7B8lB,WACKC,IACPD,GAAmB,KAJrB9lB,EAAIoa,EAAGhX,KAAOgX,EAAKpa,GAAK,GACxBoa,EAAKA,EAAGhX,MAAQgX,EAKX/c,EAAKsoB,OAAOvL,UAGjB/c,EAAKsoB,OAAOvL,GAAIlc,SAAQ,SAA2BwnB,GACjD1lB,EAAE0F,IAAMrI,EAAKqI,IACb1F,EAAE+lB,eAAiBA,EACnBL,EAAG3N,MAAM1a,EAAKsB,KAAM,CAACqB,OAEhB8lB,GAETzoB,EAAK2oB,SAAW,kBACP/gB,KAAKuG,IACVnO,EAAKE,WAAW0oB,eACfnnB,OAAOonB,kBAAoB,IACzB7oB,EAAKqI,IAAIygB,8BACR9oB,EAAKqI,IAAI0gB,2BACT/oB,EAAKqI,IAAI2gB,0BACThpB,EAAKqI,IAAI4gB,yBACTjpB,EAAKqI,IAAI6gB,wBACT,KAGRlpB,EAAKqC,OAAS,SAAU8mB,MACjBnpB,EAAK4B,YAGNqF,EAgDFmiB,EA/CA9hB,EAAI,CACFL,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,uBAETW,EAAI,CACFgE,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,yBAET+mB,EAAK,CACHpiB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,uBAETgnB,EAAK,CACHriB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,yBAETinB,EAAK,CACHtiB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP4T,UAAU,EACVyN,mBAAmB,EACnBlnB,MAAO,qBAET8J,EAAoC,EAAhCpM,EAAKsC,MAAMoT,mBACfrM,EAAsC,EAAlCrJ,EAAKsC,MAAMsT,qBACfvJ,EAAoC,GAAhCrM,EAAKsC,MAAMoT,mBACf+T,EAAMzpB,EAAKsC,MAAM8P,eAAmD,EAAlCpS,EAAKsC,MAAMsT,qBAC7C8T,EAAQ1pB,EAAK2oB,WACbgB,EAAuC,aAAlC3pB,EAAKsC,MAAMkK,mBAAoC,EAAI,EACxDod,EAAa5pB,EAAKsC,MAAMkM,gBAAkBmb,EAC1CE,EAAyB7pB,EAAKsC,MAAM6P,4BAA8BwX,EAClEG,EAAa,EACbC,EAAY,EAEZ/e,GAAKhL,EAAKsM,UAAY,IAAIxG,OAC1BiH,EAAyB/M,EAAKgN,4BAC9BC,EAAqBjN,EAAKkN,wBAC1B8c,EAAKhqB,EAAKsC,MAAM6K,WAChByK,EAAI5X,EAAK4N,gBA+CX5N,EAAKiqB,YAAYhjB,EAAI,GACrBjH,EAAKiqB,YAAYliB,EAAI,GAChBd,EAAI,EAAGA,EAAI+D,EAAG/D,GAAK,EACtBjH,EAAKiqB,YAAYliB,EAAEd,GAAK6iB,EACxBA,KACI9pB,EAAK+R,MAAMvE,KAAKvG,IAAM+iB,IAAOhqB,EAAK+R,MAAMwS,MAAMtd,IAAM,IAAMjH,EAAKgY,OAEhEhY,EAAKoO,UAAYnH,GAAIjH,EAAK+R,MAAMwS,MAAMtd,IAAU,UAEjD+D,EAAI,IACNhL,EAAKiqB,YAAYliB,EAAEd,GAAK6iB,GAE1BC,EACEnS,EAAEL,QAAO,SAAsB2S,EAAaC,EAAQxiB,MAEzCiQ,EAAE5X,EAAKuN,OAAOoC,QAAQhI,IACpBsJ,cACTjR,EAAKiqB,YAAYhjB,EAAEU,GAAeuiB,EAC3BA,MAELE,EACFF,EAAclqB,EAAK6X,eAAe7X,EAAKuN,OAAOoC,QAAQhI,WACxD3H,EAAKiqB,YAAYhjB,EAAEU,GAAeyiB,EAC3BA,IACN,IAAM,EACPpqB,EAAKE,WAAWsP,aAClBsa,GAAcE,GAEZhqB,EAAKE,WAAWgP,YAClB4a,GAAc9pB,EAAKsC,MAAM6K,YAE3Bkd,IACIrqB,EAAKkL,aACPlL,EAAKmI,MAAQnI,EAAK4F,WAAWmY,YAC7B/d,EAAKkI,OAASlI,EAAK4F,WAAWoY,cAE9Bhe,EAAKkI,SAAWlI,EAAK4B,OAAOoc,cAC5Bhe,EAAKmI,QAAUnI,EAAK4B,OAAOmc,cAE3B/d,EAAKkI,OAASlI,EAAK4B,OAAOoc,aAC1Bhe,EAAKmI,MAAQnI,EAAK4B,OAAOmc,YACzB/d,EAAK8H,iBAAmB9H,EAAKsqB,KAAKxiB,kBAAoB,EACtD9H,EAAKgI,gBAAkBhI,EAAKsqB,KAAKtiB,iBAAmB,GAItDhI,EAAKqO,UAAUkc,IAAMxd,EAAyB8c,EAC9C7pB,EAAKqO,UAAUmc,KAAOvd,EAEtBwd,IAEAC,IAGI1qB,EAAKqO,UAAUgI,uBACS,SAAtBrW,EAAKsC,MAAM4F,QAAsBlI,EAAKkL,cACxClL,EAAKkI,QAAUuhB,GAEjBK,GAAcL,EACdY,IACAI,IACAC,KAEE1qB,EAAKqO,UAAUuI,qBACQ,SAArB5W,EAAKsC,MAAM6F,OAAqBnI,EAAKkL,cACvClL,EAAKmI,OAASshB,GAEhBM,GAAaN,EACbY,IACAI,IACAC,KAGFD,IACAzqB,EAAKqO,UAAU2H,YAAc+T,EAAY/pB,EAAKqO,UAAUlG,MACxDnI,EAAKqO,UAAU+H,aAAe0T,EAAa9pB,EAAKqO,UAAUnG,OAC1DlI,EAAKqO,UAAUsc,cAAgB3qB,EAAKqO,UAAUlG,MAAQ4hB,EACtD/pB,EAAKqO,UAAU0H,eACb/V,EAAKqO,UAAUlG,MAAQnI,EAAKqO,UAAUsc,cACtC3qB,EAAKsC,MAAM8P,eACX/I,EACAgD,EAMFrM,EAAKqO,UAAUuc,gBACZ5qB,EAAKqO,UAAUnG,OAAS6E,GAA0B+c,EACrD9pB,EAAKqO,UAAU8H,gBACbnW,EAAKqO,UAAUnG,OAASlI,EAAKqO,UAAUuc,eACvC5qB,EAAKsC,MAAM8P,eACX/I,EACAgD,EACFrM,EAAKqO,UAAU0H,eAAiBnO,KAAKiT,IACnC7a,EAAKqO,UAAU0H,eACf/V,EAAKsC,MAAMuoB,qBAEb7qB,EAAKqO,UAAU8H,gBAAkBvO,KAAKiT,IACpC7a,EAAKqO,UAAU8H,gBACfnW,EAAKsC,MAAMuoB,qBAGb5nB,EAAEgE,GAAKgG,EACPhK,EAAE8E,GAAK/H,EAAKkI,OAASlI,EAAKsC,MAAM8P,eAAiB/F,EACjDpJ,EAAEkF,MACAnI,EAAKmI,MAAQnI,EAAKsC,MAAM8P,eAAiBnF,EAAqBZ,EAAID,EACpEnJ,EAAEiF,OAASlI,EAAKsC,MAAM8P,eAAiBpS,EAAKsC,MAAMsT,qBAAuBvJ,EAEzEid,EAAGvhB,EAAI9E,EAAE8E,EAAI/H,EAAKsC,MAAMoT,mBACxB4T,EAAGnhB,MAAQnI,EAAKqO,UAAU0H,eAC1BuT,EAAGphB,OAASlI,EAAKsC,MAAMwoB,kBAEvBxjB,EAAEL,GACAjH,EAAKmI,MACLnI,EAAKsC,MAAM8P,eACXpS,EAAKsC,MAAMsT,qBACXvJ,EACF/E,EAAES,GAAKgF,EACPzF,EAAEa,MAAQnI,EAAKsC,MAAM8P,eAAiBpS,EAAKsC,MAAMsT,qBAAuBvJ,EACxE/E,EAAEY,OACAlI,EAAKkI,OAAS6E,EAAyB/M,EAAKsC,MAAM8P,eAAiB/F,EAAID,EAEzEid,EAAGpiB,EAAIK,EAAEL,EAAIjH,EAAKsC,MAAMoT,mBACxB2T,EAAGlhB,MAAQnI,EAAKsC,MAAMwoB,kBACtBzB,EAAGnhB,OAASlI,EAAKqO,UAAU8H,gBAE3BoT,EAAGtiB,EAAIhE,EAAEgE,EAAIhE,EAAEkF,MAAQiE,EACvBmd,EAAGxhB,EAAIT,EAAES,EAAIT,EAAEY,OAASkE,EACxBmd,EAAGphB,MAAQnI,EAAKsC,MAAM8P,eAAiBpS,EAAKsC,MAAMsT,qBAClD2T,EAAGrhB,OAASlI,EAAKsC,MAAM8P,eAAiBpS,EAAKsC,MAAMsT,qBACnD5V,EAAKqO,UAAUoH,SAAW,CACxBK,cAAe7S,EACf4S,cAAeyT,EACfpT,YAAa5O,EACb2O,YAAaoT,EACbrS,OAAQuS,GAEVvpB,EAAKqO,UAAU0c,IAAM,CACnBzjB,EAAGA,EACH4B,EAAGjG,GAELjD,EAAKqO,UAAU2c,IAAM,CACnB1jB,EAAG+hB,EACHngB,EAAGogB,GAGLtpB,EAAKirB,KAAOrjB,KAAKiT,IACf,EACA7a,EAAK2N,YAAY7H,OAAS,EAAI9F,EAAKE,WAAWgrB,mBAG3ClrB,EAAKkL,cACRlL,EAAK4B,OAAOuG,MAAQnI,EAAKmI,MAAQuhB,EACjC1pB,EAAK4B,OAAOsG,OAASlI,EAAKkI,OAASwhB,EACnC1pB,EAAKqI,IAAI2P,MAAM0R,EAAOA,IAGxB1pB,EAAKmrB,kBACLnrB,EAAKorB,QAAO,GACRjC,GACFnpB,EAAK6I,MAAK,GAEZ7I,EAAKmC,cAAc,SAAU,KACtB,WAjNEuoB,IACP1qB,EAAKqO,UAAUgI,qBACS,SAArBrW,EAAKsC,MAAM6F,OACV4hB,EAAY/pB,EAAKqO,UAAUlG,OACF,WAAzBnI,EAAKsC,MAAM+oB,WACY,WAAzBrrB,EAAKsC,MAAM+oB,UACbrrB,EAAKqO,UAAUmI,qBAAuBuT,EAAY/pB,EAAKqO,UAAUlG,MACjEnI,EAAKqO,UAAUuI,mBACU,SAAtB5W,EAAKsC,MAAM4F,QACV4hB,EAAa9pB,EAAKqO,UAAUnG,QACH,WAAzBlI,EAAKsC,MAAMgpB,WACY,WAAzBtrB,EAAKsC,MAAMgpB,UACbtrB,EAAKqO,UAAUwI,mBAAqBiT,EAAa9pB,EAAKqO,UAAUnG,gBAEzDuiB,IACPzqB,EAAKqO,UAAUlG,MAAQnI,EAAKmI,MAAQ8E,EACpCjN,EAAKqO,UAAUnG,OAASlI,EAAKkI,OAAS6E,WAE/Bsd,IACHrqB,EAAKkL,cAGTke,EAAO,CAELlhB,OAAQ6E,EAAyB+c,EAAaF,EAAa,EAC3DzhB,MAAO4hB,EAAY9c,EAAqB2c,IAEzC,QAAS,UAAU/oB,SAAQ,SAAU0qB,IAGgB,IAAlD,CAAC,YAAQrkB,GAAWyU,QAAQ3b,EAAKsC,MAAMipB,MACyB,IAAhE,CAAC,YAAQrkB,GAAWyU,QAAQ3b,EAAKwrB,oBAAoBD,IAErDvrB,EAAKyrB,gBAAgBF,GAAOnC,EAAKmC,GAAO,MAES,GAAjD,CAAC,YAAQrkB,GAAWyU,QAAQ3b,EAAKsC,MAAMipB,MACwB,GAA/D,CAAC,YAAQrkB,GAAWyU,QAAQ3b,EAAKwrB,oBAAoBD,MAErDvrB,EAAKyrB,gBAAgBF,GAAOvrB,EAAKsC,MAAMipB,GACnCvrB,EAAKuB,cACPvB,EAAK4B,OAAOU,MAAMipB,GAAOvrB,EAAKsC,MAAMipB,WA2K9CvrB,EAAKorB,OAAS,SAAUM,OAClB9T,EAAI5X,EAAK4N,YACX5C,GAAKhL,EAAKsM,UAAY,IAAIxG,OAC1BkkB,EAAKhqB,EAAKsC,MAAM6K,eAElBnN,EAAKqP,eAAiBzH,KAAK+jB,MACzB3gB,GAAKhL,EAAKqO,UAAUc,UAAYnP,EAAKqO,UAAU+H,cAAgB,KAEjEpW,EAAKqP,eAAiBzH,KAAKiT,IAAI7a,EAAKqP,eAAgB,GACpDrP,EAAKoP,eAAiBpP,EAAKiqB,YAAYliB,EAAE/H,EAAKqP,gBAEV,IAAhCrP,EAAKqO,UAAU+H,eACjBpW,EAAKqP,eAAiB,GAExBrP,EAAKoP,eAAiB,EACtBpP,EAAK0P,gBAAkB1P,EAAKkQ,aAC5BlQ,EAAKuO,gBAAkB,EAErBvO,EAAKoP,eAAiBpP,EAAKqO,UAAUc,WACrCnP,EAAKqP,eAAiBrP,EAAKsM,SAASxG,QAGpC9F,EAAKqP,gBAAkB,EACvBrP,EAAKoP,eAAiBpP,EAAKiqB,YAAYliB,EAAE/H,EAAKqP,qBAG9CrP,EAAKuO,gBAAkBvO,EAAKqO,UAAUC,WAAa,GACnDtO,EAAK0P,gBAAkBkI,EAAE9R,QAEzB9F,EAAKuO,gBAAkBvO,EAAKiqB,YAAYhjB,EAAEjH,EAAK0P,iBAC/C1P,EAAK0P,iBAAmB,EAEtBkI,EAAE9R,OAAS,IACb9F,EAAK0P,gBAAkB9H,KAAKiT,IAAI7a,EAAK0P,gBAAkB,EAAG,GAC1D1P,EAAKuO,iBAAmBvO,EAAK6X,eAC3B7X,EAAKuN,OAAOoC,QAAQ3P,EAAK0P,oBAGxB1P,EAAKsM,UAAY,IAAIxG,OAAS,IACjC9F,EAAKqP,eAAiBzH,KAAKiT,IAAI7a,EAAKqP,eAAiB,EAAG,GACxDrP,EAAKoP,eAAiBxH,KAAKiT,IACzB7a,EAAKoP,gBACFpP,EAAKsM,SAAStM,EAAKqP,iBACfrP,EAAK+R,MAAMvE,KAAKxN,EAAKqP,iBAAmB2a,IACxChqB,EAAK+R,MAAMwS,MAAMvkB,EAAKqP,iBAAmB,GAC1C2a,GACFhqB,EAAKgY,MACT,IAGJhY,EAAK4rB,cAAgB,GAChBF,GACH1rB,EAAK6I,MAAK,GAIZzG,sBAAsBpC,EAAKmrB,iBAC3BnrB,EAAKmC,cAAc,SAAU,CAC3BooB,IAAKvqB,EAAKqO,UAAUc,UACpBqb,KAAMxqB,EAAKqO,UAAUC,cAGzBtO,EAAK6rB,UAAY,SAAUlpB,EAAGmpB,OACxB9rB,EAAK+rB,cAAe/rB,EAAKgsB,OAG7BhsB,EAAKuZ,MAAQuS,GAAe9rB,EAAKisB,YAAYtpB,OAI3Ce,EAEAwoB,EACAC,EAIAC,EAVEC,GACC1pB,EAAE2pB,SAAW3pB,EAAE4pB,SAAWvsB,EAAKE,WAAWssB,2BAC1CxsB,EAAKE,WAAWusB,oBAEnB7U,EAAI5X,EAAK4N,YAGT3G,EAAIjH,EAAKuZ,MAAMtS,EACfc,EAAI/H,EAAKuZ,MAAMxR,EACfX,EAAOpH,EAAK0sB,UAAUzlB,EAAGc,GAEzBgV,EAAK,CAAE4P,YAAahqB,EAAGyE,KAAMA,EAAMH,EAAGA,EAAGc,EAAGA,GAC5C6kB,EAAe5sB,EAAK8M,eACtB+f,aAAa7sB,EAAK8sB,aACb9sB,EAAK+sB,SAAS,CAAE9lB,EAAGA,EAAGc,EAAGA,MAC5B/H,EAAK0Z,UAAW,IAEd1Z,EAAKmC,cAAc,YAAa4a,OAGhC3V,GAAQpH,EAAK8M,cACf9M,EAAKgtB,mBAAqBhtB,EAAK8M,YAAYpF,WAAaN,EAAKM,SAC7D1H,EAAKitB,sBACHjtB,EAAK8M,YAAYnF,cAAgBP,EAAKO,YACxC3H,EAAKktB,oBACHltB,EAAKgtB,oBAAsBhtB,EAAKitB,uBACjC,MAAO,SAAU,QAAQpsB,SAAQ,SAAUssB,GACtCntB,EAAKmtB,EAAS,qBAChBpQ,EAAG3V,KAAOwlB,EACV5sB,EAAKmC,cAAcgrB,EAAS,WAAYpQ,GACxCA,EAAG3V,KAAOA,EACVpH,EAAKmC,cAAcgrB,EAAS,YAAapQ,QAI/C/c,EAAK8M,YAAc1F,EAEnBpH,EAAKqc,OAAS,IACTrc,EAAKotB,cAAgBhmB,IACxBpH,EAAKqtB,SAAWjmB,EAChBpH,EAAKkT,SAAW9L,EAAKuS,YACrB3Z,EAAKstB,OAASlmB,EAAKqP,QACE,SAAjBrP,EAAKqP,UACPzW,EAAKstB,OAAS,UACdttB,EAAKqc,OAAS,CACZ3U,SAAUN,EAAKM,SACfC,YAAaP,EAAKO,cAGlB3H,EAAKutB,WAAavtB,EAAKmU,eAAe,IACxCiY,EAAQ,CACNnlB,EAAGW,KAAKoT,IAAIhb,EAAKwtB,UAAUvmB,EAAIA,GAC/Bc,EAAGH,KAAKoT,IAAIhb,EAAKwtB,UAAUzlB,EAAIA,KAES,IAAtC/H,EAAKytB,gBAAgB9lB,aAAsBhF,EAAE+qB,WAC/C1tB,EAAKytB,gBAAkB,CACrB/lB,SAAU1H,EAAKiQ,WAAWvI,SAC1BC,YAAa3H,EAAKiQ,WAAWtI,cAGjCukB,EAAa,CACX3B,IAAK3iB,KAAKuG,IAAInO,EAAKytB,gBAAgB/lB,SAAUN,EAAKM,UAClD8iB,KAAM5iB,KAAKuG,IAAInO,EAAKytB,gBAAgB9lB,YAAaP,EAAKO,aACtDgmB,OAAQ/lB,KAAKiT,IAAI7a,EAAKytB,gBAAgB/lB,SAAUN,EAAKM,UACrDkmB,MAAOhmB,KAAKiT,IAAI7a,EAAKytB,gBAAgB9lB,YAAaP,EAAKO,eAEf,IAAtC3H,EAAKytB,gBAAgB9lB,cACvBwkB,EAAUnsB,EAAK6tB,qBACf3B,EAAW1B,MAAQ,EACnB0B,EAAW0B,MAAQhW,EAAE9R,OAAS,EAC9BomB,EAAW3B,IAAM3iB,KAAKuG,IAAIge,EAAQ5B,IAAKnjB,EAAKM,UAC5CwkB,EAAWyB,OAAS/lB,KAAKiT,IAAIsR,EAAQwB,OAAQvmB,EAAKM,WAGlD1H,EAAKytB,gBAAgB/lB,WAAaN,EAAKM,UACvC1H,EAAKytB,gBAAgB9lB,cAAgBP,EAAKO,cAE1C3H,EAAK8tB,iBAAkB,GAGvB9tB,EAAKktB,qBACQ,IAAZd,EAAMnlB,GAAuB,IAAZmlB,EAAMrkB,GACU,QAAlC/H,EAAKE,WAAWiQ,iBAGqB,QAAlCnQ,EAAKE,WAAWiQ,gBACuB,IAAtCnQ,EAAKytB,gBAAgB9lB,cACvB3H,EAAKgtB,oBAGA,GAAsC,QAAlChtB,EAAKE,WAAWiQ,iBACpBnQ,EAAK+tB,yBAAwC7mB,IAAlBE,EAAKM,aAWnC1H,EAAK0b,WAAWtU,EAAKM,UACnB1H,EAAK0b,WAAWtU,EAAKM,WAAa,IAE4B,IAA9D1H,EAAK0b,WAAWtU,EAAKM,UAAUiU,QAAQvU,EAAKO,aAC5C,CACA3H,EAAK0b,WAAWtU,EAAKM,UAAU7D,KAAKuD,EAAKO,iBACnCqmB,EAAQ,CACZtS,WAAY1b,EAAK0b,WACjBuS,aAAcjuB,EAAKkuB,kBACnBC,cAAenuB,EAAKouB,mBACpBC,gBAAiBruB,EAAK6tB,sBAExB7tB,EAAKmC,cAAc,mBAAoB6rB,SArBvChuB,EAAK0b,WAAWtU,EAAKM,YACyC,IAA9D1H,EAAK0b,WAAWtU,EAAKM,UAAUiU,QAAQvU,EAAKO,cAE5C3H,EAAK0b,WAAWtU,EAAKM,UAAU8a,OAC7BxiB,EAAK0b,WAAWtU,EAAKM,UAAUiU,QAAQvU,EAAKO,aAC5C,QATN3H,EAAKsuB,UAAUlnB,EAAKM,SAAU2kB,EAAM,MAAM,QA+B1CrsB,EAAKquB,iBACLnC,EAAW3B,MAAQvqB,EAAKquB,gBAAgB9D,KACxC2B,EAAW1B,OAASxqB,EAAKquB,gBAAgB7D,MACzC0B,EAAWyB,SAAW3tB,EAAKquB,gBAAgBV,QAC3CzB,EAAW0B,QAAU5tB,EAAKquB,gBAAgBT,OAC3CvB,MAEDrsB,EAAK0b,WAAa,GAClByQ,EAAUD,EAC4B,QAAlClsB,EAAKE,WAAWiQ,kBACbzM,EAAIyoB,EAAQ5B,IAAK7mB,GAAKyoB,EAAQwB,OAAQjqB,GAAK,EAC9C1D,EAAKsuB,UAAU5qB,GAAG,EAAM,MAAM,QAEH,IAApBwoB,EAAW3B,KACpBvqB,EAAKuuB,WAAWpC,GAAS,MAIzBnsB,EAAKE,WAAWsuB,sBAAuB,KACrCC,EAAkBrC,EAAMrkB,EAAI/H,EAAKE,WAAWwuB,iBAC5CC,EAAoBvC,EAAMnlB,EAAIjH,EAAKE,WAAWwuB,iBAE9CD,IAAoBE,EACtB3uB,EAAK4uB,eAAejsB,GAAI,EAAGoF,EAAGskB,GACvBsC,IAAsBF,EAC7BzuB,EAAK4uB,eAAejsB,EAAGsE,GAAI,EAAGolB,GACvBsC,GAAqBF,GAC5BzuB,EAAK4uB,eAAejsB,EAAGsE,EAAGc,EAAGskB,QAE/BrsB,EAAK4uB,eAAejsB,EAAGsE,EAAGc,EAAGskB,GAInCrsB,EAAKktB,qBAAsB,EAC3BltB,EAAKgtB,oBAAqB,EAC1BhtB,EAAKitB,uBAAwB,EAC7BjtB,EAAK6I,MAAK,MAEZ7I,EAAK6uB,MAAQ,SAAUlsB,EAAGmpB,OACpBpoB,EACForB,EAAiBrsB,KAAKugB,UAAUhjB,EAAK6tB,sBACrCxB,GACG1pB,EAAE2pB,SAAW3pB,EAAE4pB,SAAWvsB,EAAKE,WAAWssB,2BAC1CxsB,EAAKE,WAAWusB,oBACnB3hB,EAAMghB,GAAe9rB,EAAKisB,YAAYtpB,MACxC3C,EAAK8M,YAAc9M,EAAK0sB,UAAU5hB,EAAI7D,EAAG6D,EAAI/C,QACfb,IAA1BlH,EAAK8M,YAAYqT,QAsBjBngB,EAAKgsB,OACPhsB,EAAK+uB,UAEH/uB,EAAK8tB,gBACP9tB,EAAK8tB,iBAAkB,UAGzBpqB,EAAI1D,EAAK8M,aAEP9M,EAAKmC,cAAc,QAAS,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,eAItD9M,EAAK0Z,cAKL,IADH,CAAC,gBAAiB,oBAAoBiC,QAAQ3b,EAAK8M,YAAYxK,QAE9D+pB,GAEDrsB,EAAKgvB,cAActrB,EAAEiE,YAAajE,EAAEgE,UAEL,SAA7B1H,EAAK8M,YAAY2J,QAAoB,IACR,eAA3BzW,EAAK8M,YAAYxK,aACnBtC,EAAKivB,YACLjvB,EAAK6I,YACLqmB,OAG6B,qBAA3BlvB,EAAK8M,YAAYxK,MAA8B,IACC,SAA9CtC,EAAKE,WAAWivB,iCACdnvB,EAAKogB,UAAY1c,EAAEkN,OAAO1L,KAC5BlF,EAAK4gB,eACqB,QAAxB5gB,EAAK4gB,eAA2B,OAAS,MAE3C5gB,EAAK4gB,eAAiB,MAExB5gB,EAAKqR,MAAM3N,EAAEkN,OAAO1L,KAAMlF,EAAK4gB,qBAC/BsO,OAGgD,WAA9ClvB,EAAKE,WAAWivB,iCAClBnvB,EAAKovB,aAAa1rB,EAAEkN,OAAOQ,MAAOib,EAAM1pB,EAAE+qB,eAC1C1tB,EAAK6I,UAIT7I,EAAK0b,WAAWhY,EAAEgE,UAAY1H,EAAK0b,WAAWhY,EAAEgE,WAAa,IAEzB,QAAlC1H,EAAKE,WAAWiQ,eACW,kBAA3BnQ,EAAK8M,YAAYxK,QAGY,kBAA3BtC,EAAK8M,YAAYxK,OACjBtC,EAAKE,WAAW8e,MAChBlU,EAAI7D,EAAI,GACR6D,EAAI7D,EAAIjH,EAAK8M,YAAY7F,EACvBjH,EAAKsC,MAAMkd,eACTxf,EAAKsC,MAAMgd,oBACXtf,EAAKsC,MAAM8c,qBACXpf,EAAKsC,MAAM+sB,sBACfvkB,EAAI/C,EAAI/H,EAAK8M,YAAY/E,EACvB/H,EAAKsC,MAAMod,gBACT1f,EAAKsC,MAAM4c,mBACXlf,EAAKsC,MAAM+sB,sBACfvkB,EAAI/C,EAAI,cAER/H,EAAKsvB,WAAW5rB,EAAEgE,UAIlB/E,EAAE+qB,WAAarB,IACjBrsB,EAAKquB,gBAAkBruB,EAAK6tB,qBAC5B7tB,EAAKuuB,gBAAWrnB,GAAW,IAG/BgoB,IACAlvB,EAAK6I,MAAK,YAjGDqmB,QACHnS,EACFwS,EAAKvvB,EAAK6tB,qBAERiB,IAAmBrsB,KAAKugB,UAAUuM,KAGtCxS,EAAK,CACHrB,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAK6tB,qBACtBM,cAAenuB,EAAKouB,oBAEtB1lB,OAAOkc,eAAe7H,EAAI,eAAgB,CACxC+H,IAAK,kBACI9kB,EAAKkuB,qBAGhBluB,EAAKmC,cAAc,mBAAoB4a,MAkF3C/c,EAAKwvB,iBAAmB,SAAU7sB,OAC5BmI,EAAK7D,EAAGc,SACZ+C,EAAM9K,EAAKisB,YAAYtpB,GACvBsE,EAAIjH,EAAKyvB,sBAAwB3kB,EAAI7D,EAAIjH,EAAKwtB,UAAUvmB,EACxDc,EAAI/H,EAAK0vB,uBAAyB5kB,EAAI/C,EAAI/H,EAAKwtB,UAAUzlB,EACrDd,EAAIjH,EAAKsC,MAAMqtB,iBACjB1oB,EAAIjH,EAAKsC,MAAMqtB,gBAEb5nB,EAAI/H,EAAKsC,MAAMstB,eACjB7nB,EAAI/H,EAAKsC,MAAMstB,eAGf5vB,EAAKmC,cAAc,eAAgB,CACjC8E,EAAGA,EACHc,EAAGA,EACHqlB,aAAcptB,EAAKotB,iBAMrBptB,EAAKqO,UAAUC,WACbtO,EAAKqO,UAAU2H,YAAchW,EAAKE,WAAW2vB,kBAC7B,cAAlB7vB,EAAKkT,WAELlT,EAAKqC,QAAO,GACZrC,EAAKqO,UAAUC,YAAcrH,GAET,cAAlBjH,EAAKkT,UACPlT,EAAK+R,MAAMpC,QAC0B,kBAAnC3P,EAAKotB,aAAaxc,OAAOtO,MACrB,aACAtC,EAAKotB,aAAaxY,iBACpB3N,GAIK,IAFP,CAAC,gBAAiB,cAAc0U,QAC9B3b,EAAKotB,aAAaxc,OAAOtO,QAG3BtC,EAAKqC,QAAO,QAEdrC,EAAK8vB,oBAGe,cAAlB9vB,EAAKkT,UACHlT,EAAKotB,aAAa3hB,QACpBzL,EAAK+R,MAAMwS,MAAMvkB,EAAKotB,aAAa1lB,UAAYK,EACtC/H,EAAKE,WAAW6vB,gBACzB/vB,EAAKsC,MAAM6K,WAAapF,EAExB/H,EAAK+R,MAAMvE,KAAKxN,EAAKotB,aAAa1lB,UAAYK,EAEhD/H,EAAKmC,cAAc,YAAa,CAAE8a,IAAKlV,SACvC/H,EAAK8vB,yBAGP9vB,EAAK4rB,cAAgB,MAEvB5rB,EAAKgwB,eAAiB,WACpBhwB,EAAKqC,SACL8D,SAAS8pB,KAAK1H,oBACZ,YACAvoB,EAAKwvB,kBACL,GAEFrpB,SAAS8pB,KAAK1H,oBAAoB,UAAWvoB,EAAKgwB,gBAAgB,GAClEhwB,EAAKkwB,iBACLlwB,EAAK6I,MAAK,GACV7I,EAAK8tB,iBAAkB,GAEzB9tB,EAAKmwB,WAAa,SAAUxtB,OACtBmI,EAAM9K,EAAKisB,YAAYtpB,UAEzB3C,EAAKE,WAAWkwB,mBAChBpwB,EAAKqZ,sBAGE,IAFP,CAAC,wBAAyB,uBAAuBsC,QAC/C3b,EAAKqwB,mBAGPrwB,EAAKqZ,oBAAoBpS,GAAKtE,EAAE2tB,UAChCtwB,EAAKqZ,oBAAoBtR,GAAKpF,EAAE4tB,UAChCvwB,EAAKqZ,oBAAoBpS,EAAIW,KAAKuG,IAChCnO,EAAKmI,MAAQnI,EAAKsC,MAAM8P,eACxBxK,KAAKiT,IAAI,EAAG7a,EAAKqZ,oBAAoBpS,IAEvCjH,EAAKqZ,oBAAoBtR,EAAIH,KAAKuG,IAChCnO,EAAKkI,OAASlI,EAAKsC,MAAM8P,eACzBxK,KAAKiT,IAAI,EAAG7a,EAAKqZ,oBAAoBtR,IAEvC+C,EAAM9K,EAAKqZ,qBAEbrZ,EAAKwwB,WAAaxwB,EAAK0sB,UAAU5hB,EAAI7D,EAAG6D,EAAI/C,GAAG0O,QAEzB,0BAApBzW,EAAKwwB,YACoB,0BAAzBxwB,EAAKqwB,iBAELrwB,EAAKqwB,gBAAkB,wBACvBrwB,EAAKwtB,UAAY1iB,EACjB9K,EAAKywB,YAAYjG,KAAOxqB,EAAKqO,UAAUC,gBACvCue,aAAa7sB,EAAK8sB,cAIE,wBAApB9sB,EAAKwwB,YACoB,wBAAzBxwB,EAAKqwB,iBAELrwB,EAAKqwB,gBAAkB,sBACvBrwB,EAAKwtB,UAAY1iB,EACjB9K,EAAKywB,YAAYlG,IAAMvqB,EAAKqO,UAAUc,eACtC0d,aAAa7sB,EAAK8sB,eAIO,wBAAzB9sB,EAAKqwB,iBACe,wBAApBrwB,EAAKwwB,aAELxwB,EAAKwwB,WAAa,uBAGO,0BAAzBxwB,EAAKqwB,iBACe,0BAApBrwB,EAAKwwB,aAELxwB,EAAKwwB,WAAa,yBAEpB3D,aAAa7sB,EAAK8sB,mBACiC,IAA/C9sB,EAAK0wB,YAAY/U,QAAQ3b,EAAKwwB,cAGV,wBAApBxwB,EAAKwwB,WACPxwB,EAAKqO,UAAUc,UACbnP,EAAKywB,YAAYlG,KAChBzf,EAAI/C,EAAI/H,EAAKwtB,UAAUzlB,GAAK/H,EAAKqO,UAAUuc,eACjB,wBAApB5qB,EAAKwwB,YACdxwB,EAAKqO,UAAUc,WAAanP,EAAKirB,KAAOjrB,EAAKsC,MAAM6K,WACnDnN,EAAK8sB,YAAc6D,WACjB3wB,EAAKmwB,WACLnwB,EAAKE,WAAW0wB,iBAChBjuB,IAE2B,2BAApB3C,EAAKwwB,aACdxwB,EAAKqO,UAAUc,WAAanP,EAAKirB,KAAOjrB,EAAKsC,MAAM6K,WACnDnN,EAAK8sB,YAAc6D,WACjB3wB,EAAKmwB,WACLnwB,EAAKE,WAAW0wB,iBAChBjuB,IAGoB,0BAApB3C,EAAKwwB,WACPxwB,EAAKqO,UAAUC,WACbtO,EAAKywB,YAAYjG,MAChB1f,EAAI7D,EAAIjH,EAAKwtB,UAAUvmB,GAAKjH,EAAKqO,UAAUsc,cACjB,4BAApB3qB,EAAKwwB,YACdxwB,EAAKqO,UAAUC,YAActO,EAAKE,WAAW2wB,yBAC7C7wB,EAAK8sB,YAAc6D,WACjB3wB,EAAKmwB,WACLnwB,EAAKE,WAAW0wB,iBAChBjuB,IAE2B,2BAApB3C,EAAKwwB,aACdxwB,EAAKqO,UAAUC,YAActO,EAAKE,WAAW2wB,yBAC7C7wB,EAAK8sB,YAAc6D,WACjB3wB,EAAKmwB,WACLnwB,EAAKE,WAAW0wB,iBAChBjuB,QAIN3C,EAAK8wB,eAAiB,WACpBjE,aAAa7sB,EAAK8sB,aACd3mB,SAAS4qB,iBACX5qB,SAAS4qB,kBAEX5qB,SAASoiB,oBAAoB,YAAavoB,EAAKmwB,YAAY,IAE7DnwB,EAAKgxB,YAAc,SAAUruB,OACvBmI,EACF7D,EACAc,EACAkpB,EAAiC,mBAAlBjxB,EAAKkT,SACpBge,EAA+B,gBAAlBlxB,EAAKkT,SAEpBjM,GADA6D,EAAM9K,EAAKisB,YAAYtpB,IACfsE,EAAIjH,EAAKwtB,UAAUvmB,EAC3Bc,EAAI+C,EAAI/C,EAAI/H,EAAKwtB,UAAUzlB,GACtB/H,EAAKE,WAAWixB,uBAAyBF,IAGzCjxB,EAAKE,WAAWkxB,oBAAsBF,GAIzClxB,EAAKmC,cAAc,aAAc,CAC/BwqB,YAAahqB,EACb0uB,OAAQrxB,EAAKytB,gBACb/nB,OAAQ1F,EAAK8M,YACboG,SAAUlT,EAAKkT,aAMjBtL,KAAKoT,IAAI/T,GAAKjH,EAAKE,WAAWoxB,iBAC9B1pB,KAAKoT,IAAIjT,GAAK/H,EAAKE,WAAWoxB,mBAE9BtxB,EAAKmU,cAAgBnU,EAAKotB,aAC1BptB,EAAK0U,cAAgB1U,EAAK8M,YAC1B9M,EAAKmU,cAAcC,WAAa,CAC9BnN,EAAGA,EACHc,EAAGA,GAEL/H,EAAK4uB,eACHjsB,EACAsuB,EAAenmB,EAAI7D,GAAK,EACxBiqB,EAAapmB,EAAI/C,GAAK,GACtB,KAIN/H,EAAKuxB,gBAAkB,SAAU5uB,OAC3B6uB,EACFC,EACAC,EACAC,EAAK,eACY3xB,EAAKuN,OAAOC,sBACTxN,EAAKuN,OAAOoC,SAEhCjM,EAAI,eACa,4BACG,mBAClB1D,EAAKkT,UACT/M,SAAS8pB,KAAK1H,oBAAoB,YAAavoB,EAAKgxB,aAAa,GACjE7qB,SAAS8pB,KAAK1H,oBAAoB,UAAWvoB,EAAKuxB,iBAAiB,GAEjEvxB,EAAKmU,eACLnU,EAAK0U,gBACe,mBAAlB1U,EAAKkT,UACLlT,EAAK0U,cAAcE,iBAAmB,GACtC5U,EAAK0U,cAAcE,gBAAkB5U,EAAK4N,YAAY9H,QACnC,gBAAlB9F,EAAKkT,UACJlT,EAAK0U,cAAchN,UAAY,GAC/B1H,EAAK0U,cAAchN,SAAW1H,EAAKsM,SAASxG,SAChD9F,EAAKmU,cAAczQ,KAAO1D,EAAK0U,cAAchR,KAC5C1D,EAAKmC,cAAc,UAAW,CAC7BwqB,YAAahqB,EACb0uB,OAAQrxB,EAAKmU,cACbzO,OAAQ1F,EAAK0U,cACbxB,SAAUlT,EAAKkT,aAGjBlT,EAAK8tB,iBAAkB,EACvB0D,EAASG,EAAG3xB,EAAKkT,UAAUyI,QAAQ3b,EAAKmU,cAAczQ,IACtD+tB,EAASE,EAAG3xB,EAAKkT,UAAUyI,QAAQ3b,EAAK0U,cAAchR,IAChC,mBAAlB1D,EAAKkT,UACPye,EAAG3xB,EAAKkT,UAAUsP,OAAOgP,EAAQ,GACjCG,EAAG3xB,EAAKkT,UAAUsP,OAAOiP,EAAQ,EAAGzxB,EAAKmU,cAAczQ,IACvD1D,EAAKuN,OAAOoC,QAAUgiB,EAAG3xB,EAAKkT,YAG9Bwe,EAAQ1xB,EAAKsM,SAASklB,GACtBxxB,EAAKsM,SAASklB,GAAUxxB,EAAKsM,SAASmlB,GACtCzxB,EAAKsM,SAASmlB,GAAUC,GAE1B1xB,EAAKqC,SACLrC,EAAKkwB,kBAEPlwB,EAAKmU,mBAAgBjN,EACrBlH,EAAK0U,mBAAgBxN,EACrBlH,EAAK6I,MAAK,IAEZ7I,EAAK4xB,SAAW,SAAUjvB,OAEtB3C,EAAKmC,cAAc,SAAU,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,mBAIxDhC,EAAM9K,EAAKisB,YAAYtpB,GAC3B3C,EAAK4jB,WAAa,CAChB3c,EAAGjH,EAAK8M,YAAYnF,YAAc3H,EAAKytB,gBAAgB9lB,YACvDI,EAAG/H,EAAK8M,YAAYpF,SAAW1H,EAAKytB,gBAAgB/lB,WAGpDE,KAAKoT,IAAIlQ,EAAI7D,GAAKjH,EAAKE,WAAWoxB,iBAClC1pB,KAAKoT,IAAIlQ,EAAI/C,GAAK/H,EAAKE,WAAWoxB,kBAElCX,YAAW,WACT3wB,EAAK4uB,eAAejsB,EAAGmI,EAAI7D,EAAG6D,EAAI/C,GAAG,KACpC,KAGP/H,EAAK6xB,aAAe,SAAUlvB,GAC5BwD,SAAS8pB,KAAK1H,oBAAoB,YAAavoB,EAAK4xB,UAAU,GAC9DzrB,SAAS8pB,KAAK1H,oBAAoB,UAAWvoB,EAAK6xB,cAAc,OAC5DxoB,EAAIrJ,EAAK6tB,wBAEX7tB,EAAKmC,cAAc,UAAW,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,qBAE3D9M,EAAK8U,qBAAkB5N,EACvBlH,EAAK4jB,gBAAa1c,OAClBlH,EAAK6I,MAAK,GAGR7I,EAAK4jB,aACP5jB,EAAKuJ,OACHvJ,EAAK8U,gBACLzL,EAAEmhB,KAAOxqB,EAAK4jB,WAAW3c,EACzBoC,EAAEkhB,IAAMvqB,EAAK4jB,WAAW7b,GAE1B/H,EAAK8xB,cAAc9xB,EAAK4jB,WAAW3c,EAAGjH,EAAK4jB,WAAW7b,IAExD/H,EAAK8U,qBAAkB5N,EACvBlH,EAAK4jB,gBAAa1c,EAClBlH,EAAK6I,MAAK,IAEZ7I,EAAK+xB,WAAa,SAAUpvB,OAExB3C,EAAKmC,cAAc,eAAgB,CACjCwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,mBAKXhC,EAAM9K,EAAKisB,YAAYtpB,GAC3B3C,EAAK8tB,iBAAkB,EACvB9tB,EAAK+S,qBAAuBjI,EAE1B9K,EAAK8M,kBACyB5F,IAA9BlH,EAAK8M,YAAYpF,UACC,sBAAlB1H,EAAKkT,WAELlT,EAAKqO,UAAUc,UAAY,EAC3BnP,EAAKoO,UAAYpO,EAAK8M,YAAYpF,SAAW,GAG7C1H,EAAK8M,kBAC4B5F,IAAjClH,EAAK8M,YAAYnF,aACC,yBAAlB3H,EAAKkT,WAELlT,EAAKqO,UAAUC,WAAa,EAC5BtO,EAAKkQ,aAAelQ,EAAK8M,YAAYnF,YAAc,IAGnDC,KAAKoT,IAAIlQ,EAAI7D,GAAKjH,EAAKE,WAAWoxB,iBAClC1pB,KAAKoT,IAAIlQ,EAAI/C,GAAK/H,EAAKE,WAAWoxB,kBAElCX,YAAW,WACT3wB,EAAK4uB,eAAejsB,EAAGmI,EAAI7D,EAAG6D,EAAI/C,GAAG,KACpC,KAGP/H,EAAKgyB,eAAiB,SAAUrvB,MAC9BwD,SAAS8pB,KAAK1H,oBAAoB,YAAavoB,EAAK+xB,YAAY,GAChE5rB,SAAS8pB,KAAK1H,oBAAoB,UAAWvoB,EAAKgyB,gBAAgB,GAClEhyB,EAAK+S,0BAAuB7L,EAE1BlH,EAAKmC,cAAc,gBAAiB,CAClCwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,qBAGb9M,EAAKoO,UAAYpO,EAAKiyB,gBAAgBhrB,EACtCjH,EAAKkQ,aAAelQ,EAAKiyB,gBAAgBlqB,OACzC/H,EAAK6I,MAAK,GAGZ7I,EAAK6I,MAAK,IAEZ7I,EAAKkyB,UAAY,SAAUvvB,EAAGmpB,MAC5B9rB,EAAKmyB,oBAAsBxvB,EAAE+C,QAE3B1F,EAAKmC,cAAc,YAAa,CAC9BwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,eAKV9M,EAAK0Z,UAGO,IAAb/W,EAAEyvB,SAAgBpyB,EAAKgsB,WAGvBK,EAAO1pB,EAAE2pB,SAAW3pB,EAAE4pB,QACxB8F,EAAO,QAAQ/uB,KAAKtD,EAAKkT,UACzBof,EAAS,yCAAyChvB,KAAKtD,EAAKkT,UAC5D7Q,EAAS,UAAUiB,KAAKtD,EAAKkT,aAC/BlT,EAAKwtB,UAAY1B,GAAe9rB,EAAKisB,YAAYtpB,GACjD3C,EAAKywB,YAAc,CACjBjG,KAAMxqB,EAAKqO,UAAUC,WACrBic,IAAKvqB,EAAKqO,UAAUc,WAEtBnP,EAAKytB,gBAAkBztB,EAAK0sB,UAAU1sB,EAAKwtB,UAAUvmB,EAAGjH,EAAKwtB,UAAUzlB,GACvE/H,EAAK+tB,oBAAsB/tB,EAAKytB,gBAAgBtR,SAE7CkQ,GACA1pB,EAAE+qB,UACF,yCAAyCpqB,KACxCtD,EAAKytB,gBAAgBhX,WAEvBzW,EAAK8M,aACJ9M,EAAK8M,YAAYkP,gBACjBqW,GACAC,GACAjwB,IAEDrC,EAAK0b,WAAa,KAEhB1b,EAAKytB,gBAAgBhR,YAGuC,IAA5Dzc,EAAK0wB,YAAY/U,QAAQ3b,EAAKytB,gBAAgBhX,gBAChDzW,EAAKwwB,WAAaxwB,EAAKytB,gBAAgBhX,QACvCzW,EAAKqwB,gBAAkBrwB,EAAKytB,gBAAgBhX,QAC5CzW,EAAKmwB,WAAWxtB,GAEd3C,EAAKE,WAAWkwB,oBAGT,IAFP,CAAC,wBAAyB,uBAAuBzU,QAC/C3b,EAAKqwB,mBAGPrwB,EAAKqZ,oBAAsB,CACzBpS,EAAGjH,EAAKwtB,UAAUvmB,EAClBc,EAAG/H,EAAKwtB,UAAUzlB,GAEpB/H,EAAK4B,OAAO2wB,sBAEdpsB,SAASnB,iBAAiB,YAAahF,EAAKmwB,YAAY,GACxDhqB,SAASnB,iBAAiB,UAAWhF,EAAK8wB,gBAAgB,QAC1D9wB,EAAK8tB,iBAAkB,MAGH,SAAlB9tB,EAAKkT,gBACPlT,EAAKutB,WAAY,QAEoB,QAAlCvtB,EAAKE,WAAWiQ,gBACuB,IAAtCnQ,EAAKytB,gBAAgB9lB,cACvB3H,EAAKytB,gBAAgB/lB,UAAY,EAEjC1H,EAAKsuB,UAAUtuB,EAAKytB,gBAAgB/lB,SAAU2kB,EAAM,MACT,QAAlCrsB,EAAKE,WAAWiQ,eACzBnQ,EAAK6rB,UAAUlpB,OAIf0vB,EAAM,IACRryB,EAAKotB,aAAeptB,EAAKqtB,SACzBrtB,EAAK8U,gBAAkB9U,EAAK0b,WAAW4J,OAAO,IAC9CtlB,EAAKwyB,SAAWxyB,EAAKytB,gBAEnBztB,EAAKmC,cAAc,YAAa,CAC9BwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,4BAKf3G,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAK4xB,UAAU,GAC3DzrB,SAAS8pB,KAAKjrB,iBAAiB,UAAWhF,EAAK6xB,cAAc,GACtD7xB,EAAK6rB,UAAUlpB,MAEpB2vB,EAAQ,IACVtyB,EAAKotB,aAAeptB,EAAKqtB,SACzBrtB,EAAKiyB,gBAAkB,CACrBhrB,EAAGjH,EAAKoO,UACRrG,EAAG/H,EAAKkQ,cAENlQ,EAAKmC,cAAc,kBAAmB,CAAEwqB,YAAahqB,kBAGzDwD,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAK+xB,YAAY,GAC7D5rB,SAAS8pB,KAAKjrB,iBAAiB,UAAWhF,EAAKgyB,gBAAgB,GACxDhyB,EAAK6rB,UAAUlpB,UAEpBN,GACFrC,EAAKotB,aAAeptB,EAAKqtB,SACrBrtB,EAAKotB,aAAa3hB,QACpBzL,EAAK0vB,uBACH1vB,EAAK+R,MAAMwS,MAAMvkB,EAAKotB,aAAa1lB,UAErC1H,EAAK0vB,uBACH1vB,EAAK+R,MAAMvE,KAAKxN,EAAKotB,aAAa1lB,WAAa1H,EAAKsC,MAAM6K,WAE9DnN,EAAKyvB,sBACHzvB,EAAK+R,MAAMpC,QAC0B,kBAAnC3P,EAAKotB,aAAaxc,OAAOtO,MACrB,aACAtC,EAAKotB,aAAaxY,kBACnB5U,EAAKotB,aAAajlB,MACzBhC,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAKwvB,kBAAkB,QACnErpB,SAAS8pB,KAAKjrB,iBAAiB,UAAWhF,EAAKgwB,gBAAgB,KAGC,IAA9D,CAAC,cAAe,kBAAkBrU,QAAQ3b,EAAKkT,WACjDlT,EAAKotB,aAAeptB,EAAKytB,gBAEL,mBAAlBztB,EAAKkT,UACyC,WAA9ClT,EAAKE,WAAWivB,4BAEhBnvB,EAAKovB,aAAapvB,EAAK8M,YAAY8D,OAAOQ,MAAOib,EAAM1pB,EAAE+qB,UACzD1tB,EAAK6I,QAEP1C,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAKgxB,aAAa,QAC9D7qB,SAAS8pB,KAAKjrB,iBAAiB,UAAWhF,EAAKuxB,iBAAiB,cAIpEvxB,EAAKyyB,QAAU,SAAU9vB,GACvBkqB,aAAa7sB,EAAK8sB,iBACdT,EAAO1pB,EAAE2pB,SAAW3pB,EAAE4pB,QAC1BvsB,EAAKktB,qBAAsB,EAC3BltB,EAAKgtB,oBAAqB,EAC1BhtB,EAAKitB,uBAAwB,EACzBjtB,EAAKotB,eACPptB,EAAKovB,aAAapvB,EAAK8M,YAAY8D,OAAOQ,MAAOib,EAAM1pB,EAAE+qB,UACzD1tB,EAAK6I,QAEP7I,EAAKutB,eAAYrmB,EACjBlH,EAAKotB,kBAAelmB,EACpBlH,EAAKytB,qBAAkBvmB,EAErBlH,EAAKmC,cAAc,UAAW,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,gBAIxD9M,EAAK0Z,UAAY/W,EAAE+C,SAAW1F,EAAK4B,UAGpC5B,EAAK8M,kBAAyC5F,IAA1BlH,EAAK8M,YAAYqT,MAGrCngB,EAAK+rB,aAAe/rB,EAAKgsB,QAGzBhsB,EAAKwtB,WAAaxtB,EAAK+sB,SAAS/sB,EAAKwtB,YACvCxtB,EAAK0yB,aAAaC,QAEpBhwB,EAAE+lB,oBAGJ1oB,EAAK4yB,iBAAmB,eAClB3rB,EAEF2Q,EAAI5X,EAAK4N,YACT8C,EAAI,OACDzJ,EAAI,EAAGA,EAAI2Q,EAAE9R,OAAQmB,GAAK,EAExB2Q,EADD5X,EAAKuN,OAAOoC,QAAQ1I,IACdgK,cACQ/J,IAAZwJ,EAAEmiB,QACJniB,EAAEmiB,MAAQ5rB,EACVyJ,EAAE8Z,KAAOvjB,GAEXyJ,EAAEoiB,KAAO7rB,EACLA,EAAIjH,EAAKiQ,WAAWtI,kBAA2BT,IAAZwJ,EAAEkd,QACvCld,EAAEkd,MAAQ3mB,GAERA,EAAIjH,EAAKiQ,WAAWtI,cACtB+I,EAAE8Z,KAAOvjB,gBAICC,IAAZwJ,EAAEkd,QACJld,EAAEkd,MAAQld,EAAEoiB,MAEPpiB,GAET1Q,EAAK+yB,QAAU,SAAUpwB,OAErBoa,SACAiW,EAAgBhzB,EAAK4yB,mBACrB3rB,EAAIW,KAAKiT,IAAI7a,EAAKiQ,WAAWtI,YAAa,GAC1CI,EAAIH,KAAKiT,IAAI7a,EAAKiQ,WAAWvI,SAAU,GACvC2kB,EAAO1pB,EAAE2pB,SAAW3pB,EAAE4pB,QACtBuG,EAAO9yB,EAAKsM,SAASxG,OAAS,EAE9BmtB,EADIjzB,EAAK4N,YACA9H,OAAS,MAEG9F,EAAKmC,cAAc,UAAW,CACnDwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,gBAOR9M,EAAKE,WAAWgzB,qBAAwBlzB,EAAK0Z,cAK9CyZ,oBAAoBxwB,KAAO0pB,SACtBrsB,EAAKozB,YAAYnsB,EAAGc,EAAGpF,GAAG,MAG/B3C,EAAKE,WAAWsP,aAClBsjB,GAAQ,GAGI,QAAVnwB,EAAEmX,KACJnX,EAAE+lB,iBAGU,WAAV/lB,EAAEmX,IACJ9Z,EAAKqzB,aACIhH,GAAkB,MAAV1pB,EAAEmX,IACnB9Z,EAAKivB,YACc,cAAVtsB,EAAEmX,IACX/R,GAAK,EACc,YAAVpF,EAAEmX,IACX/R,GAAK,EAEM,cAAVpF,EAAEmX,MAAwBuS,GAC1B1pB,EAAE+qB,UAAsB,QAAV/qB,EAAEmX,IAEjB7S,EAAI+rB,EAAcxI,KAEP,eAAV7nB,EAAEmX,MAAyBuS,IAC1B1pB,EAAE+qB,UAAsB,QAAV/qB,EAAEmX,IAElB7S,EAAI+rB,EAAcpF,MACC,WAAVjrB,EAAEmX,KACX/R,GAAK/H,EAAKirB,KACVtoB,EAAE+lB,kBACiB,aAAV/lB,EAAEmX,KACX/R,GAAK/H,EAAKirB,KACVtoB,EAAE+lB,kBACiB,SAAV/lB,EAAEmX,KAAmBuS,GAAkB,YAAV1pB,EAAEmX,IACxC/R,EAAI,EACe,QAAVpF,EAAEmX,KAAkBuS,GAAkB,cAAV1pB,EAAEmX,IACvC/R,EAAI/H,EAAKsM,SAASxG,OAAS,EAClBumB,GAAkB,eAAV1pB,EAAEmX,IACnB7S,EAAI+rB,EAAcF,KACTzG,GAAkB,cAAV1pB,EAAEmX,MACnB7S,EAAI+rB,EAAcH,OAGN,UAAVlwB,EAAEmX,WACJnX,EAAE+lB,iBACK1oB,EAAKozB,YAAYnsB,EAAGc,EAAGpF,IAE5BsE,EAAI,GAAKqsB,OAAOnwB,MAAM8D,MACxBA,EAAI+rB,EAAcH,OAEhB9qB,EAAI+qB,IACN/qB,EAAI+qB,IAEF/qB,EAAI,GAAKurB,OAAOnwB,MAAM4E,MACxBA,EAAI,GAEFd,EAAIgsB,IACNhsB,EAAI+rB,EAAcF,UAKhBS,EAAa,CACf,YACA,UACA,aACA,aACAzL,SAASnlB,EAAEmX,QAGTnX,EAAE+qB,UAAY6F,EAAY,KACtBC,EAAwBxzB,EAAK0b,WAAW+X,UAAU,SAACptB,mCAASA,eAC5DqtB,EAAmB1zB,EAAK0b,WAAW8X,GACnCG,EAA2BD,EAAiB,GAC5CE,EAAqBF,EAAiBA,EAAiB5tB,OAAS,GAChE+tB,EAAe,IAAN9rB,EACT+rB,EAAY/rB,IAAM+qB,EAClBiB,EAAgB,IAAN9sB,EACV+sB,EAAW/sB,IAAMgsB,EAET,YAAVtwB,EAAEmX,MACA/R,EAAI,EAAIyrB,IAA0BK,EACpC7zB,EAAK0b,WAAWvE,MACPpP,EAAIyrB,GACbxzB,EAAK0b,WAAW3T,GAAK/H,EAAK0b,WAAW3T,IAAM,GAC3C/H,EAAK0b,WAAW3T,GAAGlE,KAAKoD,IACf4sB,GAAuC,IAA7B7zB,EAAKiQ,WAAWvI,UACnC1H,EAAK0b,WAAWvE,OAIN,cAAVxU,EAAEmX,MACA/R,EAAIyrB,GAAyBzrB,IAAM/H,EAAK0b,WAAW5V,QACrD9F,EAAK0b,WAAW3T,GAAK/H,EAAK0b,WAAW3T,IAAM,GAC3C/H,EAAK0b,WAAW3T,GAAGlE,KAAKoD,KACfc,GAAKyrB,IAA0BM,GAE/BA,GAAa9zB,EAAKiQ,WAAWvI,WAAaorB,WAD5C9yB,EAAK0b,WAAW3T,EAAI,uCAMP/H,EAAK0b,2CAAY,KAA9BuY,UACK,eAAVtxB,EAAEmX,KAAwBma,IACxBhtB,EAAI2sB,EACNK,EAAUpwB,KAAKoD,IACNA,GAAK2sB,IAAuBI,GAE5BA,GAAYh0B,EAAKiQ,WAAWtI,cAAgBsrB,IADrDgB,EAAUC,SAMA,cAAVvxB,EAAEmX,KAAuBma,IACvBhtB,EAAI0sB,EACNM,EAAUnhB,QAAQ7L,IACTA,GAAK0sB,IAA6BI,GAElCA,GAA2C,IAAhC/zB,EAAKiQ,WAAWtI,cADpCssB,EAAU9c,sCAOhBnX,EAAKquB,gBAAkBruB,EAAK6tB,qBAC5B7tB,EAAKuuB,gBAAWrnB,EAAWmlB,GAE3BrsB,EAAK6I,MAAK,GAGR5B,IAAMjH,EAAKiQ,WAAWtI,aAAeI,IAAM/H,EAAKiQ,WAAWvI,WAC7D1H,EAAKm0B,eACHltB,IAAMjH,EAAKiQ,WAAWtI,YAAcV,OAAIC,EACxCa,IAAM/H,EAAKiQ,WAAWvI,UAAa4rB,OAAOnwB,MAAM4E,QAASb,EAAJa,GAGvD/H,EAAKgvB,cAAc/nB,EAAGc,IACjBpF,EAAE+qB,UAAY1tB,EAAKE,WAAWk0B,6BAC5B/H,IACHrsB,EAAK0b,WAAa,IAEpB1b,EAAK0b,WAAW3T,GAAK/H,EAAK0b,WAAW3T,IAAM,GAC3C/H,EAAK0b,WAAW3T,GAAGlE,KAAKoD,GACxB8V,EAAK,CACHkR,aAAcjuB,EAAKkuB,kBACnBxS,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAK6tB,qBACtBM,cAAenuB,EAAKouB,oBAEtB1lB,OAAOkc,eAAe7H,EAAI,eAAgB,CACxC+H,IAAK,kBACI9kB,EAAKkuB,qBAGhBluB,EAAKmC,cAAc,mBAAoB4a,IAEzC/c,EAAK6I,MAAK,MAGd7I,EAAKq0B,MAAQ,SAAU1xB,GAEnB3C,EAAKmC,cAAc,QAAS,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,eAItD9M,EAAK0Z,UAIZ1Z,EAAKs0B,SAAW,SAAU3xB,GACnB3C,EAAK0Z,UAIR1Z,EAAKmC,cAAc,WAAY,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,eAKhE9M,EAAKu0B,SAAW,SAAU5xB,GAEtB3C,EAAKmC,cAAc,WAAY,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,eAIzD9M,EAAK0Z,WAIqB,cAA7B1Z,EAAK8M,YAAY2J,SACU,qBAA3BzW,EAAK8M,YAAYxK,MAEjBtC,EAAKw0B,kBAAkBx0B,EAAK8M,YAAY8D,OAAO1L,MAElB,cAA7BlF,EAAK8M,YAAY2J,SACU,eAA3BzW,EAAK8M,YAAYxK,MAEjBtC,EAAKy0B,YACgE,IAA5D,CAAC,OAAQ,cAAc9Y,QAAQ3b,EAAK8M,YAAYxK,QACzDtC,EAAKozB,YAAYpzB,EAAK8M,YAAYnF,YAAa3H,EAAK8M,YAAYpF,YAGpE1H,EAAK00B,YAAc,SAAU/xB,OACvBqI,EACFD,EACAgS,EAAKpa,EACLgyB,OAAsBztB,IAAbvE,EAAEgyB,OAAuBhyB,EAAEgqB,YAAYgI,OAAShyB,EAAEgyB,OAC3DC,OAAsB1tB,IAAbvE,EAAEiyB,OAAuBjyB,EAAEgqB,YAAYiI,OAASjyB,EAAEiyB,OAC3DC,OACkB3tB,IAAhBvE,EAAEkyB,UAA0BlyB,EAAEgqB,YAAYkI,UAAYlyB,EAAEkyB,UACxDlyB,EAAIA,EAAEgqB,aAAehqB,EACrBwlB,EACFpL,EAAG2L,eAAe/lB,GAGhB3C,EAAKmC,cAAc,QAAS,CAAEwqB,YAAahqB,MAG/C3C,EAAK80B,oBAAqB,EAC1B9pB,EAAIhL,EAAKqO,UAAUC,WACnBvD,EAAI/K,EAAKqO,UAAUc,UACfnP,EAAK0Z,WAGW,IAAdmb,IAEFD,GAAkB,KAGjB50B,EAAKqO,UAAUc,UAAYnP,EAAKqO,UAAU+H,cACzCwe,EAAS,GACV50B,EAAKqO,UAAUC,WAAatO,EAAKqO,UAAU2H,aAC1C2e,EAAS,GACV30B,EAAKqO,UAAUc,UAAY,GAAKylB,EAAS,GACzC50B,EAAKqO,UAAUC,WAAa,GAAKqmB,EAAS,IAE3C5X,EAAG2L,eAAe/lB,GAEpBwlB,EAAWwI,YAAW,WACpBxI,OAAWjhB,EACXlH,EAAKqO,UAAU0mB,SAASJ,EAAS3pB,EAAG4pB,EAAS7pB,KAC5C,MAGP/K,EAAKg1B,UAAY,SACfrO,EACAuB,EACA+M,EACAC,iBAEiB,cAAbhN,IAA6BxB,gBAAgBC,UAC/C5F,QAAQC,KACN,4GAEFD,QAAQC,KACN,8FAKAne,EAAS7C,EAAK4N,YACdJ,EAAOya,UAAUtB,EAAYuB,MAIb,IAAhB1a,EAAK1H,QAAmC,IAAnB0H,EAAK,GAAG1H,OAAc,KACzCqvB,EAAW3nB,EAAK,GAAG,GAAGwP,MAAMuF,IAAI,SAACzd,iCAASA,EAAKkY,mBAAOoY,OAE1Dp1B,EAAKq1B,qBAAoB,SAAU9yB,EAAMmF,EAAU4tB,GACjD/yB,EAAKmF,GAAU4tB,GAAWH,SAEvB,SACDzZ,EAAa,GACRhU,EAAW,EAAGA,EAAW8F,EAAK1H,OAAQ4B,IAAY,KAGrD6tB,EAAev1B,EAAKuN,OAAOC,KAAKynB,EAAgBvtB,GAChD8tB,EAAQhoB,EAAK9F,GAEb+tB,EAAkBz1B,EAAKsM,SAASipB,GAChCG,EAAahtB,OAAOitB,OAAO,GAAIF,GAEnC/Z,EAAW6Z,GAAgB,OAEtB,IAAIK,EAAW,EAAGA,EAAWJ,EAAM1vB,OAAQ8vB,IAAY,KACtDzL,EAAStnB,EAAOqyB,EAAgBU,MAE/BzL,OAKD0L,EAAa1L,EAAOjlB,KAKpBiwB,OAJAA,EAAWK,EAAMI,GAAU5Y,MAC5BuF,IAAI,SAACzd,iCAASA,EAAKkY,mBACnBoY,KAAK,MAOR1Z,EAAW6Z,GAAc1xB,KAAKqxB,EAAgBU,GAE9CF,EAAWG,GAAcV,GANvBO,EAAWG,GAAcJ,EAAgBI,QAVzC9U,QAAQC,KAAK,8CAmBjBhhB,EAAK0R,aAAa1R,EAAK81B,iBAAiBhR,IAAIyQ,IAAiBG,EAK7D11B,EAAKsM,SAASipB,GAAgBG,EAEhC11B,EAAK0b,WAAaA,MAIhBqa,EAAgB,UAEpB/1B,EAAK0b,WAAW7a,SAAQ,SAAUoc,EAAKvV,QACpBR,IAAbQ,GAEJuV,EAAIpc,SAAQ,SAAU8G,GACpBouB,EAAclyB,KAAK,CACjB6D,EACAC,EACA3H,EAAKyR,iCAAiC/J,GACtC1H,EAAKse,uCAAuC3W,WAKlD3H,EAAKmC,cAAc,aAAc,CAC/BqzB,MAAOO,IAGFvoB,EAAK1H,QAEd9F,EAAKg2B,0BAA4B,SAAUC,OACrChvB,EACF2Q,EAAI5X,EAAKk2B,uBACNjvB,EAAI,EAAGA,EAAI2Q,EAAE9R,OAAQmB,GAAK,KACzB2Q,EAAE3Q,GAAGU,cAAgBsuB,SAChBre,EAAE3Q,EAAI,GAAGU,mBAGZ,GAEV3H,EAAKm2B,wBAA0B,SAAUxuB,OACnCV,EACF2Q,EAAI5X,EAAKk2B,uBACNjvB,EAAI,EAAGA,EAAI2Q,EAAE9R,OAAQmB,GAAK,KACzB2Q,EAAE3Q,GAAGU,cAAgBA,SAChBV,SAGH,GAEVjH,EAAKo2B,MAAQ,SAAUpI,iBAChBhuB,EAAKE,WAAWm2B,WAIEr2B,EAAKmC,cAAc,cAAe,CACvDwqB,YAAaqB,SAOXsI,EAAiB,IAAIC,IACvB51B,MAAM61B,KAAKxI,EAAMyI,cAAcC,OAAOnU,IAAI,SAACzd,iCAAS,CAACA,EAAKiB,KAAMjB,iBAI9D6xB,EAAqB,CAAC,YAAa,WAAY,cAM/CC,EAAiBD,EAClBpU,IAAI,SAAC2F,iCAAaoO,EAAexR,IAAIoD,gBACrCnjB,OAAO,SAACD,mCAAWA,kBAEQ,IAA1B8xB,EAAe9wB,gBAQf+wB,EAAcD,EAAe,GAE7BE,EAAY,GAEVpvB,EAAW,EAAGqvB,EAAM/2B,EAAK0b,WAAW5V,OACxC4B,EAAWqvB,EACXrvB,IACA,KACMuV,EAAMjd,EAAK0b,WAAWhU,MACxBuV,EAAK,SACQ/V,IAAX+V,EAAI,GAAkB,OAC1B6Z,EAAY,CAACpvB,EAAUuV,EAAI,GAAK,EAAIA,EAAI,GAAKA,EAAI,eAOjD+Z,EAAYH,EAAY9wB,KAE5B8wB,EAAYI,aAAY,SAAUtQ,GAChC3mB,EAAKg1B,UAAUrO,EAAYqQ,EAAWF,EAAU,GAAIA,EAAU,IAE9D92B,EAAK6I,eA9BLkY,QAAQC,KACN,kEACA2V,EAAmBvB,KAAK,SA+B9Bp1B,EAAKk3B,IAAM,SAAUv0B,GACnB3C,EAAKm3B,KAAKx0B,SACJE,EAAS7C,EAAK4N,YAEhBmoB,EAAgB,gCACU/1B,EAAK0b,WAAW0b,0CAAW,iCAA7C1vB,OAAUuV,UACfA,SAECmB,EAAgBpe,EAAKyR,iCAAiC/J,gCAElCuV,kCAAK,KAApBtV,UACH0W,EAAmBre,EAAKse,uCAC5B3W,GAEI2tB,EAAUzyB,EAAOwb,GAAkBnZ,KAEzClF,EAAKsM,SAAS5E,GAAU4tB,GAAW,GAEnCS,EAAclyB,KAAK,CACjB6D,EACAC,EACAyW,EACAC,oEAKFre,EAAKmC,cAAc,MAAO,CAAEwqB,YAAahqB,EAAG6yB,MAAOO,KAIzD/1B,EAAKm3B,KAAO,SAAUx0B,kBAChB3C,EAAKmC,cAAc,OAAQ,CAAEwqB,YAAahqB,KAGzC3C,EAAK0Z,UAAa/W,EAAE8zB,mBASvBY,EANEtsB,EAAI,GACNsB,EAAI,GACJirB,EAAW,GACXC,EAAQv3B,EAAKkuB,kBACbtW,EAAI5X,EAAK4N,YACT4pB,EAAU,GAEVC,GAAS,EAIX7f,EAAE/W,SAAQ,SAAUspB,EAAQxiB,GAC1B6vB,EAAQ3zB,KAAK+T,EAAE5X,EAAKuN,OAAOoC,QAAQhI,QAEjC4vB,EAAMzxB,OAAS,IACjByxB,EAAM12B,QAAQ,SAACoc,6BACRA,OACDya,EAAUhvB,OAAOC,KAAKsU,GACtB0a,EAAU,GACTN,IAAcA,EAAe3uB,OAAOC,KAAKsU,IAC1Cwa,GAAUC,EAAQ5xB,SAAWuxB,EAAavxB,SAAQ2xB,GAAS,GAC/DD,EAAQ32B,SAAQ,SAAUspB,EAAQxiB,MAC5B+vB,EAAQ/b,QAAQwO,EAAOjlB,MAAQ,EAAG,IAChCmyB,EAAa1b,QAAQwO,EAAOjlB,MAAQ,SAE7BuyB,IACTA,GAAS,GAGbE,EAAQ9zB,KAAKoZ,EAAIkN,EAAOjlB,OAAS,OAEnCoyB,EAASzzB,KAAK8zB,iBAEZF,GACF1sB,EAAIusB,EAAS/U,IAAI,SAACtF,iCAAQA,EAAImY,KAAK,mBAAOA,KAAK,MAI/C/oB,GAAK,UACLA,GAAKirB,EACF/U,IACC,SAACtF,4CACC,OACAA,EAAIsF,IAAI,SAACvF,iCAAU,QAAkBA,EAlCpCxc,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAkCS,sBAAS40B,KAAK,IAC5D,qBAEHA,KAAK,IACR/oB,GAAK,YAGLA,EADAtB,EAAIusB,EAAS/U,IAAI,SAACtF,iCAAQA,EAAImY,KAAK,iBAAKA,KAAK,IAG3CrqB,IACFpI,EAAE8zB,cAAcmB,QAAQ,YAAavrB,GACrC1J,EAAE8zB,cAAcmB,QAAQ,aAAc7sB,GACtCpI,EAAE8zB,cAAcmB,QAAQ,WAAY7sB,GACpCpI,EAAE8zB,cAAcmB,QAAQ,mBAAoBn1B,KAAKugB,UAAUuU,KAE7D50B,EAAE+lB,oBC3vDO,eAAU1oB,OAGrB63B,EACAC,EACF93B,EAAK6Y,gBAAkB,GACvB7Y,EAAK2Y,WAAa,GAClB3Y,EAAK4Y,eAAiB,GACtB5Y,EAAK+3B,gBAAkB,EACvB/3B,EAAKg4B,YAAc,SAAUr1B,EAAGs1B,OAG5BntB,EAFEC,EAAIktB,EAAat1B,EAAE0V,QAAQ4f,GAAct1B,EAAE0V,QAAQ,GACrD6f,EAAOl4B,EAAK4B,OAAOu2B,2BAEhBptB,SAGLD,EAAM,CACJ7D,EAAG8D,EAAEqtB,QAAUF,EAAK1N,KACpBziB,EAAGgD,EAAEstB,QAAUH,EAAK3N,KAElBvqB,EAAKkL,cACPJ,EAAI7D,GAAKjH,EAAK8H,iBACdgD,EAAI/C,GAAK/H,EAAKgI,iBAET,CACLf,EAAG6D,EAAI7D,EACPc,EAAG+C,EAAI/C,EACPmwB,KAAMA,IAIVl4B,EAAKs4B,gBAAkB,CACrBC,OAAQ,SAAUxtB,UACTA,GAETytB,WAAY,SAAUztB,UACbA,EAAIA,GAEb0tB,YAAa,SAAU1tB,UACdA,GAAK,EAAIA,IAElB2tB,cAAe,SAAU3tB,UAChBA,EAAI,GAAM,EAAIA,EAAIA,GAAU,EAAI,EAAIA,GAAKA,EAAlB,GAEhC4tB,YAAa,SAAU5tB,UACdA,EAAIA,EAAIA,GAEjB6tB,aAAc,SAAU7tB,WACbA,EAAIA,EAAIA,EAAI,GAEvB8tB,eAAgB,SAAU9tB,UACjBA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,GAEzE+tB,YAAa,SAAU/tB,UACdA,EAAIA,EAAIA,EAAIA,GAErBguB,aAAc,SAAUhuB,UACf,KAAMA,EAAIA,EAAIA,EAAIA,GAE3BiuB,eAAgB,SAAUjuB,UACjBA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAMA,EAAIA,EAAIA,EAAIA,GAE7DkuB,YAAa,SAAUluB,UACdA,EAAIA,EAAIA,EAAIA,EAAIA,GAEzBmuB,aAAc,SAAUnuB,UACf,IAAMA,EAAIA,EAAIA,EAAIA,EAAIA,GAE/BouB,eAAgB,SAAUpuB,UACjBA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAOA,EAAIA,EAAIA,EAAIA,EAAIA,IAGzE/K,EAAKo5B,OAAS,SAAUruB,EAAG1B,EAAGwB,EAAGwB,UAE7BxB,EAAI7K,EAAKs4B,gBAAgBt4B,EAAKE,WAAWm5B,mBAAmBtuB,EAAIsB,GAAKhD,GAGzErJ,EAAKs5B,kBAAoB,WACvBt5B,EAAKkZ,QACFlZ,EAAK2Y,WAAW1R,EAAIjH,EAAKu5B,gBAAgBtyB,IACzCjH,EAAK2Y,WAAW5N,EAAI/K,EAAKu5B,gBAAgBxuB,GAE5C/K,EAAKmZ,QACFnZ,EAAK2Y,WAAW5Q,EAAI/H,EAAKu5B,gBAAgBxxB,IACzC/H,EAAK2Y,WAAW5N,EAAI/K,EAAKu5B,gBAAgBxuB,GAE5C/K,EAAKu5B,gBAAkB,CACrBtyB,EAAGjH,EAAK2Y,WAAW1R,EACnBc,EAAG/H,EAAK2Y,WAAW5Q,EACnBgD,EAAGqC,YAAYC,QAGnBrN,EAAKw5B,aAAe,WAClBx5B,EAAK+Y,OACF/Y,EAAK2Y,WAAW1R,EAAIjH,EAAKy5B,WAAWxyB,IACpCjH,EAAK2Y,WAAW5N,EAAI/K,EAAKy5B,WAAW1uB,GAEvC/K,EAAKgZ,OACFhZ,EAAK2Y,WAAW5Q,EAAI/H,EAAKy5B,WAAW1xB,IACpC/H,EAAK2Y,WAAW5N,EAAI/K,EAAKy5B,WAAW1uB,GAEvC/K,EAAKy5B,WAAa,CAChBxyB,EAAGjH,EAAK2Y,WAAW1R,EACnBc,EAAG/H,EAAK2Y,WAAW5Q,EACnBgD,EAAGqC,YAAYC,QAGnBrN,EAAK05B,kBAAoB,eAClB15B,EAAK4B,SAAW5B,EAAKqO,UAAU0mB,gBAC3B3yB,sBAAsBpC,EAAK05B,uBAIlC3uB,EAFE9H,EAAImK,YAAYC,MAClBhB,EAAIrM,EAAKE,WAAWy5B,gCAEtB5uB,EAAI9H,EAAIjD,EAAK2Y,WAAW5N,EACxB/K,EAAK+3B,iBAAmB,EACxB/3B,EAAK6Y,gBAAgB5R,EAAIjH,EAAKo5B,OAC5BruB,EACA/K,EAAK2Y,WAAWrK,WAChBtO,EAAK4Y,eAAe3R,EACpBoF,GAEFrM,EAAK6Y,gBAAgB9Q,EAAI/H,EAAKo5B,OAC5BruB,EACA/K,EAAK2Y,WAAWxJ,UAChBnP,EAAK4Y,eAAe7Q,EACpBsE,GAGAtB,EAAIsB,GACHrM,EAAK6Y,gBAAgB9Q,IAAM/H,EAAKqO,UAAUc,WACzCnP,EAAK6Y,gBAAgB5R,IAAMjH,EAAKqO,UAAUC,YAC5CtO,EAAK45B,gBAIP55B,EAAKqO,UAAU0mB,SAAS/0B,EAAK6Y,gBAAgB5R,EAAGjH,EAAK6Y,gBAAgB9Q,GACrE3F,sBAAsBpC,EAAK05B,qBAE7B15B,EAAK65B,cAAgB,SAAUzyB,GAC7BpH,EAAKozB,YAAYhsB,EAAKO,YAAaP,EAAKM,WAE1C1H,EAAK85B,WAAa,SAAUn3B,MACtBA,EAAEo3B,eAAe,KACnB/5B,EAAKyZ,WAAazZ,EAAKg4B,YAAYr1B,GACnC3C,EAAKg6B,aAAeh6B,EAAK0sB,UACvB1sB,EAAKyZ,WAAWxS,EAChBjH,EAAKyZ,WAAW1R,GAChB,KAIF/H,EAAKmC,cAAc,aAAc,CAC/BwqB,YAAahqB,EACbyE,KAAMpH,EAAKg6B,mBAKfh6B,EAAKi6B,qBACLC,cAAcl6B,EAAKm6B,mBACnBtN,aAAa7sB,EAAKo6B,qBAClBp6B,EAAKq6B,gBAAkB13B,EACvB3C,EAAK45B,eAAgB,EACrB55B,EAAK+3B,gBAAkB,EACvB/3B,EAAKooB,gBAAgBzlB,GACI,IAArBA,EAAE0V,QAAQvS,QAAgBnD,EAAEo3B,eAAe,KAAO/5B,EAAKs6B,YAAa,IACtEt6B,EAAKoY,YAAc,EACnBpY,EAAKyZ,WAAazZ,EAAKyZ,YAAczZ,EAAKu6B,YAC1Cv6B,EAAKw6B,iBAAmB,CACtBvzB,EAAGjH,EAAKqO,UAAUC,WAClBvG,EAAG/H,EAAKqO,UAAUc,UAClBpE,EAAGqC,YAAYC,OAEjBrN,EAAK2Y,WAAa,CAChB1R,EAAG,EACHc,EAAG,EACHuG,WAAYtO,EAAKqO,UAAUC,WAC3Ba,UAAWnP,EAAKqO,UAAUc,UAC1BpE,EAAG/K,EAAKw6B,iBAAiBzvB,GAE3B/K,EAAKy5B,WAAa,CAChBxyB,EAAGjH,EAAK2Y,WAAW1R,EACnBc,EAAG/H,EAAK2Y,WAAW5Q,EACnBgD,EAAG/K,EAAK2Y,WAAW5N,GAErB/K,EAAKu5B,gBAAkB,CACrBtyB,EAAGjH,EAAK2Y,WAAW1R,EACnBc,EAAG/H,EAAK2Y,WAAW5Q,EACnBgD,EAAG/K,EAAK2Y,WAAW5N,GAErB/K,EAAKo6B,oBAAsBzJ,YAAW,WACpC3wB,EAAKy6B,iBAAiB93B,EAAG3C,EAAKyZ,cAC7BzZ,EAAKE,WAAWw6B,wBACnB16B,EAAKm6B,kBAAoBQ,YACvB36B,EAAKs5B,kBAlMQ,IAsMbt5B,EAAKg6B,eACJh6B,EAAKg6B,aAAavd,SAC2C,IAA5D,CAAC,OAAQ,WAAWd,QAAQ3b,EAAKg6B,aAAavjB,sBAEhDzW,EAAK0Z,UAAW,MAGlB1Z,EAAK0Z,UAAW,EACZ1Z,EAAKg6B,aAAape,gBAChB5b,EAAKg6B,aAAave,aACpBzb,EAAKuuB,WAAW,CACdhE,IAAKvqB,EAAKg6B,aAAatyB,SACvBimB,OAAQ3tB,EAAKg6B,aAAatyB,SAC1B8iB,KAAM,EACNoD,MAAO5tB,EAAKk2B,mBAAmBpwB,OAAS,IAE1C9F,EAAK6I,MAAK,IACD7I,EAAKg6B,aAAahe,iBACuB,SAA9Chc,EAAKE,WAAWivB,4BACdnvB,EAAKogB,UAAYpgB,EAAKg6B,aAAappB,OAAO1L,KAC5ClF,EAAK4gB,eACqB,QAAxB5gB,EAAK4gB,eAA2B,OAAS,MAE3C5gB,EAAK4gB,eAAiB,MAExB5gB,EAAKqR,MAAMrR,EAAKg6B,aAAappB,OAAO1L,KAAMlF,EAAK4gB,iBAEC,WAA9C5gB,EAAKE,WAAWivB,4BAClBnvB,EAAKuuB,WAAW,CACdhE,IAAK,EACLoD,OAAQ3tB,EAAKsM,SAASxG,OAAS,EAC/B0kB,KAAMxqB,EAAKg6B,aAAaryB,YACxBimB,MAAO5tB,EAAKg6B,aAAaryB,cAE3B3H,EAAK6I,MAAK,UAGd7I,EAAK46B,eAAej4B,GAIpB3C,EAAKs6B,cAGTn0B,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAK66B,UAAW,CAC1DC,SAAS,IAEX30B,SAAS8pB,KAAKjrB,iBAAiB,WAAYhF,EAAK+6B,UAAU,GAC1D50B,SAAS8pB,KAAKjrB,iBAAiB,cAAehF,EAAKg7B,aAAa,GAChEh7B,EAAK6I,MAAK,MAEZ7I,EAAKi7B,YAAc,SAAU7zB,EAAM8zB,WACXh0B,IAAlBE,EAAKM,eAA+CR,IAArBE,EAAKO,aAGxC3H,EAAKm7B,gBAAiB,MAClBC,EAASp7B,EAAK6tB,qBAED,wBAAfqN,GACA9zB,EAAKM,UAAY0zB,EAAO7Q,KACxBnjB,EAAKO,aAAeyzB,EAAOxN,OAE3BwN,EAAOzN,OAASvmB,EAAKM,SACrB0zB,EAAO5Q,KAAOpjB,EAAKO,aAEJ,wBAAfuzB,GACA9zB,EAAKM,UAAY0zB,EAAOzN,QACxBvmB,EAAKO,aAAeyzB,EAAOxN,OAE3BwN,EAAO7Q,IAAMnjB,EAAKM,SAClB0zB,EAAO5Q,KAAOpjB,EAAKO,aAEJ,wBAAfuzB,GACA9zB,EAAKM,UAAY0zB,EAAOzN,QACxBvmB,EAAKO,aAAeyzB,EAAO5Q,MAE3B4Q,EAAO7Q,IAAMnjB,EAAKM,SAClB0zB,EAAOxN,MAAQxmB,EAAKO,aAEL,wBAAfuzB,GACA9zB,EAAKM,UAAY0zB,EAAO7Q,KACxBnjB,EAAKO,aAAeyzB,EAAO5Q,OAE3B4Q,EAAOzN,OAASvmB,EAAKM,SACrB0zB,EAAOxN,MAAQxmB,EAAKO,aAEgB,QAAlC3H,EAAKE,WAAWiQ,gBAA8C,IAAnB/I,EAAKM,UAClD0zB,EAAO5Q,KAAO,EACd4Q,EAAOxN,MAAQ5tB,EAAK4N,YAAY9H,OAAS,GAEzCs1B,EAAO5Q,KAAO5iB,KAAKiT,IAAI,EAAGugB,EAAO5Q,MAEnCxqB,EAAKuuB,WAAW6M,GAChBp7B,EAAK6I,MAAK,KAqHZ7I,EAAK66B,UAAY,SAAUl4B,GACrBk1B,GAGJz1B,uBAAsB,WACpBy1B,GAAc,WAxHCl1B,OACbqnB,EAAIqR,EAAIC,EAAaC,EAAaC,EAAaC,EAAahS,EAAKiS,EAAIC,MACrE37B,EAAKmC,cAAc,kBAAmB,CAAEwqB,YAAahqB,QAGzDkqB,aAAaiL,GACTn1B,EAAEo3B,eAAe,KACnB/5B,EAAKsY,cAAgBtY,EAAKg4B,YAAYr1B,IAEpCA,EAAEo3B,eAAe,KACnB/5B,EAAKuY,eAAiBvY,EAAKg4B,YAAYr1B,EAAG,IAG1CiF,KAAKoT,IAAIhb,EAAK2Y,WAAW1R,GAAKW,KAAKoT,IAAIhb,EAAK2Y,WAAW5Q,GACvD/H,EAAKE,WAAW07B,eAEhB/O,aAAa7sB,EAAKo6B,qBAEK,IAArBz3B,EAAE0V,QAAQvS,QAAgB9F,EAAKsY,eAAiBtY,EAAKuY,sBACvDmjB,EAAK17B,EAAKsY,cAAcvQ,EACxB4zB,EAAK37B,EAAKuY,eAAexQ,EACpB/H,EAAKmY,iBACRnY,EAAKmY,eAAiBvQ,KAAKoT,IAAI0gB,EAAKC,GACpC37B,EAAKiY,WAAajY,EAAKgY,OAEzBhY,EAAKoY,YAAc,EACnBpY,EAAKkY,WAAalY,EAAKmY,eAAiBvQ,KAAKoT,IAAI0gB,EAAKC,GACtD37B,EAAKgY,MACHhY,EAAKiY,WACLjY,EAAKkY,WAAalY,EAAKE,WAAW27B,qBACpC77B,EAAKgY,MAAQpQ,KAAKuG,IAChBvG,KAAKiT,IAAI7a,EAAKgY,MAAOhY,EAAKE,WAAW47B,cACrC97B,EAAKE,WAAW67B,cAElB/7B,EAAKs6B,aAAc,EACnBt6B,EAAKqC,QAAO,QACZrC,EAAK8vB,mBAGH9vB,EAAKs6B,cAGTt6B,EAAKoY,YAAc,EACnBpY,EAAKsY,cAAgBtY,EAAKsY,eAAiBtY,EAAKuY,eAChDyR,EAAKhqB,EAAKgN,4BACVquB,EAAKr7B,EAAKkN,wBACVouB,EACEt7B,EAAKmI,MAAQnI,EAAKsC,MAAM8P,eAAiBpS,EAAKsY,cAAcrR,EAC5DjH,EAAKE,WAAW87B,oBAClBT,EACEv7B,EAAKsY,cAAcrR,EAAIo0B,EAAKr7B,EAAKE,WAAW87B,oBAC9CR,EACEx7B,EAAKkI,OAASlI,EAAKsC,MAAM8P,eAAiBpS,EAAKsY,cAAcvQ,EAC7D/H,EAAKE,WAAW87B,oBAClBP,EACEz7B,EAAKsY,cAAcvQ,EAAIiiB,EAAKhqB,EAAKE,WAAW87B,oBAC9CvS,EAAMzpB,EAAKsC,MAAM8P,eAcjBzP,EAAEylB,kBACFpoB,EAAK2Y,WAAa,CAChB1R,EAAGjH,EAAKsY,cAAcrR,EAAIjH,EAAKyZ,WAAWxS,EAC1Cc,EAAG/H,EAAKsY,cAAcvQ,EAAI/H,EAAKyZ,WAAW1R,EAC1CuG,WAAYtO,EAAKqO,UAAUC,WAC3Ba,UAAWnP,EAAKqO,UAAUc,UAC1BpE,EAAGqC,YAAYC,OAEjBrN,EAAK8M,YAAc9M,EAAK0sB,UACtB1sB,EAAKsY,cAAcrR,EACnBjH,EAAKsY,cAAcvQ,GAErB/H,EAAKmC,cAAc,YAAa,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,cAC7D9M,EAAKw5B,eACLx5B,EAAKoZ,cAAgBhM,YAAYC,MAAQrN,EAAKw6B,iBAAiBzvB,EAC/D/K,EAAK45B,eAAgB,EACrB55B,EAAK+3B,gBAAkB,EAErB/3B,EAAKm7B,iBACJG,GAAeC,GAAeE,GAAeD,aAhCvCS,QACHh1B,EAAIjH,EAAKqO,UAAUC,WACrBvG,EAAI/H,EAAKqO,UAAUc,UACrBlI,GAAKq0B,EAAct7B,EAAKE,WAAW2wB,yBAA2B,EAC9D9oB,GAAKyzB,EAAcx7B,EAAKE,WAAW2wB,yBAA2B,EAC9D9oB,GAAK0zB,EAAcz7B,EAAKE,WAAW2wB,yBAA2B,EAC9D5pB,GAAKs0B,EAAcv7B,EAAKE,WAAW2wB,yBAA2B,EAC9D7wB,EAAKqO,UAAU0mB,SAAS9tB,EAAGc,GAC3B+vB,EAAqBnH,WACnBsL,EACAj8B,EAAKE,WAAW0wB,kBAwBlBqL,GAEE,mBAAmB34B,KAAKtD,EAAKg6B,aAAa13B,OAC5CtC,EAAKqO,UAAUc,UACbnP,EAAKqO,UAAU+H,eACbpW,EAAKsY,cAAcvQ,EAAIiiB,EAAKP,IAC3BzpB,EAAKqO,UAAUnG,OAASuhB,EAAMO,IAGjC,qBAAqB1mB,KAAKtD,EAAKg6B,aAAa13B,OAC9CtC,EAAKqO,UAAUC,WACbtO,EAAKqO,UAAU2H,cACbhW,EAAKsY,cAAcrR,EAAIo0B,EAAK5R,IAAQzpB,EAAKqO,UAAUlG,MAAQshB,EAAM4R,IAGnE,oBAAoB/3B,KAAKtD,EAAKg6B,aAAa13B,OAC7CtC,EAAKi7B,YAAYj7B,EAAK8M,YAAa9M,EAAKg6B,aAAa13B,OAGvDtC,EAAKqO,UAAU0mB,SACb/0B,EAAKw6B,iBAAiBvzB,EAAIjH,EAAK2Y,WAAW1R,EAC1CjH,EAAKw6B,iBAAiBzyB,EAAI/H,EAAK2Y,WAAW5Q,KAS1Cm0B,CAAUv5B,GACVk1B,GAAc,MAGlB73B,EAAK46B,eAAiB,SAAUj4B,GAC9B3C,EAAKmY,oBAAiBjR,EACtBlH,EAAKm7B,gBAAiB,EACtBjB,cAAcl6B,EAAK83B,oBACnBoC,cAAcl6B,EAAKo6B,qBACnBF,cAAcl6B,EAAKm6B,mBACnBx3B,EAAEylB,kBACFjiB,SAAS8pB,KAAK1H,oBAAoB,YAAavoB,EAAK66B,UAAW,CAC7DC,SAAS,IAEX30B,SAAS8pB,KAAK1H,oBAAoB,WAAYvoB,EAAK+6B,UAAU,GAC7D50B,SAAS8pB,KAAK1H,oBAAoB,cAAevoB,EAAKg7B,aAAa,IAErEh7B,EAAK+6B,SAAW,SAAUp4B,OAEtB3C,EAAKmC,cAAc,WAAY,CAAEwqB,YAAahqB,EAAGyE,KAAMpH,EAAK8M,iBAI9D9M,EAAKmY,oBAAiBjR,EAClBvE,EAAEo3B,eAAe,KACnB/5B,EAAKsY,mBAAgBpR,GAEnBvE,EAAEo3B,eAAe,KACnB/5B,EAAKuY,oBAAiBrR,GAEpBlH,EAAKs6B,YACkB,IAArB33B,EAAE0V,QAAQvS,SACZ9F,EAAKs6B,aAAc,YAInB6B,EACFv0B,KAAKoT,IAAIhb,EAAK2Y,WAAW1R,GAAKW,KAAKoT,IAAIhb,EAAK2Y,WAAW5Q,GACvD/H,EAAKE,WAAW07B,cACdz4B,MAAMnD,EAAK+Y,QACb/Y,EAAK+Y,KAAO,GAEV5V,MAAMnD,EAAKgZ,QACbhZ,EAAKgZ,KAAO,GAEV7V,MAAMnD,EAAKkZ,SACblZ,EAAKkZ,MAAQ,GAEX/V,MAAMnD,EAAKmZ,SACbnZ,EAAKmZ,MAAQ,GAEfnZ,EAAK4Y,eAAe3R,EAClBjH,EAAK+Y,KAAO/Y,EAAKE,WAAWk8B,yBAC9Bp8B,EAAK4Y,eAAe7Q,EAClB/H,EAAKgZ,KAAOhZ,EAAKE,WAAWk8B,yBAC9Bp8B,EAAKs5B,oBAEF6C,GACwB,IAAzBn8B,EAAK+3B,mBACJnwB,KAAKoT,IAAIhb,EAAKkZ,OAASlZ,EAAKE,WAAWm8B,6BACtCz0B,KAAKoT,IAAIhb,EAAKmZ,OAASnZ,EAAKE,WAAWm8B,8BACxC,WAAW/4B,KAAKtD,EAAKg6B,aAAa13B,QAClC65B,IAEDn8B,EAAK45B,eAAgB,EACrB55B,EAAK05B,qBAEP15B,EAAK46B,eAAej4B,KAEtB3C,EAAKg7B,YAAc,SAAUr4B,GAEzB3C,EAAKmC,cAAc,cAAe,CAChCwqB,YAAahqB,EACbyE,KAAMpH,EAAK8M,eAKf9M,EAAK46B,eAAej4B,IC7eT,cAAU3C,EAAMs8B,YA4RpBz1B,EAAUC,EAAKC,OAEpBE,EADEvD,EAAI,OAEHuD,EAAIH,EAAKG,GAAKF,EAAME,GAAK,EAC5BvD,EAAEuD,GAAKA,SAEFvD,EAjST1D,EAAKgY,MAAQ,EACbhY,EAAKuN,OAAS,CACZC,KAAM,GACNmC,QAAS,IAEX3P,EAAKwrB,oBAAsB,GAC3BxrB,EAAK6b,mBAAqB,GAC1B7b,EAAKu8B,mBAAqB,GAC1Bv8B,EAAKsN,kBAAoB,GACzBtN,EAAK0Z,UAAW,EAChB1Z,EAAKiQ,WAAa,CAChBtI,YAAa,EACbD,SAAU,GAEZ1H,EAAKmE,UAAY,GACjBnE,EAAKw8B,YAAc,iBACnBx8B,EAAKy8B,sBAAwB,wCAC7Bz8B,EAAK08B,4BAA8B,qCACnC18B,EAAK4E,SAAW,gCAChB5E,EAAKogB,QAAU,KACfpgB,EAAK4gB,eAAiB,MACtB5gB,EAAK8jB,UAAY,CACfnU,QAAS,GACTgtB,IAAK,SAAUvc,EAASQ,EAAgBgc,GACtC58B,EAAK8jB,UAAUnU,QAAU3P,EAAK8jB,UAAUnU,QAAQ5K,QAAO,SAAUgjB,UACxDA,EAAI3H,UAAYA,KAEzBpgB,EAAK8jB,UAAUnU,QAAQ9L,KAAK,CAC1Buc,QAASA,EACTQ,eAAgBA,EAChBgc,aAAcA,KAGlBC,KAAM,WACJ9b,QAAQC,KACN,uEAGFhhB,EAAK8jB,UAAUnU,QAAQ9O,SAAQ,SAAUknB,GACvC/nB,EAAKsM,SAASuwB,KAAK9U,EAAI6U,aAAa7U,EAAI3H,QAAS2H,EAAInH,sBAI3D5gB,EAAKihB,cAAgB,GACrBjhB,EAAK88B,QAAU,GACf98B,EAAKoO,UAAY,EACjBpO,EAAKkQ,aAAe,EACpBlQ,EAAK4rB,cAAgB,GACrB5rB,EAAKiqB,YAAc,CAAEhjB,EAAG,GAAIc,EAAG,IAC/B/H,EAAKqO,UAAY,GACjBrO,EAAK2N,YAAc,GACnB3N,EAAK6N,aAAe,GACpB7N,EAAK+R,MAAQ,CACXvE,KAAM,GACNmC,QAAS,GACT4U,MAAO,IAETvkB,EAAK0b,WAAa,GAClB1b,EAAKqc,OAAS,GACdrc,EAAKE,WAAa,GAClBF,EAAKsC,MAAQ,GACbtC,EAAK4c,WAAa,GAClB5c,EAAK+8B,QAAU,GACf/8B,EAAKg9B,QAAU,GACfh9B,EAAKi9B,aAAe,GACpBj9B,EAAKsoB,OAAS,GACdtoB,EAAKk9B,QAAU,GACfl9B,EAAKqP,eAAiB,EACtBrP,EAAKoP,eAAiB,EACtBpP,EAAK0P,gBAAkB,EACvB1P,EAAKuO,gBAAkB,EACvBvO,EAAK+f,WAAa,GAClB/f,EAAKgS,aAAe,GACpBhS,EAAK0wB,YAAc,CACjB,sBACA,sBACA,yBACA,wBACA,0BACA,0BAEF1wB,EAAKm9B,kBAAoB,GACzBn9B,EAAKo9B,WAAa,CAChB,YACA,kBACA,mBACA,kBACA,uBACA,aACA,gBACA,mBACA,uBACA,YACA,eACA,gBACA,QACA,eACA,cACA,OACA,cACA,WACA,UACA,aACA,kBACA,UACA,WACA,QACA,YACA,YACA,UACA,SACA,cACA,aACA,iBACA,qBACA,aACA,kBACA,UACA,aACA,SACA,eACA,YACA,gBACA,SACA,mBACA,eACA,cACA,WACA,YACA,aACA,SAEFp9B,EAAKuZ,MAAQ,CAAEtS,EAAG,EAAGc,EAAG,GACxB/H,EAAKkuB,gBAAkB,SAAUmP,OACzBpP,EAAe,GACfprB,EAAS7C,EAAK4N,YACd0vB,EAAiBt9B,EAAKsM,SAASxG,cAEd,IAAnBw3B,EACK,IAMTt9B,EAAK0b,WAAW7a,SAAQ,SAAUoc,EAAKiB,GAChCjB,GAIDiB,IAAiBof,IAIF,IAAfrgB,EAAInX,QAKRmoB,EAAa/P,GAAgB,GAE7BjB,EAAIpc,SAAQ,SAAUknB,OACP,IAATA,GAAellB,EAAOklB,QAIpBwV,EAAev9B,EAAKuN,OAAOoC,QAAQoY,IAEpCsV,GAAex6B,EAAO06B,GAActsB,QAIrCjR,EAAKsM,SAAS4R,KAChB+P,EAAa/P,GAAcrb,EAAO06B,GAAcr4B,MAC9ClF,EAAKsM,SAAS4R,GAAcrb,EAAO06B,GAAcr4B,YAnBrD+oB,EAAa/P,GAAgB,SAwB1B+P,IAETjuB,EAAKouB,iBAAmB,SAAUiP,OAC1BlP,EAAgB,GAChBtrB,EAAS7C,EAAK4N,eAGG,IAFA5N,EAAKsM,SAASxG,aAG5B,sCAGyB9F,EAAK0b,WAAW0b,0CAAW,iCAAjDlZ,OAAcjB,UACnBA,GAAsB,IAAfA,EAAInX,2CAEkBmX,EAAIma,0CAAW,KAAnCjZ,mCACa,IAArBA,GAA2Btb,EAAOsb,QAIhCE,EAAmBre,EAAKse,uCAC5BH,OAGGkf,IAAex6B,EAAOwb,GAAkBpN,SAIzCjR,EAAKsM,SAAS4R,GAAe,KACzBtN,EAAS/N,EAAOwb,GAMhBjX,EAAO,CACX4V,MANYhd,EAAKsM,SAAS4R,GAActN,EAAO1L,MAO/C0L,OAAAA,EACAwN,cAPoBpe,EAAKyR,iCACzByM,GAOAG,iBAAAA,EACAH,aAAAA,EACAC,gBAAAA,GAGFgQ,EAActqB,KAAKuD,4EAKlB+mB,GAETnuB,EAAKyR,iCAAmC,SAAUyM,MAC5Cle,EAAK81B,kBAAoB91B,EAAK81B,iBAAiB0H,IAAItf,UAC9Cle,EAAK81B,iBAAiBhR,IAAI5G,IAKrCle,EAAKse,uCAAyC,SAAUH,UAC/Cne,EAAKuN,OAAOoC,QAAQwO,IAE7Bne,EAAKgN,0BAA4B,kBAC1BhN,EAAKE,WAAWgS,mBAIlBlS,EAAK+R,MAAMvE,MAAM,IAAMxN,EAAKsC,MAAMyK,wBAA0B/M,EAAKgY,MAH3D,GAMXhY,EAAKkN,sBAAwB,kBACtBlN,EAAKE,WAAWuP,gBAIlBzP,EAAK+R,MAAMpC,SAAS,IAAM3P,EAAKsC,MAAM2K,oBAAsBjN,EAAKgY,MAH1D,GAMXhY,EAAKkwB,eAAiB,cACflwB,EAAKE,WAAW8f,gBAAmBhgB,EAAKE,WAAWgF,UAGpDu4B,EAAa,GACjBz9B,EAAK4N,YAAY/M,SAAQ,SAAUspB,GACjCsT,EAAWtT,EAAOjlB,OAASilB,EAAOlZ,UAEpCysB,aAAaC,QACX39B,EAAKw8B,YAAc,IAAMx8B,EAAKE,WAAWgF,KACzCzC,KAAKugB,UAAU,CACbjR,MAAO,CACLvE,KAAMxN,EAAK+R,MAAMvE,KACjBmC,QAAS3P,EAAK+R,MAAMpC,SAEtBpC,OAAQ,CACNC,KAAMxN,EAAKuN,OAAOC,KAClBmC,QAAS3P,EAAKuN,OAAOoC,SAEvByQ,QAASpgB,EAAKogB,QACdQ,eAAgB5gB,EAAK4gB,eACrB6c,WAAYA,OAIlBz9B,EAAK4N,UAAY,kBACR5N,EAAK6C,QAAU7C,EAAK49B,YAAc,IAU3C59B,EAAK69B,mBAAqB,eACpBjmB,EAAI5X,EAAK4N,YACb5N,EAAKuN,OAAOoC,QAAU9I,EAAU,EAAG+Q,EAAE9R,OAAS,IAEhD9F,EAAKyN,gBAAkB,WACrBzN,EAAKuN,OAAOC,KAAO3G,EAAU,EAAG7G,EAAK0R,aAAa5L,OAAS,IAE7D9F,EAAKk2B,iBAAmB,kBACfl2B,EAAK4N,YAAY7I,QAAO,SAAUgjB,UAC/BA,EAAI9W,WAGhBjR,EAAK89B,kBAAoB,SAAU7gB,EAAKrM,EAAQlJ,OAC1C2E,EAAIuE,EAAOmtB,cAAgB,GACd,mBAAN1xB,IACTA,EAAIA,EAAEqO,MAAM1a,EAAKsB,KAAM,CAACsP,EAAQlJ,KAElCuV,EAAIrM,EAAO1L,MAAQmH,GAErBrM,EAAKg+B,iBAAmB,WACtBh+B,EAAK6P,OAAS,GAQd7P,EAAK4N,YAAY/M,SAAQ,SAAuB+P,GAC9C5Q,EAAK89B,kBAAkB99B,EAAK6P,OAAQe,EAHlB1J,eAMtBlH,EAAKi+B,kBAAoB,SAAUnkB,WAC7B7W,EAAI,EACDjD,EAAKi9B,aAAanjB,IAEvBA,GADA7W,GAAK,SAGA6W,GAET9Z,EAAK+E,OAAS,SAAUgB,OAClB4W,EAAI3c,EAAK88B,QAAQ/2B,UAChB4W,QAAczV,IAATnB,IACRgb,QAAQC,KACN,mEACAjb,GAEF4W,EAAI3c,EAAK88B,QAAQv5B,QAEZoZ,GAET3c,EAAK4R,iBAAmB,kBACf5R,EAAKihB,eAAiBvY,OAAOC,KAAK3I,EAAKihB,eAAenb,OAAS,GAExE9F,EAAKk+B,6BAA+B,SAAUxsB,kBAOxCysB,EAAczsB,EAAa6Q,IAAI,SAACtF,EAAKmhB,iCAAqB,CAC5DnhB,EACAmhB,0DAIUC,OAAYC,OAChB1tB,EAAS5Q,EAAKu+B,gBAAgBF,OAE/BztB,uBAIC4tB,EACJ5tB,EAAO7L,QAAU/E,EAAK+E,OAAO6L,EAAO7K,MAAQ,UAE9Co4B,EAAcA,EAAYp5B,QAAO,sCAAWkY,OAAKmhB,gBAE7Cp+B,EAAKE,WAAWwO,oBACf1O,EAAKE,WAAWu+B,kBACjBL,EAAmBp+B,EAAKoO,YAInBowB,EAAsBvhB,EAAIohB,GAAaC,aAlBX51B,OAAO0uB,QAAQp3B,EAAKihB,qEAuBtCjhB,EAAK8jB,UAAUnU,yCAAzBwa,UACHuU,EAASvU,EAAOyS,aAAazS,EAAO/J,QAAS+J,EAAOvJ,gBAE1Dud,EAAYtB,KAAK,yCAAE8B,+CAAQC,OAAMC,cAE7B7+B,EAAKE,WAAWwO,oBACf1O,EAAKE,WAAW4+B,gBACjBD,EAAY7+B,EAAKoO,UAEV,EACFswB,EAAOC,EAAMC,oFAIjB,CACLtyB,SAAU6xB,EAAY5b,IAAI,8EAC1BuT,iBAAkB,IAAIS,IACpB4H,EAAY5b,IAAI,WAA2BrE,+DAAiB,CAC1DA,wBAMRle,EAAK++B,QAAU,iBAC0B/+B,EAAKk+B,6BAC1Cl+B,EAAK0R,cADCpF,IAAAA,SAAUwpB,IAAAA,iBAIlB91B,EAAKsM,SAAWA,EAChBtM,EAAK81B,iBAAmBA,EAExB91B,EAAKqC,SACLrC,EAAK6I,MAAK,IAEZ7I,EAAKg/B,qBAAuB,SAAUnJ,EAAYtzB,OAC5CwI,EACF9D,EACA+D,EAAIzI,EAAKuD,WACNmB,EAAI,EAAGA,EAAI+D,EAAG/D,GAAK,UAERC,IAAZ3E,EAAK0E,IACO,OAAZ1E,EAAK0E,KAC+C,IAApD,CAAC,UAAMC,GAAWyU,QAAQpZ,EAAK0E,GAAG4uB,UAGrB,YADb9qB,UAAWxI,EAAK0E,KACQ,SAAW8D,QAGhC,UAET/K,EAAKi/B,eAAiB,WACpBv2B,OAAOC,KAAK3I,EAAK+f,YAAYlf,SAAQ,SAAUq+B,GAC7Cl/B,EAAK+f,WAAWmf,GAASr2B,WAG7B7I,EAAK8vB,iBAAmB,WACtBpnB,OAAOC,KAAK3I,EAAK+f,YAAYlf,SAAQ,SAAUq+B,GAC7Cl/B,EAAK+f,WAAWmf,GAAS78B,aAG7BrC,EAAK4uB,eAAiB,SAAUjsB,EAAGsE,EAAGc,EAAGskB,OACnC8S,EACFlyB,EAAqBjN,EAAKkN,wBAC1BH,EAAyB/M,EAAKgN,6BACrB,IAAP/F,IACEA,EAAIjH,EAAKmI,MAAQnI,EAAKE,WAAW87B,sBACnCh8B,EAAKqO,UAAUC,YAActO,EAAKE,WAAW2wB,yBAC7CsO,GAAW,GAETl4B,EAAIjH,EAAKE,WAAW87B,oBAAsB/uB,EAAqB,IACjEjN,EAAKqO,UAAUC,YAActO,EAAKE,WAAW2wB,yBAC7CsO,GAAW,KAGJ,IAAPp3B,IACEA,EAAI/H,EAAKkI,OAASlI,EAAKE,WAAW87B,sBACpCh8B,EAAKqO,UAAUc,WAAanP,EAAKE,WAAW2wB,yBAC5CsO,GAAW,GAGXp3B,EAAI/H,EAAKE,WAAW87B,oBAAsBjvB,EAC1C,IAEA/M,EAAKqO,UAAUc,WAAanP,EAAKE,WAAW2wB,yBAC5CsO,GAAW,IAIbA,IACC9S,GACDrsB,EAAK8M,cAC6B,IAAlC9M,EAAK8M,YAAYnF,cAEjB3H,EAAK8sB,YAAc6D,WACjB3wB,EAAK6rB,UACL7rB,EAAKE,WAAW0wB,iBAChBjuB,KAIN3C,EAAKo/B,eAAiB,SAAUv0B,EAAG+M,OAC5B/M,EAAE3F,WACC,IAAItC,MAAM,6CAGhBgV,EAAE7S,QAAO,SAAUrB,UACVA,EAAEwB,OAAS2F,EAAE3F,QACnBY,OAAS,QAEN,IAAIlD,MACR,0BACEiI,EAAE3F,KACF,qDAGC,GAETlF,EAAKq/B,YAAc,SAAUC,EAAMC,EAAMzlB,EAAK/X,GAC5Cu9B,EAAKxlB,QAAqB5S,IAAdq4B,EAAKzlB,GAAqB/X,EAAMw9B,EAAKzlB,IAEnD9Z,EAAKw/B,cAAgB,WACnBx/B,EAAKC,SAASC,WAAWW,SAAQ,SAAuB6C,GACtD1D,EAAKq/B,YAAYr/B,EAAKE,WAAYF,EAAKsqB,KAAM5mB,EAAE,GAAIA,EAAE,QAGzD1D,EAAKy/B,SAAW,WACdz/B,EAAKC,SAASE,OAAOU,SAAQ,SAAmB6C,GAC9C1D,EAAKq/B,YAAYr/B,EAAKsC,MAAOtC,EAAKsqB,KAAKhoB,OAAS,GAAIoB,EAAE,GAAIA,EAAE,QAGhE1D,EAAKy0B,SAAW,SAAUa,GACxBt1B,EAAKk2B,mBAAmBr1B,SAAQ,SAAUknB,EAAK6N,GACzC7N,EAAI7iB,OAASowB,QAAuBpuB,IAAZouB,IAC1Bt1B,EAAK+R,MAAMpC,QAAQimB,GAAYhuB,KAAKiT,IAClC7a,EAAK0/B,wBAAwB3X,EAAI7iB,MACjClF,EAAKsC,MAAMqtB,oBAIjB3vB,EAAK+R,MAAMpC,SAAS,GAAK3P,EAAK0/B,wBAAwB,eAExD1/B,EAAK2/B,QAAU,YACR3/B,EAAKkL,aAAelL,EAAK4B,QAAU5B,EAAK4B,OAAOgE,YAClD5F,EAAK4B,OAAOgE,WAAWg6B,YAAY5/B,EAAK4B,QAErC5B,EAAKkL,aACR/E,SAAS8pB,KAAK2P,YAAY5/B,EAAK0yB,cAEjC1yB,EAAK6/B,YAAYtX,oBAAoB,UAAWvoB,EAAKyyB,SAAS,GAC9DzyB,EAAK6/B,YAAYtX,oBAAoB,YAAavoB,EAAKkyB,WAAW,GAClElyB,EAAK6/B,YAAYtX,oBAAoB,WAAYvoB,EAAKu0B,UAAU,GAChEv0B,EAAK6/B,YAAYtX,oBAAoB,QAASvoB,EAAK6uB,OAAO,GAC1D7uB,EAAK6/B,YAAYtX,oBAAoB,YAAavoB,EAAK6rB,WACvD7rB,EAAK6/B,YAAYtX,oBAAoB,QAASvoB,EAAK00B,aAAa,GAChE10B,EAAK4B,OAAO2mB,oBAAoB,cAAevoB,EAAK8/B,aAAa,GACjE9/B,EAAK4B,OAAO2mB,oBAAoB,OAAQvoB,EAAKm3B,MAC7Cn3B,EAAK0yB,aAAanK,oBAAoB,OAAQvoB,EAAKm3B,MACnDn3B,EAAK0yB,aAAanK,oBAAoB,MAAOvoB,EAAKk3B,KAClDl3B,EAAK0yB,aAAanK,oBAAoB,QAASvoB,EAAKo2B,OACpDp2B,EAAK0yB,aAAanK,oBAAoB,WAAYvoB,EAAKs0B,UAAU,GACjEt0B,EAAK0yB,aAAanK,oBAAoB,QAASvoB,EAAKq0B,OAAO,GAC3Dr0B,EAAK0yB,aAAanK,oBAAoB,UAAWvoB,EAAK+yB,SAAS,GAC/DtxB,OAAO8mB,oBAAoB,SAAUvoB,EAAKqC,QACtCrC,EAAKmF,UAAYnF,EAAKmF,SAAS46B,YACjC//B,EAAKmF,SAAS46B,cAGlB//B,EAAKggC,sBAAwB,eACvBpoB,EACJ5X,EAAKigC,qBAEHjgC,EAAKkgC,gBACiC,WAAtCC,QAAOngC,EAAKkgC,eAAe3yB,SACI,OAA/BvN,EAAKkgC,eAAe3yB,SAGlBvN,EAAKkgC,eAAe3yB,OAAOC,KAAK1H,SAAW9F,EAAKsM,UAAY,IAAIxG,SAEhE9F,EAAKuN,OAAOC,KAAOxN,EAAKkgC,eAAe3yB,OAAOC,MAEhDoK,EAAI5X,EAAK4N,YACL5N,EAAKkgC,eAAe3yB,OAAOoC,QAAQ7J,SAAW8R,EAAE9R,SAClD9F,EAAKuN,OAAOoC,QAAU3P,EAAKkgC,eAAe3yB,OAAOoC,SAEnD3P,EAAKogB,aAC6BlZ,IAAhClH,EAAKkgC,eAAe9f,QAChBxI,EAAE,GAAG1S,KACLlF,EAAKkgC,eAAe9f,QAC1BpgB,EAAK4gB,oBACoC1Z,IAAvClH,EAAKkgC,eAAetf,eAChB,MACA5gB,EAAKkgC,eAAetf,oBAEQ1Z,IAAhClH,EAAKkgC,eAAe9f,SACpBpgB,EAAKu+B,gBAAgBv+B,EAAKogB,UAC1BpgB,EAAK4gB,gBAEL5gB,EAAKqR,MAAMrR,EAAKogB,QAASpgB,EAAK4gB,kBAIpC5gB,EAAKogC,WAAa,kBACTpgC,EAAKqgC,WAAargC,EAAKqgC,WAAWC,KAAOtgC,EAAK4F,YAEvD5F,EAAKugC,YAAc,SAAUC,UACpBA,EAAUhgC,QAAQ,cAAe,KAE1CR,EAAKygC,cAAgB,SAAUD,UACtBE,WAAWF,EAAW,KAE/BxgC,EAAK2gC,gBAAkB,SAAU7mB,MAC3B,OAAOxW,KAAKwW,UACd9Z,EAAKsC,MAAMwX,EAAM,UAAY9Z,EAAKygC,cAAczgC,EAAKsC,MAAMwX,SAC3D9Z,EAAKsC,MAAMwX,EAAM,QAAU9Z,EAAKugC,YAAYvgC,EAAKsC,MAAMwX,KAK/C,8BAARA,GAC2B,iBAApB9Z,EAAKsC,MAAMwX,KAElB9Z,EAAKsC,MAAMwX,GAAO9Z,EAAKsC,MAAMwX,GAAK6H,MAAM,KAAKY,KAAI,SAAU7e,UAClDR,SAASQ,EAAG,SAIzB1D,EAAK4gC,SAAW,SAAUC,GACnB7gC,EAAKsqB,KAAKuW,IAGfn4B,OAAOC,KAAK3I,EAAKsqB,KAAKuW,IAAWhgC,SAAQ,SAAUiZ,GACjD9Z,EAAK6gC,GAAU/mB,GAAO9Z,EAAKsqB,KAAKuW,GAAU/mB,OAG9C9Z,EAAK8gC,iBAAmB,SAAUhnB,UACK,IAAjC9Z,EAAK+gC,UAAUplB,QAAQ7B,GAClB9Z,EAAKyrB,gBAAgB3R,GAEvB9Z,EAAKsC,MAAMwX,IAEpB9Z,EAAKkC,iBAAmB,SAAU4X,EAAKkD,EAAOgkB,OACxCC,GAQkB,IAPpB,CACE,SACA,QACA,YACA,WACA,YACA,YACAtlB,QAAQ7B,IACyB,IAAjC9Z,EAAK+gC,UAAUplB,QAAQ7B,GACzB9Z,EAAKyrB,gBAAgB3R,GAAOkD,GAExB,IAAI1Z,KAAKwW,KACXA,EAAM9Z,EAAKM,oBAAoBwZ,IAEjC9Z,EAAKsC,MAAMwX,GAAOkD,EAClBhd,EAAK2gC,gBAAgB7mB,IAEnBmnB,GACFjhC,EAAKqC,SAEF2+B,IACHhhC,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,eAAgB,CAAE+C,KAAM,QAAS8X,MAAOA,MAG/Dhd,EAAKigC,mBAAqB,cACpBjgC,EAAKE,WAAWgF,MAAQlF,EAAKE,WAAW8f,eAAgB,KAExDhgB,EAAKkgC,eAAiBxC,aAAawD,QACjClhC,EAAKw8B,YAAc,IAAMx8B,EAAKE,WAAWgF,MAE3C,MAAOvC,GACPoe,QAAQC,KAAK,gCAAkCre,EAAEw+B,SACjDnhC,EAAKkgC,oBAAiBh5B,KAEpBlH,EAAKkgC,mBAELlgC,EAAKkgC,eAAiBz9B,KAAKC,MAAM1C,EAAKkgC,gBACtC,MAAOv9B,GACPoe,QAAQC,KAAK,0CAA2Cre,GACxD3C,EAAKkgC,oBAAiBh5B,EAGtBlH,EAAKkgC,iBAEgC,WAArCC,QAAOngC,EAAKkgC,eAAenuB,QACG,OAA9B/R,EAAKkgC,eAAenuB,QAEpB/R,EAAK+R,MAAMvE,KAAOxN,EAAKkgC,eAAenuB,MAAMvE,KAC5CxN,EAAK+R,MAAMpC,QAAU3P,EAAKkgC,eAAenuB,MAAMpC,SAC9C,QAAS,UAAW,QAAQ9O,SAAQ,SAAU6C,GACxC1D,EAAK+R,MAAMrO,KACd1D,EAAK+R,MAAMrO,GAAK,QAIwB,WAA1Cy8B,QAAOngC,EAAKkgC,eAAezC,aAC7Bz9B,EAAK4N,YAAY/M,SAAQ,SAAUspB,GAE/BnqB,EAAKkgC,eAAezC,iBAC4Bv2B,IAAhDlH,EAAKkgC,eAAezC,WAAWtT,EAAOjlB,QAEtCilB,EAAOlZ,QAAUjR,EAAKkgC,eAAezC,WAAWtT,EAAOjlB,aAOnElF,EAAKohC,KAAO,eACNphC,EAAKqhC,iBAQLC,EAAqB,UACzBthC,EAAKw/B,gBACLx/B,EAAKy/B,WACLz/B,EAAKuhC,gBACLvhC,EAAKwhC,SACLxhC,EAAKkd,SAAW,kBAChBld,EAAKyhC,GAAK,UAAUn+B,KAAK7B,OAAOigC,UAAUC,WAC1C3hC,EAAK4hC,KAAO,OAAOt+B,KAAK7B,OAAOigC,UAAUC,WACzC3hC,EAAK6hC,OAAS,SAASv+B,KAAK7B,OAAOigC,UAAUC,WAC7C3hC,EAAK8hC,IAAM,QAAQx+B,KAAK7B,OAAOigC,UAAUC,WACzC3hC,EAAKmT,OAAS,UAAU7P,KAAK7B,OAAOigC,UAAUC,WAC9C3hC,EAAK+hC,YAAc,MAAC76B,EAAW,KAAM,IACrClH,EAAKgiC,WAAa,OAClBhiC,EAAKiiC,cAAgB,WACrBjiC,EAAKgiC,WAAahiC,EAAK6hC,OAAS,eAAiB7hC,EAAKgiC,WACtDhiC,EAAKiiC,cAAgBjiC,EAAK8hC,IAAM,mBAAqB9hC,EAAKkiC,eAC1DliC,EAAKqZ,oBAAsB,CAAEpS,EAAG,EAAGc,EAAG,GACtCW,OAAOC,KAAK3I,EAAKsC,OAAOzB,QAAQb,EAAK2gC,iBACrC3gC,EAAKsB,KAAKwwB,cAAgB9xB,EAAK8xB,cAC/B9xB,EAAKsB,KAAKiI,OAASvJ,EAAKuJ,OACxBvJ,EAAKsB,KAAK0D,iBAAmBhF,EAAKgF,iBAClChF,EAAKsB,KAAKinB,oBAAsBvoB,EAAKuoB,oBACrCvoB,EAAKsB,KAAKa,cAAgBnC,EAAKmC,cAO/BnC,EAAKsB,KAAKq+B,QAAU3/B,EAAK2/B,QAQzB3/B,EAAKsB,KAAK6gC,SAAWniC,EAAKmiC,SAC1BniC,EAAKsB,KAAK8gC,sBAAwBpiC,EAAKoiC,sBACvCpiC,EAAKsB,KAAKw7B,QAAU98B,EAAK88B,QACzB98B,EAAKsB,KAAKy7B,QAAU/8B,EAAK+8B,QACzB/8B,EAAKsB,KAAKmzB,SAAWz0B,EAAKy0B,SAC1Bz0B,EAAKsB,KAAK8xB,YAAcpzB,EAAKozB,YAC7BpzB,EAAKsB,KAAKytB,QAAU/uB,EAAK+uB,QACzB/uB,EAAKsB,KAAK0tB,cAAgBhvB,EAAKgvB,cAC/BhvB,EAAKsB,KAAK+zB,oBAAsBr1B,EAAKq1B,oBACrCr1B,EAAKsB,KAAK6yB,eAAiBn0B,EAAKm0B,eAChCn0B,EAAKsB,KAAK+gC,eAAiBriC,EAAKqiC,eAChCriC,EAAKsB,KAAKghC,SAAWtiC,EAAKsiC,SAC1BtiC,EAAKsB,KAAKihC,QAAUviC,EAAKuiC,QACzBviC,EAAKsB,KAAKi9B,gBAAkBv+B,EAAKu+B,gBACjCv+B,EAAKsB,KAAKkhC,qBAAuBxiC,EAAKwiC,qBACtCxiC,EAAKsB,KAAKmhC,iBAAmBziC,EAAKyiC,iBAClCziC,EAAKsB,KAAKkzB,kBAAoBx0B,EAAKw0B,kBACnCx0B,EAAKsB,KAAKo+B,wBAA0B1/B,EAAK0/B,wBACzC1/B,EAAKsB,KAAK24B,mBAAqBj6B,EAAKi6B,mBACpCj6B,EAAKsB,KAAKorB,UAAY1sB,EAAK0sB,UAC3B1sB,EAAKsB,KAAKohC,cAAgB1iC,EAAK0iC,cAC/B1iC,EAAKsB,KAAKqhC,aAAe3iC,EAAK2iC,aAC9B3iC,EAAKsB,KAAKshC,gBAAkB5iC,EAAK4iC,gBACjC5iC,EAAKsB,KAAK+P,MAAQrR,EAAKqR,MACvBrR,EAAKsB,KAAKuH,KAAO7I,EAAK6I,KACtB7I,EAAKsB,KAAKy9B,QAAU/+B,EAAK++B,QACzB/+B,EAAKsB,KAAKC,YAAcvB,EAAKuB,YAC7BvB,EAAKsB,KAAKitB,WAAavuB,EAAKuuB,WAC5BvuB,EAAKsB,KAAKuhC,YAAc7iC,EAAK6iC,YAC7B7iC,EAAKsB,KAAKwhC,kBAAoB9iC,EAAK8iC,kBACnC9iC,EAAKsB,KAAKyhC,UAAY/iC,EAAK+iC,UAC3B/iC,EAAKsB,KAAKgtB,UAAYtuB,EAAKsuB,UAC3BtuB,EAAKsB,KAAK6J,WAAanL,EAAKmL,WAC5BnL,EAAKsB,KAAKguB,WAAatvB,EAAKsvB,WAC5BtvB,EAAKsB,KAAK0hC,WAAahjC,EAAKgjC,WAC5BhjC,EAAKsB,KAAK2hC,aAAejjC,EAAKijC,aAC9BjjC,EAAKsB,KAAKM,OAAS5B,EAAK4B,OACxB5B,EAAKsB,KAAKmV,QAAUzW,EAAKqI,IACzBrI,EAAKsB,KAAK4hC,UAAYljC,EAAKkjC,UAC3BljC,EAAKsB,KAAK6hC,UAAYnjC,EAAKmjC,UAC3BnjC,EAAKsB,KAAK8hC,OAASpjC,EAAKojC,OACxBpjC,EAAKsB,KAAK+hC,aAAerjC,EAAKqjC,aAC9BrjC,EAAKsB,KAAKgiC,aAAetjC,EAAKsjC,aAC9BtjC,EAAKsB,KAAKiiC,UAAYvjC,EAAKujC,UAC3BvjC,EAAKsB,KAAKkiC,gBAAkBxjC,EAAKwjC,gBACjCxjC,EAAKsB,KAAKmiC,aAAezjC,EAAKyjC,aAC9BzjC,EAAKsB,KAAKoiC,eAAiB1jC,EAAK0jC,eAChC1jC,EAAKsB,KAAKqiC,kBAAoB3jC,EAAK2jC,kBACnC3jC,EAAKsB,KAAKsiC,gBAAkB5jC,EAAK4jC,gBACjC5jC,EAAKsB,KAAKe,OAASrC,EAAKqC,OACxBrC,EAAKsB,KAAK8tB,aAAepvB,EAAKovB,aAC9BpvB,EAAKsB,KAAKgtB,UAAYtuB,EAAKsuB,UAC3BtuB,EAAKsB,KAAK2tB,UAAYjvB,EAAKivB,UAC3BjvB,EAAKsB,KAAK+xB,WAAarzB,EAAKqzB,WAC5BrzB,EAAKsB,KAAK29B,eAAiBj/B,EAAKi/B,eAChCj/B,EAAKsB,KAAKuiC,cAAgB7jC,EAAK6jC,cAC/B7jC,EAAKsB,KAAKwiC,uBAAyB9jC,EAAK8jC,uBACxC9jC,EAAKsB,KAAKyiC,eAAiB/jC,EAAK+jC,eAChC/jC,EAAKsB,KAAK61B,KAAOn3B,EAAKm3B,KACtBn3B,EAAKsB,KAAK41B,IAAMl3B,EAAKk3B,IACrBl3B,EAAKsB,KAAK80B,MAAQp2B,EAAKo2B,MACvBp2B,EAAKsB,KAAKY,iBAAmBlC,EAAKkC,iBAClCwG,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,iBACI,CACL3kB,OAAQH,EAAKC,SAASE,OAAOoX,QAAO,SAAUC,EAAG9T,UAC/C8T,EAAE9T,EAAE,IAAMA,EAAE,GACL8T,IACN,IACHtX,WAAYF,EAAKC,SAASC,WAAWqX,QAAO,SAAUC,EAAG9T,UACvD8T,EAAE9T,EAAE,IAAMA,EAAE,GACL8T,IACN,QAITxX,EAAK+gC,UAAYr4B,OAAOC,KAAK3I,EAAKsB,KAAKrB,SAASE,QAChDH,EAAK+gC,UACFxe,KAAI,SAAU7e,UACN1D,EAAKiB,kBAAkByC,GAAG,MAElC7C,QAAQmjC,GACXhkC,EAAK+gC,UACFxe,KAAI,SAAU7e,UACN1D,EAAKiB,kBAAkByC,GAAG,MAElC7C,QAAQmjC,GACXhkC,EAAKikC,UAAYxiC,OAAOC,iBAAiByE,SAAS8pB,KAAM,MACxDjwB,EAAK+gC,UAAUzb,OAAO5c,OAAOC,KAAK3I,EAAKikC,YAAYpjC,SAAQ,SAAUiZ,GAEnEwnB,EAAmBxnB,QAAO5S,EAC1BwB,OAAOkc,eAAe0c,EAAoBxnB,EAAK,CAC7CgL,IAAK,kBACI9kB,EAAK8gC,iBAAiBhnB,IAE/BoqB,IAAK,SAAUlnB,GACThd,EAAKqhC,cACPrhC,EAAKwrB,oBAAoB1R,GAAOkD,GAElChd,EAAKkC,iBAAiB4X,EAAKkD,SAIjCtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACI9kB,EAAKqgC,cAGhB33B,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACI9kB,EAAKiQ,cAGhBvH,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,kBACI9kB,EAAK0Z,YAGhBhR,OAAOkc,eAAe5kB,EAAKsB,KAAM,mBAAoB,CACnDwjB,IAAK,kBACI9kB,EAAK4R,sBAGhBlJ,OAAOkc,eAAe5kB,EAAKsB,KAAM,QAAS,CACxCwjB,IAAK,kBACIwc,GAET4C,IAAK,SAAUC,GACbz7B,OAAOC,KAAKw7B,GAAatjC,SAAQ,SAAUiZ,GACzC9Z,EAAKkC,iBAAiB4X,EAAKqqB,EAAYrqB,IAAM,MAE/C9Z,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,eAAgB,CACjC+C,KAAM,QACN8X,MAAOmnB,OAIbz7B,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAAE0b,MAAO,KACxDtU,OAAOC,KAAK3I,EAAKE,YAAYW,SAAQ,SAAUiZ,GAC7CpR,OAAOkc,eAAe5kB,EAAKsB,KAAKpB,WAAY4Z,EAAK,CAC/CgL,IAAK,kBACI9kB,EAAKE,WAAW4Z,IAEzBoqB,IAAK,SAAUlnB,GACbhd,EAAKE,WAAW4Z,GAAOkD,EACX,SAARlD,GACF9Z,EAAKggC,wBAEPhgC,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,mBAAoB,CACrC+C,KAAM4U,EACNkD,MAAOA,EAAMlD,WAKrB9Z,EAAK88B,QAAQv5B,OAAS,SAAUyZ,EAAOonB,MACjCA,IAAcpkC,EAAKE,WAAWmkC,kBACzBrkC,EAAK+hC,YAAYja,SACb,MAAT9K,EAAgBA,EAAQoK,OAAOpK,GAAOqK,QAI1CrK,EAAQoK,OAAOpK,OACXsnB,EAEFC,EADS,cACQC,KAAKJ,GACtBK,EAAQF,EAAUA,EAAQ,GAAGG,UAAU,GAAK,GAC5CC,EAAaF,EAAM3+B,UACrB9F,EAAK4kC,wBAAqB19B,EACQ,MAA9Bk9B,EAAUM,UAAU,EAAG,IAAcH,EAAS,KAE9CD,EAAe,IAAIO,OACjBT,EAAUM,UAAU,EAAGN,EAAUt+B,QAAU6+B,EAAa,IACxDF,GAEF,MAAO9hC,eACP3C,EAAK4kC,mBAAqBjiC,UAGrB2hC,EAAahhC,KAAK0Z,WAEpBA,EAAMvV,WAIsC,IAH/CuV,EACGvV,WACAq9B,oBACAnpB,QAAQyoB,EAAUU,sBAG3B9kC,EAAK88B,QAAQ/5B,OAAS,SAAUia,EAAOonB,UACjCA,IAAcpkC,EAAKE,WAAWmkC,WACzBrkC,EAAK+hC,YAAYja,SACb,MAAT9K,EAAgBA,EAAQoK,OAAOpK,GAAOqK,SAIrC+c,GAGEpnB,IAAUonB,IAElB,aAAc,UAAW,WAAWvjC,QAAQb,EAAK4gC,UAClD5gC,EAAKoB,qBAAoB,EAAOpB,EAAKsB,MACrCtB,EAAKigC,qBACDjgC,EAAKsqB,KAAK/nB,OACZvC,EAAKsB,KAAKiB,KAAOvC,EAAKsqB,KAAK/nB,OAEzBvC,EAAKsB,KAAK6lB,WAAannB,EAAKsB,KAAKyjC,eACR,kCAAvB/kC,EAAKsB,KAAKsD,WACZ5E,EAAKsB,KAAKsD,SAAW,sCAEvB5E,EAAKsB,KAAKiB,KAAOvC,EAAKsB,KAAK6lB,WAAannB,EAAKsB,KAAKyjC,aAEhD/kC,EAAKsqB,KAAKznB,SACZ7C,EAAKsB,KAAKuB,OAAS7C,EAAKsqB,KAAKznB,QAE3B7C,EAAKkL,cAAgBlL,EAAKuB,YAC5Ba,uBAAsB,WACpBpC,EAAKqC,QAAO,MAGdrC,EAAKqC,QAAO,GAEdrC,EAAKqhC,aAAc,EACZrhC,WA3QEgkC,EAAwBlqB,IACM,IAAjC9Z,EAAK+gC,UAAUplB,QAAQ7B,IACzB9Z,EAAK+gC,UAAUl9B,KAAKiW,KAiR1B9Z,EAAKsB,KAAK0jC,KAAO,SAAUriC,GACzB3C,EAAK0Z,UAAW,GAQlB1Z,EAAKsB,KAAKqxB,MAAQ,WAChB3yB,EAAK0Z,UAAW,EAChB1Z,EAAK0yB,aAAaC,UAEhB3yB,EAAKqgC,YAAcrgC,EAAKkL,eAC1BxC,OAAOkc,eAAe5kB,EAAKsB,KAAM,SAAU,CACzCwjB,IAAK,kBACC9kB,EAAKqgC,WACArgC,EAAKqgC,WAAWn4B,OAElBlI,EAAK4F,WAAWsC,QAEzBg8B,IAAK,SAAUlnB,GACThd,EAAKqgC,WACPrgC,EAAKqgC,WAAWn4B,OAAS8U,EAEzBhd,EAAK4F,WAAWsC,OAAS8U,EAE3Bhd,EAAKqC,QAAO,MAGhBqG,OAAOkc,eAAe5kB,EAAKsB,KAAM,QAAS,CACxCwjB,IAAK,kBACC9kB,EAAKqgC,WACArgC,EAAKqgC,WAAWl4B,MAElBnI,EAAK4F,WAAWuC,OAEzB+7B,IAAK,SAAUlnB,GACThd,EAAKqgC,WACPrgC,EAAKqgC,WAAWl4B,MAAQ6U,EAExBhd,EAAK4F,WAAWuC,MAAQ6U,EAE1Bhd,EAAKqC,QAAO,MAGhBqG,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACI9kB,EAAK4F,YAEds+B,IAAK,SAAUlnB,OACRhd,EAAKkL,kBACF,IAAI+5B,UACR,0DAGJjlC,EAAK4F,WAAaoX,MAIxBtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,oBAAqB,CACpDwjB,IAAK,kBACI9kB,EAAKsN,qBAGhB5E,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAKgS,gBAGhBtJ,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACIpc,OAAOC,KAAK3I,EAAK+f,YAAYwC,KAAI,SAAU/D,UACzCxe,EAAK+f,WAAWvB,SAI7B9V,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAKkL,eAGhBxC,OAAOkc,eAAe5kB,EAAM,SAAU,CACpC8kB,IAAK,kBACI9kB,EAAKyrB,gBAAgB6B,QAE9B4W,IAAK,SAAUlnB,GACC,SAAVA,IACFA,EAAQ,WAENhd,EAAKklC,gBAAkBloB,IACzBhd,EAAKyrB,gBAAgB6B,OAAStQ,EAC9Bhd,EAAKklC,cAAgBloB,MAI3BtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,iBAAkB,CACjDwjB,IAAK,kBACI9kB,EAAK4gB,gBAEdsjB,IAAK,SAAUlnB,GACC,SAAVA,IACFA,EAAQ,OAEVhd,EAAK4gB,eAAiB5D,EACtBhd,EAAKqR,MAAMrR,EAAKogB,QAASpgB,EAAK4gB,mBAGlClY,OAAOkc,eAAe5kB,EAAKsB,KAAM,UAAW,CAC1CwjB,IAAK,kBACI9kB,EAAKogB,SAEd8jB,IAAK,SAAUlnB,WAIJ9V,IAFPlH,EAAK4N,YAAYu3B,MAAK,SAAUpd,UACvBA,EAAI7iB,OAAS8X,WAGhB,IAAIpa,MAAM,uCAElB5C,EAAKogB,QAAUpD,EACfhd,EAAKqR,MAAMrR,EAAKogB,QAASpgB,EAAK4gB,mBAG9B5gB,EAAKuB,cACPmH,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAK4B,OAAOoc,gBAGvBtV,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAK4B,OAAOmc,gBAIzBrV,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAKqO,UAAU+H,gBAG1B1N,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAKqO,UAAU2H,eAG1BtN,OAAOkc,eAAe5kB,EAAKsB,KAAM,YAAa,CAC5CwjB,IAAK,kBACI9kB,EAAKqO,UAAUc,WAExB+0B,IAAK,SAAUlnB,GACbhd,EAAKqO,UAAUc,UAAY6N,KAG/BtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACI9kB,EAAKqO,UAAUC,YAExB41B,IAAK,SAAUlnB,GACbhd,EAAKqO,UAAUC,WAAa0O,KAGhCtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,QAAS,CACxCwjB,IAAK,kBACI9kB,EAAK+R,SAGhBrJ,OAAOkc,eAAe5kB,EAAKsB,KAAM,gBAAiB,CAChDwjB,IAAK,kBACI9kB,EAAKkE,iBAGhBwE,OAAOkc,eAAe5kB,EAAKsB,KAAM,QAAS,CACxCwjB,IAAK,kBACI9kB,EAAKgsB,SAGhBtjB,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAK0yB,gBAGhBhqB,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAK8M,eAGhBpE,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAK6N,gBAGhBnF,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAK2N,eAGhBjF,OAAOkc,eAAe5kB,EAAKsB,KAAM,aAAc,CAC7CwjB,IAAK,kBACI9kB,EAAK0b,cAGhBhT,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,kBACI9kB,EAAKkT,YAGhBxK,OAAOkc,eAAe5kB,EAAKsB,KAAM,UAAW,CAC1CwjB,IAAK,kBACI9kB,EAAKk9B,WAGhBl9B,EAAKsB,KAAKsb,WAAa5c,EAAK4c,WAC5BlU,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,kBACI9kB,EAAK4E,UAEds/B,IAAK,SAAUlnB,OACRhd,EAAKg9B,QAAQhgB,SACV,IAAIpa,MAAM,2BAA6Boa,GAE/Chd,EAAK4E,SAAWoY,KAGpBhd,EAAKo9B,WAAWv8B,SAAQ,SAAUukC,GAChC18B,OAAOkc,eAAe5kB,EAAKsB,KAAM,KAAO8jC,EAAW,CACjDtgB,IAAK,kBACI9kB,EAAKm9B,kBAAkBiI,IAEhClB,IAAK,SAAUlnB,GACbhd,EAAKsoB,OAAO8c,GAAa,GACzBplC,EAAKm9B,kBAAkBiI,GAAapoB,EAC/BA,GAGLhd,EAAKgF,iBAAiBogC,EAAWpoB,SAIvCtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,YAAa,CAC5CwjB,IAAK,kBACI9kB,EAAKoO,WAEd81B,IAAK,SAAUliC,MACTmB,MAAMnB,SACF,IAAIijC,UAAU,mDAElBjlC,EAAK2N,YAAY7H,OAAS9D,QACtB,IAAIqjC,WACR,8DAGJrlC,EAAKoO,UAAYpM,KAGrB0G,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAKkQ,cAEdg0B,IAAK,SAAUliC,MACTmB,MAAMnB,SACF,IAAIijC,UAAU,mDAElBjlC,EAAKk2B,mBAAmBpwB,OAAS9D,QAC7B,IAAIqjC,WACR,iEAGJrlC,EAAKkQ,aAAelO,KAGxB0G,OAAOkc,eAAe5kB,EAAKsB,KAAM,kBAAmB,CAClDwjB,IAAK,iBACI,CACLyF,IAAKvqB,EAAKqP,eACVue,MAAO5tB,EAAKwkB,iBACZmJ,OAAQ3tB,EAAKsP,kBACbkb,KAAMxqB,EAAK0P,oBAIjBhH,OAAOkc,eAAe5kB,EAAKsB,KAAM,kBAAmB,CAClDwjB,IAAK,iBACI,CACLyF,IAAKvqB,EAAKoP,eACVwe,MAAO5tB,EAAKykB,iBACZkJ,OAAQ3tB,EAAKuP,kBACbib,KAAMxqB,EAAKuO,oBAIjB7F,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,kBACI9kB,EAAKuN,OAAOC,MAErB02B,IAAK,SAAUliC,OACRrB,MAAM2kC,QAAQtjC,SACX,IAAIijC,UAAU,+BAEjBjlC,EAAK0R,cAAgB1P,EAAI8D,OAAS9F,EAAK0R,aAAa5L,aACjD,IAAIu/B,WACR,iEAGJrlC,EAAKuN,OAAOC,KAAOxL,KAGvB0G,OAAOkc,eAAe5kB,EAAKsB,KAAM,cAAe,CAC9CwjB,IAAK,kBACI9kB,EAAKuN,OAAOoC,SAErBu0B,IAAK,SAAUliC,OACRrB,MAAM2kC,QAAQtjC,SACX,IAAIijC,UAAU,8BAElBjjC,EAAI8D,OAAS9F,EAAK4N,YAAY9H,aAC1B,IAAIu/B,WACR,oEAGJrlC,EAAKuN,OAAOoC,QAAU3N,KAG1B0G,OAAOkc,eAAe5kB,EAAKsB,KAAM,kBAAmB,CAClDwjB,IAAK,kBACI9kB,EAAK6tB,wBAGhBnlB,OAAOkc,eAAe5kB,EAAKsB,KAAM,eAAgB,CAC/CwjB,IAAK,kBACI9kB,EAAKkuB,iBAAgB,MAGhCxlB,OAAOkc,eAAe5kB,EAAKsB,KAAM,gBAAiB,CAChDwjB,IAAK,kBACI9kB,EAAKkuB,qBAGhBxlB,OAAOkc,eAAe5kB,EAAKsB,KAAM,gBAAiB,CAChDwjB,IAAK,kBACI9kB,EAAKk2B,mBAAmB3T,KAAI,SAAqBwF,UAC/CA,QAIbrf,OAAOkc,eAAe5kB,EAAKsB,KAAM,qBAAsB,CACrDwjB,IAAK,kBACI9kB,EAAKu8B,oBAEd2H,IAAK,SAA+BlnB,GAClChd,EAAKu8B,mBAAqBvf,KAG9BtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,qBAAsB,CACrDwjB,IAAK,kBACI9kB,EAAK6b,oBAEdqoB,IAAK,SAA+BlnB,GAClChd,EAAK6b,mBAAqBmB,KAG9BtU,OAAOkc,eAAe5kB,EAAKsB,KAAM,MAAO,CACtCwjB,IAAK,kBACI9kB,EAAKqI,OAGhBK,OAAOkc,eAAe5kB,EAAKsB,KAAM,SAAU,CACzCwjB,IAAK,kBACI9kB,EAAK4N,aAEds2B,IAAK,SAAsBlnB,WACX9V,IAAV8V,SAEFhd,EAAK6C,YAASqE,EACdlH,EAAK49B,gBAAa12B,OAClBlH,EAAKmC,cAAc,gBAAiB,CAAEU,YAAQqE,QAG3CvG,MAAM2kC,QAAQtoB,IAA8B,WAApBmjB,QAAOnjB,EAAM,UAClC,IAAIpa,MAAM,+CAEIsE,IAAlB8V,EAAM,GAAG9X,WACL,IAAItC,MACR,uEAGJ5C,EAAK6C,OAASma,EAAMuF,KAAI,SAA0B4H,EAAQ/Y,UACxD+Y,EAAOhiB,MAAQgiB,EAAOhiB,OAASnI,EAAKsC,MAAM6O,UAC1CgZ,EAAOplB,OAASolB,EAAOplB,QAAU/E,EAAK+E,OAAOolB,EAAOpkB,MACpDokB,EAAOpkB,KAAOokB,EAAOpkB,MAAQ,SAC7BokB,EAAO/Y,MAAQA,EACf+Y,EAAOxiB,YAAcyJ,EACrB+Y,EAAOziB,UAAY,EACZyiB,KAETnqB,EAAK49B,gBAAa12B,EAClBlH,EAAKg+B,mBACLh+B,EAAK69B,qBACL79B,EAAKggC,wBAEHhgC,EAAKkgC,gBACqC,WAA1CC,QAAOngC,EAAKkgC,eAAezC,aAE3Bz9B,EAAK6C,OAAOhC,SAAQ,SAA8BspB,EAAQ/Y,GAEtDpR,EAAKkgC,qBAC2Ch5B,IAAhDlH,EAAKkgC,eAAezC,WAAWtT,EAAOjlB,QAEtCilB,EAAOlZ,QAAUjR,EAAKkgC,eAAezC,WAAWtT,EAAOjlB,UAI7DlF,EAAKqC,QAAO,GACZrC,EAAKmC,cAAc,gBAAiB,CAAEU,OAAQ7C,EAAK6C,YASvD7C,EAAKsB,KAAKikC,SAAW,kBACZ78B,OAAOC,KAAK3I,EAAKg9B,UAE1Bh9B,EAAKwlC,eAAiB,SAAUjjC,OACzBA,GAAQ,OAAOe,KAAKf,SAChB,OAGPA,EAAOE,KAAKC,MAAMH,GAClB,MAAOI,GACPoe,QAAQC,KACNpe,MACE,kEACED,EAAEw+B,QADJ,mIAOC5+B,GAETvC,EAAKg9B,QAAQ,sCAAwC,SACnDz6B,EACAkjC,GAEAzlC,EAAKg9B,QAAQ,iCACXh9B,EAAKwlC,eAAejjC,IACpB,SAAUA,EAAMM,UACP4iC,EAASljC,EAAMM,OAI5B7C,EAAKg9B,QAAQ,iCAAmC,SAAUz6B,EAAMkjC,UACvDA,EAASljC,IAElBvC,EAAKsB,KAAK07B,QAAUh9B,EAAKg9B,QAGzBh9B,EAAK0lC,IAAM,SAAUnjC,EAAMkjC,OACpBzlC,EAAKsB,KAAK07B,QAAQh9B,EAAK4E,gBACpB,IAAIhC,MAAM,0BAElB5C,EAAKsB,KAAK07B,QAAQh9B,EAAK4E,UAAUrC,GAAM,SAAUA,EAAMM,GAErD7C,EAAK0R,aAAenP,EACpBvC,EAAKsM,SAAW3L,MAAM61B,KAAKx2B,EAAK0R,cAE5B/Q,MAAM2kC,QAAQziC,KAChB7C,EAAK6C,OAASA,GAGZ7C,EAAKE,WAAWylC,qBAClB3lC,EAAK6C,OAAS7C,EAAK8iC,kBAAkBvgC,IAElCvC,EAAK6C,SACR7C,EAAK49B,WAAa59B,EAAK8iC,kBAAkBvgC,IAEvCvC,EAAK4N,aACP5N,EAAK69B,qBAGP79B,EAAK++B,UAEA/+B,EAAK6C,QAA+C,KAApC7C,EAAK0R,cAAgB,IAAI5L,SAC5C9F,EAAK49B,WAAa,CAAC,CAAE14B,KAAM,MAE7BlF,EAAKw0B,kBAAkB,cAAc,IAElCx0B,EAAK49B,aAAe59B,EAAK6C,QAC1B7C,EAAKE,WAAWylC,sBAEhB3lC,EAAK69B,qBACL79B,EAAKmC,cAAc,gBAAiB,CAAEU,OAAQ7C,EAAK49B,cAErD6H,QAGJ/8B,OAAOkc,eAAe5kB,EAAKsB,KAAM,WAAY,CAC3CwjB,IAAK,kBACI9kB,EAAKsM,YAGhB5D,OAAOkc,eAAe5kB,EAAKsB,KAAM,YAAa,CAC5CwjB,IAAK,kBACI9kB,EAAK0R,gBAGhBhJ,OAAOkc,eAAe5kB,EAAKsB,KAAM,OAAQ,CACvCwjB,IAAK,kBACI9kB,EAAK0R,cAEdwyB,IAAK,SAAoBlnB,GACvBhd,EAAK0lC,IAAI1oB,GAAO,WACdhd,EAAKk9B,QAAU,GACfl9B,EAAKg+B,mBAEHh+B,EAAKE,WAAW0lC,mBAChB5lC,EAAK0R,aAAa5L,OAAS,QACHoB,IAAxBlH,EAAKkgC,gBAELlgC,EAAKy0B,WAGPz0B,EAAKw0B,kBAAkB,cAAc,GACrCx0B,EAAKyN,kBACLzN,EAAKggC,wBACLhgC,EAAKmC,cAAc,cAAe,CAAEI,KAAMvC,EAAK0R,eAC/C1R,EAAKqC,QAAO,SAIlBrC,EAAKuhC,cAAgB,eACfsE,EAAU,EACZC,EAAS,EACT32B,EAAY,EACZb,EAAa,EACb8H,EAAe,EACfJ,EAAc,EACdG,EAAkB,GAClBJ,EAAiB,YACVgwB,EAAa/oB,EAAOgpB,MACvB7iC,MAAM6Z,SACF,IAAIpa,MAAM,oCAEdoa,EAAQ,IACVA,EAAQ,GAENA,EAAQ5G,IACV4G,EAAQ5G,GAENA,EAAe,IACjB4G,EAAQ,GAEV7N,EAAY6N,EACPgpB,GACHhmC,EAAKorB,kBAGA6a,EAAcjpB,EAAOgpB,MACxB7iC,MAAM6Z,SACF,IAAIpa,MAAM,qCAEdoa,EAAQ,IACVA,EAAQ,GAENA,EAAQhH,IACVgH,EAAQhH,GAENA,EAAc,IAChBgH,EAAQ,GAEV1O,EAAa0O,EACRgpB,GACHhmC,EAAKorB,SAGTprB,EAAKqO,UAAU5G,SAAW,iBAEtB,aACAuO,EAAYyB,QAAQ,GACpB,eACArB,EAAaqB,QAAQ,GACrB,aACAnJ,EAAWmJ,QAAQ,GACnB,YACAtI,EAAUsI,QAAQ,GAClB,mBACAzX,EAAKqO,UAAUsc,cAAclT,QAAQ,GACrC,oBACAzX,EAAKqO,UAAUuc,eAAenT,QAAQ,GACtC,KAGJzX,EAAKqO,UAAU0mB,SAAW,SAAU9tB,EAAGc,EAAGm+B,GACxCD,EAAch/B,GAAG,GACjB8+B,EAAah+B,EAAGm+B,IAElBx9B,OAAOkc,eAAe5kB,EAAKqO,UAAW,kBAAmB,CACvDyW,IAAK,kBACI3O,GAET+tB,IAAK,SAAUlnB,GACb7G,EAAkB6G,KAGtBtU,OAAOkc,eAAe5kB,EAAKqO,UAAW,iBAAkB,CACtDyW,IAAK,kBACI/O,GAETmuB,IAAK,SAAUlnB,GACbjH,EAAiBiH,KAGrBtU,OAAOkc,eAAe5kB,EAAKqO,UAAW,SAAU,CAC9CyW,IAAK,kBACI+gB,GAET3B,IAAK,SAAUlnB,GACb6oB,EAAU7oB,KAGdtU,OAAOkc,eAAe5kB,EAAKqO,UAAW,QAAS,CAC7CyW,IAAK,kBACIghB,GAET5B,IAAK,SAAUlnB,GACb8oB,EAAS9oB,KAGbtU,OAAOkc,eAAe5kB,EAAKqO,UAAW,YAAa,CACjDyW,IAAK,kBACI3V,GAET+0B,IAAK6B,IAEPr9B,OAAOkc,eAAe5kB,EAAKqO,UAAW,aAAc,CAClDyW,IAAK,kBACIxW,GAET41B,IAAK+B,IAEPv9B,OAAOkc,eAAe5kB,EAAKqO,UAAW,eAAgB,CACpDyW,IAAK,kBACI1O,GAET8tB,IAAK,SAAUlnB,GACT7N,EAAY6N,IACd7N,EAAYvH,KAAKiT,IAAImC,EAAO,IAE9B5G,EAAe4G,KAGnBtU,OAAOkc,eAAe5kB,EAAKqO,UAAW,cAAe,CACnDyW,IAAK,kBACI9O,GAETkuB,IAAK,SAAUlnB,GACT1O,EAAa0O,IACf1O,EAAa1G,KAAKiT,IAAImC,EAAO,IAE/BhH,EAAcgH,MCnmDP,qBAAUhd,OACnBmmC,EAAWC,EAAoBC,WAC1BC,EAAsBC,GAC7BvmC,EAAKwmC,kBACHD,EACA,qCAAuCvmC,EAAKmT,OAAS,UAAY,KAEnEozB,EAAqBvhC,iBAAiB,aAAa,WACjDhF,EAAKwmC,kBACHD,EACA,8CAGJA,EAAqBvhC,iBAAiB,YAAY,WAChDhF,EAAKwmC,kBACHD,EACA,iDAIGE,EAAkB1pB,EAAIjS,EAAK4rB,EAAOgQ,OAOvCxO,EAuKIyO,EACF/uB,EA9KAgvB,EAAYzgC,SAAS0gC,cAAc,OACrCC,EAAU3gC,SAAS0gC,cAAc,OACjCE,EAAY5gC,SAAS0gC,cAAc,OACnCG,EAAW,GACXC,GAAiB,EACjB3lC,EAAO,OAEJX,MAAM2kC,QAAQ5O,SACX,IAAI9zB,MAAM,gDAwHTskC,IACHN,EAAUz3B,UAAY,EACxBnP,EAAKkE,cAAcE,YAAY0iC,GACtBA,EAAQlhC,YACjBkhC,EAAQlhC,WAAWg6B,YAAYkH,GAG/BF,EAAUz3B,WACRy3B,EAAUxwB,aAAewwB,EAAU5oB,cACrC+oB,EAAUnhC,WAEVmhC,EAAUnhC,WAAWg6B,YAAYmH,GAEjCH,EAAUxwB,aAAewwB,EAAU5oB,aAAe,KAEhD4oB,EAAUz3B,WACVy3B,EAAUxwB,aAAewwB,EAAU5oB,eAGrChe,EAAKkE,cAAcE,YAAY2iC,YAG1BI,EAAiBphC,UACjB,SAASgF,QACVyM,EAAIxX,EAAKE,WAAWknC,yBACX,OAATrhC,GAAyC,IAAxB6gC,EAAUz3B,WAGlB,SAATpJ,GAAmB6gC,EAAUz3B,YAAcy3B,EAAUxwB,eAGzDwwB,EAAUz3B,WAAsB,OAATpJ,GAAiByR,EAAIA,EAC5C4uB,EAAqBzV,WACnB5lB,EACA/K,EAAKE,WAAWmnC,yBAChBthC,cAIGuhC,EAAevhC,UACf,WACL8mB,aAAauZ,WAoGjB9kC,EAAK6J,WAAanL,EAAKsB,KACvBA,EAAKolC,kBAAoBA,EACzBplC,EAAKslC,UAAYA,EAlGXD,EAAM,GACR/uB,EAAI5X,EAAKunC,aAAavnC,EAAK4B,aACXsF,IAAdi/B,IACFA,EAAYnmC,EAAKsC,MAAMklC,mBArKzB9Q,EAAM71B,SAAQ,SAAUiE,OAEpB2iC,EADElB,EAAuBpgC,SAAS0gC,cAAc,gBAEzCa,EAAmB/kC,GAExBA,EAAEglC,gBAAkBf,GACpB9hC,EAAKinB,YAAY6a,YAAcjkC,EAAEglC,eACjCF,IAAmB9kC,EAAEglC,eACrBpB,IAAyB5jC,EAAEglC,eAC3B7iC,EAAKinB,YAAY6a,UAAUgB,SAASjlC,EAAEglC,iBAIxC7iC,EAAKinB,YAAY4T,UACjBqH,EAASxkB,OAAOwkB,EAASrrB,QAAQ7W,EAAKinB,aAAc,GACpDjnB,EAAKinB,iBAAc7kB,EACnBq/B,EAAqBhe,oBACnB,WACAmf,GAEFd,EAAUre,oBAAoB,WAAYmf,GAC1CnB,EAAqBsB,aAAa,cAAe,KACjDtB,EAAqBsB,aAAa,UAAW,eAEtCC,EAAmBpR,MAGyB,MAAjD6P,EAAqBwB,aAAa,YACmB,MAArDxB,EAAqBwB,aAAa,oBAIhCC,EAAOzB,EAAqBpO,wBAChC6P,EAAO,CACLxd,KACEwd,EAAKxd,KACLxqB,EAAKsC,MAAM2lC,2BACXrB,EAAU7oB,YACZwM,IAAKyd,EAAKzd,IAAMvqB,EAAKsC,MAAM4lC,0BAC3Bva,OAAQqa,EAAKra,OACbC,MAAOoa,EAAKpa,OAEd9oB,EAAKinB,YAAc0a,EAAkB1pB,EAAIirB,EAAMtR,EAAOp1B,GACtDilC,EAAqBsB,aAAa,cAAe,KACjDtB,EAAqBvhC,iBAAiB,WAAY0iC,GAClDd,EAAU5hC,iBAAiB,WAAY0iC,GACvCV,EAASnjC,KAAKiB,EAAKinB,uBAEZoc,QACHzkC,EACqD,MAArD6iC,EAAqBwB,aAAa,iBAGtCxB,EAAqBsB,aAAa,UAAW,KACnB,mBAAf/iC,EAAK4xB,MAWhBoR,EAAmBhjC,EAAK4xB,YALZxvB,KALVxD,EAAIoB,EAAK4xB,MAAMhc,MAAMpZ,EAAM,CACzB,SAAUo1B,GACRoR,EAAmBpR,QAGA/1B,MAAM2kC,QAAQ5hC,IACnCokC,EAAmBpkC,cAMRoB,aACNsjC,EAAWC,MACF,OAAZA,QAGmB,mBAAZA,EACFD,EAAWC,EAAQtrB,SAEL,WAAnBojB,QAAOkI,IAIX/B,EAAsBC,GACtBA,EAAqBpiC,UAAYkkC,GAJ/B9B,EAAqBniC,YAAYikC,IAOrCD,CAAWtjC,EAAKoM,OAChBpM,EAAKyhC,qBAAuBA,GAEzBzhC,EAAK4xB,OAAS5xB,EAAK4xB,MAAM5wB,OAAS,GACb,mBAAfhB,EAAK4xB,SAEZ+Q,EAAiBthC,SAAS0gC,cAAc,OACxC7mC,EAAKwmC,kBACHiB,EACA,uCAEFA,EAAetjC,UAAYnE,EAAKsC,MAAMgmC,0BACtC/B,EAAqBniC,YAAYqjC,GACjClB,EAAqBvhC,iBACnB,YACAmjC,GAEF5B,EAAqBvhC,iBAAiB,YAAY,WAChDuhC,EAAqBsB,aAAa,UAAW,SAG7C/iC,EAAK+pB,OACP0X,EAAqBvhC,iBAAiB,SAAS,SAAU+X,GACvDjY,EAAK+pB,MAAMnU,MAAM1a,EAAM,CAAC+c,OAI9BwrB,CAAQzjC,GACR8hC,EAAUxiC,YAAYmiC,MAyDxBvmC,EAAKwmC,kBACHI,EACA,gCAAkC5mC,EAAKmT,OAAS,UAAY,KAE9DwzB,EAAI1/B,EAAI6D,EAAI0f,KAAO5S,EAAE4S,KACrBmc,EAAI5+B,EAAI+C,EAAIyf,IAAM3S,EAAE2S,IACpBoc,EAAIz+B,OAAS,EACbi+B,GAAa,EACbS,EAAUtkC,MAAMkmC,SAAW,WAC3B1B,EAAQxkC,MAAMwY,MAAQ9a,EAAKsC,MAAMmmC,sBACjC1B,EAAUzkC,MAAMwY,MAAQ9a,EAAKsC,MAAMmmC,uBAClC3B,EAASC,GAAWlmC,SAAQ,SAAUwF,GACrCA,EAAG/D,MAAMsX,UAAY,SACrBvT,EAAG/D,MAAMkmC,SAAW,WACpBniC,EAAG/D,MAAMomC,OAASvC,EAAY,KAEhCS,EAAUtkC,MAAMomC,OAASvC,EACrBO,GAAqBA,EAAkBiC,gBACzC/B,EAAUtkC,MAAMsmC,UACdnnC,OAAOonC,YACPlC,EAAI5+B,EACJ/H,EAAKsC,MAAMwmC,yBACX,KACFlC,EAAUtkC,MAAMymC,SAAWj+B,EAAI3C,MAAQ,KACvCw+B,EAAI5+B,GAAK+C,EAAI5C,QAEXlI,EAAKmT,SACPyzB,EAAUtkC,MAAM6F,MAAQ2C,EAAI3C,MAAQ,MAEtCy+B,EAAUtkC,MAAMkoB,KAAOmc,EAAI1/B,EAAI,KAC/B2/B,EAAUtkC,MAAMioB,IAAMoc,EAAI5+B,EAAI,KAC9B6+B,EAAU5hC,iBAAiB,SAAUkiC,GACrCN,EAAU5hC,iBAAiB,SAAS,SAAUrC,GACxC3C,EAAK0Z,WACPktB,EAAUz3B,WAAaxM,EAAEiyB,OACzBgS,EAAUt4B,YAAc3L,EAAEgyB,QAE5BuS,OAEFJ,EAAQ3iC,UAAYnE,EAAKsC,MAAM0mC,uBAC/BjC,EAAU5iC,UAAYnE,EAAKsC,MAAM2mC,yBACjCrC,EAAUxiC,YAAY0iC,GACtB3gC,SAAS8pB,KAAK7rB,YAAY2iC,GAC1B5gC,SAAS8pB,KAAK7rB,YAAYwiC,IAC1B1O,EAAO0O,EAAUzO,yBAERxK,OAASlsB,OAAOonC,cACjBnC,GAAqBA,EAAkBiC,gBAC3ChC,EAAI5+B,GACFmwB,EAAKvK,OACL3tB,EAAKsC,MAAM4mC,wBACXznC,OAAOonC,aAEPlC,EAAI5+B,EAAI,IACV4+B,EAAI5+B,EAAI/H,EAAKsC,MAAM4mC,yBAGnBtC,EAAU5oB,aACVvc,OAAOonC,YAAc7oC,EAAKsC,MAAM4mC,0BAEhCtC,EAAUtkC,MAAM4F,OACdzG,OAAOonC,YAAmD,EAArC7oC,EAAKsC,MAAM4mC,wBAA8B,OAGhEhR,EAAKtK,MAAQnsB,OAAO0nC,aACtBxC,EAAI1/B,GACFixB,EAAKtK,MAAQnsB,OAAO0nC,WAAanpC,EAAKsC,MAAM4mC,yBAE5CvC,EAAI1/B,EAAI,IACV0/B,EAAI1/B,EAAIjH,EAAKsC,MAAM4mC,yBAEjBvC,EAAI5+B,EAAI,IACV4+B,EAAI5+B,EAAI/H,EAAKsC,MAAM4mC,yBAErBtC,EAAUtkC,MAAMkoB,KAAOmc,EAAI1/B,EAAI,KAC/B2/B,EAAUtkC,MAAMioB,IAAMoc,EAAI5+B,EAAI,KAC9BmwB,EAAO0O,EAAUzO,wBACjB2O,EAAQxkC,MAAMioB,IAAM2N,EAAK3N,IAAM,KAC/Bwc,EAAUzkC,MAAMioB,IACd2N,EAAK3N,IAAM2N,EAAKhwB,OAAS6+B,EAAU/oB,aAAe,KACpD8oB,EAAQxkC,MAAMkoB,KAAO0N,EAAK1N,KAAO,KACjCuc,EAAUzkC,MAAMkoB,KAAO0N,EAAK1N,KAAO,KACnCuc,EAAUzkC,MAAM6F,MAAQy+B,EAAU7oB,YAAc,KAChD+oB,EAAQxkC,MAAM6F,MAAQy+B,EAAU7oB,YAAc,KAC9CgpB,EAAU/hC,iBAAiB,YAAamiC,EAAiB,SACzDJ,EAAU/hC,iBAAiB,WAAYsiC,KACvCR,EAAQ9hC,iBAAiB,YAAamiC,EAAiB,OACvDL,EAAQ9hC,iBAAiB,WAAYsiC,KACrCJ,IAMF5lC,EAAK8nC,oBApJelmB,GAClBwT,EAAMxT,GAAKqjB,qBAAqBpkC,cAAc,IAAIknC,MAAM,WAoJ1D/nC,EAAK42B,KAAOA,EACZ52B,EAAKo1B,MAAQA,EACbp1B,EAAKwlC,QAAUA,EACfxlC,EAAKylC,UAAYA,EACjBzlC,EAAKq+B,QAAU,WACb9S,aAAauZ,GACbY,EAASnmC,SAAQ,SAAUgK,GACzBA,EAAE80B,cAEHoH,EAAWD,EAASF,GAAW/lC,SAAQ,SAAUwF,GAC5CA,EAAGT,YACLS,EAAGT,WAAWg6B,YAAYv5B,OAIhCqC,OAAOkc,eAAetjB,EAAM,gBAAiB,CAC3CwjB,IAAK,kBACImiB,GAET/C,IAAK,SAAUlnB,MACQ,iBAAVA,GAAsB7Z,MAAM6Z,IAAUssB,SAAStsB,UAClD,IAAIpa,MAAM,uDAElBqkC,EAAgBjqB,GACI0Z,EAAM5wB,OAAS,IACjCmhC,EAAgBvQ,EAAM5wB,OAAS,GAE7BmhC,EAAgB,IAClBA,EAAgB,GAElBvQ,EAAM71B,SAAQ,SAAUiE,EAAMsM,MACxBA,IAAU61B,SACLjnC,EAAKwmC,kBACV1hC,EAAKyhC,qBACL,2CAGJvmC,EAAKwmC,kBACH1hC,EAAKyhC,qBACL,2CAKDjlC,WAEAioC,EAA6B5mC,OASlC6mC,EAREC,EAAkBtjC,SAAS0gC,cAAc,OAC3C6C,EAAcvjC,SAAS0gC,cAAc,OACrC8C,EAA2BxjC,SAAS0gC,cAAc,UAClD+C,EAAczjC,SAAS0gC,cAAc,SACrC5jC,EACEN,EAAEyE,MAAQzE,EAAEyE,KAAKwJ,OACbjO,EAAEyE,KAAKwJ,OAAOM,OAASvO,EAAEyE,KAAKwJ,OAAO1L,KACrC,YAEC2kC,IACPD,EAAYtnC,MAAMwnC,WAAa9pC,EAAKsC,MAAMynC,6BAC1CH,EAAYtnC,MAAMwY,MAAQ9a,EAAKsC,MAAM0nC,wBACjChqC,EAAK4kC,qBACPgF,EAAYtnC,MAAMwnC,WAChB9pC,EAAKsC,MAAM2nC,qCACbL,EAAYtnC,MAAMwY,MAAQ9a,EAAKsC,MAAM4nC,0CA+ChCC,EAA0BptB,OAC7BA,IAAM,CAAC,YAAa,UAAW,QAAS,OAAO+K,SAAS/K,EAAGjD,UA5C3DswB,EACA1T,EACA2T,EA8CAC,GAhDAF,EAAQ,EACR1T,EAAQ,GACR2T,EAAa,GAEjBrqC,EAAKsM,SAASzL,SAAQ,SAAUoc,OAC1BstB,EACyB,MAA3BttB,EAAIta,EAAEyE,KAAKwJ,OAAO1L,MACd+X,EAAIta,EAAEyE,KAAKwJ,OAAO1L,MAClBkiB,OAAOnK,EAAIta,EAAEyE,KAAKwJ,OAAO1L,OAAOmiB,OAClCrK,EAAQhd,EAAK+hC,YAAYja,SAASyiB,GAClCvqC,EAAKE,WAAWmkC,WAChBkG,EAEA7T,EAAM1Z,IAAUotB,EAAQpqC,EAAKE,WAAWsqC,uBAG5CJ,GAAS,EACT1T,EAAM1Z,GAAS,CACb9L,MAAOlR,EAAK4c,WAAWja,EAAEyE,KAAKwJ,OAAO7K,MAAQ,UAAU,CACrDqB,KAAM,CAAE4V,MAAOA,KAEjB6R,MAAO,SAAUlsB,GACfinC,EAAY5sB,MAAQA,EACpBra,EAAEylB,kBACFwhB,EAAYznC,cAAc,IAAIknC,MAAM,UACpCrpC,EAAKyqC,6BAMqD,IAA5D/hC,OAAOC,KAAK+tB,GAAO/a,QAAQ3b,EAAKE,WAAWmkC,cAC7CgG,EAAWxmC,KAAK6yB,EAAM12B,EAAKE,WAAWmkC,oBAC/B3N,EAAM12B,EAAKE,WAAWmkC,aAGxBgG,EAAW/kB,OAChB5c,OAAOC,KAAK+tB,GAAOnU,KAAI,SAAUzI,UACxB4c,EAAM5c,QAYjB0vB,EAAQI,EAAYzR,wBAChBkO,IACFA,EAAoB1G,UACpB0G,OAAsBn/B,IAExBm/B,EAAsBI,EACpB9jC,EACA,CACE6nB,KAAMgf,EAAMhf,KACZD,IAAKif,EAAMjf,IACXqD,MAAO4b,EAAM5b,MACbD,OAAQ6b,EAAM7b,OACdzlB,OAAQshC,EAAMthC,OACdC,MAAOqhC,EAAMrhC,OAEfmiC,EACA,CAAE3B,eAAe,KAEC1B,cAAgB,GAEtCjnC,EAAKwmC,kBAAkBkD,EAAa,sCACpC1pC,EAAKwmC,kBACHmD,EACA,8CAEF3pC,EAAKwmC,kBACHoD,EACA,6CAEFC,IACAD,EAAYc,QAAU1qC,EAAKyqC,oBAC3Bb,EAAY5kC,iBAAiB,WAAW,SAAUrC,GAClC,cAAVA,EAAEmX,MACJusB,EAAoBY,eAAiB,GAGzB,YAAVtkC,EAAEmX,MACJusB,EAAoBY,eAAiB,GAGzB,UAAVtkC,EAAEmX,MACJusB,EAAoB+C,WAAW/C,EAAoBY,eACnDjnC,EAAKi6B,sBAGO,QAAVt3B,EAAEmX,MACJusB,EAAoB+C,WAAW/C,EAAoBY,eACnDtkC,EAAE+lB,kBAGU,WAAV/lB,EAAEmX,KACJ9Z,EAAKi6B,wBAGT2P,EAAY5kC,iBAAiB,SAAS,WACpChF,EAAK+iC,UAAUpgC,EAAEyE,KAAKwJ,OAAO1L,KAAM0kC,EAAY5sB,UAEjD4sB,EAAY5kC,iBAAiB,QAASmlC,IACrC,QAAS,OAAQ,UAAW,QAAS,UAAUtpC,SAAQ,SAAUsL,GAChEy9B,EAAY5kC,iBAAiBmH,EAAI09B,MAEnCD,EAAY5sB,MAAQra,EAAEyE,KAAKwJ,QACvB5Q,EAAKihB,cAActe,EAAEyE,KAAKwJ,OAAO1L,OACjC,GACJwkC,EAAYvlC,UAAYnE,EAAKE,WAAWyqC,iBAAiBnqC,QAAQ,MAAOyC,GACxE0mC,EAAyBe,QAAU,cAC7BrE,SACKrmC,EAAKyqC,sBAEdN,KAEFR,EAAyBxlC,UAAYnE,EAAKsC,MAAMsoC,wBAChDnB,EAAgBzkC,iBAAiB,SAAS,SAAUrC,UAC3CA,EAAEylB,qBAEXqhB,EAAgBrlC,YAAYslC,GAC5BD,EAAgBrlC,YAAYwlC,GAC5BH,EAAgBrlC,YAAYulC,GAC5BhnC,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOu4B,IAEL/gC,OAAOC,KAAK3I,EAAKihB,eAAenb,QAClC4C,OAAOC,KAAK3I,EAAKihB,eAAepgB,SAAQ,SAAUgqC,OAC5C3hC,EAAIlJ,EAAKu+B,gBAAgBsM,GAC7BloC,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAW4qC,uBAAuBtqC,QAC5C,MACA0I,EAAEgI,OAAShI,EAAEhE,MAEf2pB,MAAO,SAA2BlsB,GAChCA,EAAE+lB,iBACF1oB,EAAK+iC,UAAU8H,EAAI,IACnB7qC,EAAK0yB,aAAaC,cAyJ5B3yB,EAAKyqC,oBAAsB,WACrBpE,IACFA,EAAoB1G,UACpB0G,OAAsBn/B,IAG1BlH,EAAKi6B,mBAAqB,WACxB9zB,SAASoiB,oBAAoB,QAASvoB,EAAKi6B,oBAC3CkM,EAAYnmC,EAAKsC,MAAMklC,kBACvBxnC,EAAKyqC,sBACDzqC,EAAK+rB,aACP/rB,EAAK+rB,YAAY4T,UAEnB3/B,EAAK+rB,iBAAc7kB,GAErBlH,EAAKy6B,iBAAmB,SAAU93B,EAAGmpB,MAC9B9rB,EAAK0Z,UAAY/W,EAAE+C,SAAW1F,EAAK4B,YASpCmpC,EACFrU,EAAQ,GACR5rB,EAAMghB,GAAe9rB,EAAKisB,YAAYtpB,GACtCoa,EAAK,CACH4P,YAAahqB,EACbyE,KAAMpH,EAAK0sB,UAAU5hB,EAAI7D,EAAG6D,EAAI/C,GAChC2uB,MAAOA,GAEN3Z,EAAG3V,KAAKqV,iBApLoB9Z,OAC7BqoC,IAEAroC,EAAEyE,KAAK6jC,cACPtoC,EAAEyE,KAAKkL,uBACP3P,EAAEyE,KAAK8jC,aACPvoC,EAAEyE,KAAK2U,UACPpZ,EAAEyE,KAAKqU,cACJ9Y,EAAEyE,KAAKwJ,OACV5Q,EAAKE,WAAWirC,YAAcH,GAChCzB,EAA6B5mC,GAG7B3C,EAAKE,WAAWkrC,UAChBprC,EAAK0b,WAAWnE,QAAO,SAAU7W,EAAG0I,UAC3B1I,EAAI0I,EAAEtD,SACZ,GAAK,GAERnD,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAWmrC,SACvBxc,MAAO,WACL1oB,SAASmlC,YAAY,QACrBtrC,EAAKi6B,qBACLj6B,EAAK0yB,aAAaC,WAIpB3yB,EAAKE,WAAWqrC,WAAavrC,EAAKwrC,eACpC7oC,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAWurC,UACvB5c,MAAO,WACL7uB,EAAKo2B,MAAMp2B,EAAKwrC,cAAe7oC,EAAEyE,KAAKO,YAAahF,EAAEyE,KAAKM,UAC1D1H,EAAK6I,UAIP7I,EAAKE,WAAWwrC,qBAClB/oC,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAWyrC,mBACvBjV,MAAO,eACDrqB,EAAI,UACRrM,EAAK4N,YAAY/M,SAAQ,SAAUspB,YACxByhB,EAAuBjpC,GAC9BwnB,EAAOlZ,QAAUkZ,EAAOlZ,OACxBjR,EAAKmC,cAAc,eAAgB,CACjCgoB,OAAQA,EACRlZ,OAAQkZ,EAAOlZ,SAEjBtO,EAAE+lB,iBACF1oB,EAAKooB,gBAAgBzlB,GACrB3C,EAAKi6B,qBACLj6B,EAAKqC,QAAO,GACZrC,EAAKkwB,qBAEH7pB,EAAKF,SAAS0gC,cAAc,OAChCP,EAAsBjgC,GACtBA,EAAGrB,iBAAiB,aAAc4mC,GAClCvlC,EAAGrB,iBAAiB,QAAS4mC,GAC7BvlC,EAAGlC,WACAgmB,EAAOlZ,OACJjR,EAAKE,WAAW2rC,yBAChB7rC,EAAKE,WAAW4rC,4BACnB3hB,EAAOjZ,OAASiZ,EAAOjlB,MAC1BmH,EAAExI,KAAK,CACLqN,MAAO7K,OAGJgG,KAGP1J,EAAEyE,MAAQzE,EAAEyE,KAAKwJ,QAAUjO,EAAEyE,KAAKO,aAAe,GACnDhF,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAW6rC,eAAevrC,QACpC,OACAmC,EAAEyE,KAAKwJ,OAAOM,OAASvO,EAAEyE,KAAKwJ,OAAO1L,MAEvC2pB,MAAO,SAAU9R,GACf/c,EAAK4N,YAAYjL,EAAEyE,KAAKO,aAAasJ,QAAS,EAC9C8L,EAAG2L,iBACH1oB,EAAKooB,gBAAgBrL,GACrB/c,EAAKi6B,qBACLj6B,EAAKkwB,iBACLS,YAAW,WACT3wB,EAAKqC,QAAO,KACX,QAMTrC,EAAKE,WAAW8f,gBAChBhgB,EAAKE,WAAW8rC,0BACftjC,OAAOC,KAAK3I,EAAK+R,MAAMvE,MAAM1H,OAAS,GACrC4C,OAAOC,KAAK3I,EAAK+R,MAAMpC,SAAS7J,OAAS,IAE3CnD,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAW+rC,wBACvBpd,MAAO,SAAUlsB,GACfA,EAAE+lB,iBACF1oB,EAAK+R,MAAMvE,KAAO,GAClBxN,EAAK+R,MAAMpC,QAAU,GACrB3P,EAAKyN,kBACLzN,EAAK69B,qBACL79B,EAAKkgC,oBAAiBh5B,EACtBlH,EAAKmC,cAAc,eAAgB,CACjC+pC,YAAalsC,EAAKsC,MAAM6O,YAE1BnR,EAAKmC,cAAc,YAAa,CAC9BgL,WAAYnN,EAAKsC,MAAM6K,aAEzBnN,EAAKkwB,iBACLlwB,EAAKqC,QAAO,GACZrC,EAAKi6B,qBACLj6B,EAAK0yB,aAAaC,WAKtB3yB,EAAKE,WAAWisC,cAChBnsC,EAAKE,WAAWksC,mBAChBpB,IAEAroC,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAWmsC,yBAAyB7rC,QAC9C,KACAmC,EAAEyE,KAAKwJ,OAAOM,OAASvO,EAAEyE,KAAKwJ,OAAO1L,MAEvC2pB,MAAO,SAAU9R,GACfA,EAAG2L,iBACH1oB,EAAKqR,MAAM1O,EAAEyE,KAAKwJ,OAAO1L,KAAM,OAC/BlF,EAAK0yB,aAAaC,WAGtBhwB,EAAE+zB,MAAM7yB,KAAK,CACXqN,MAAOlR,EAAKE,WAAWosC,0BAA0B9rC,QAC/C,KACAmC,EAAEyE,KAAKwJ,OAAOM,OAASvO,EAAEyE,KAAKwJ,OAAO1L,MAEvC2pB,MAAO,SAAU9R,GACfA,EAAG2L,iBACH1oB,EAAKqR,MAAM1O,EAAEyE,KAAKwJ,OAAO1L,KAAM,QAC/BlF,EAAKi6B,qBACLj6B,EAAK0yB,aAAaC,YAuCtB4Z,CAA0BxvB,GAExB/c,EAAKmC,cAAc,cAAe4a,IAGjCA,EAAG3V,KAAKqV,SACPzc,EAAK+rB,aACP/rB,EAAKi6B,qBAEP8Q,EAAkB,CAChBvgB,KACE1f,EAAI7D,EACJ6D,EAAIotB,KAAK1N,KACTxqB,EAAKsC,MAAMkqC,sBACXxsC,EAAK8H,iBACPyiB,IACEzf,EAAI/C,EACJ+C,EAAIotB,KAAK3N,IACTvqB,EAAKsC,MAAMmqC,qBACXzsC,EAAKgI,gBACP4lB,MAAO7Q,EAAG3V,KAAKe,MAAQ4U,EAAG3V,KAAKH,EAAI6D,EAAIotB,KAAK1N,KAC5CmD,OAAQ5Q,EAAG3V,KAAKc,OAAS6U,EAAG3V,KAAKW,EAAI+C,EAAIotB,KAAK3N,IAC9CriB,OAAQ6U,EAAG3V,KAAKc,OAChBC,MAAO4U,EAAG3V,KAAKe,OAEbnI,EAAKmT,SACP43B,EAAgBvgB,KAAOxqB,EAAKsC,MAAMoqC,wBAA0B,KAC5D3B,EAAgB5iC,MACdnI,EAAKmI,MAA6C,EAArCnI,EAAKsC,MAAMoqC,wBAA8B,MAE1D1sC,EAAK+rB,YAAc0a,EAAkB1pB,EAAIguB,EAAiBrU,GAC1DvwB,SAASnB,iBAAiB,oBA9CnB2nC,IACPvqC,uBAAsB,WACpB+D,SAASnB,iBAAiB,QAAShF,EAAKi6B,oBACxC9zB,SAASoiB,oBAAoB,UAAWokB,SA4C1ChqC,EAAE+lB,oBCltBO,aAAU1oB,GACvBA,EAAKwjC,gBAAkB,SAAUoJ,OAC3BC,EAAe7sC,EAAKwoC,SAASxoC,EAAK4F,YACpCknC,EAAU9sC,EAAKwoC,SAASoE,GACxBh1B,EAAI5X,EAAKunC,aAAavnC,EAAK4B,QAC3BmrC,EAAW,CACT9lC,EAAG,EACHc,EAAG,EACHmB,EAAG,EACHD,EAAG,GAEL+jC,EAAa,CACX/lC,GAAIgmC,EAAAA,EACJllC,GAAIklC,EAAAA,EACJ/jC,EAAG+jC,EAAAA,EACHhkC,EAAGgkC,EAAAA,GAELlgC,EAAyB/M,EAAKgN,4BAC9BC,EAAqBjN,EAAKkN,+BAC5B2/B,EAAatiB,KAAO3S,EAAE2S,IACtBsiB,EAAariB,MAAQ5S,EAAE4S,KACvBsiB,EAAQviB,KAAO3S,EAAE2S,IACjBuiB,EAAQtiB,MAAQ5S,EAAE4S,KAClBuiB,EAAS7jC,EACP2jC,EAAatiB,IACbsiB,EAAa3kC,OACb0kC,EAAI9+B,UACJ9N,EAAKsC,MAAM8P,eACb26B,EAAS9jC,EACP4jC,EAAariB,KACbqiB,EAAa1kC,MACbykC,EAAI7+B,WACJ/N,EAAKsC,MAAM8P,eACb26B,EAAS9lC,EAAI4lC,EAAariB,MAAuB,EAAhBsiB,EAAQtiB,KAAYvd,EACrD8/B,EAAShlC,EAAI8kC,EAAatiB,KAAqB,EAAfuiB,EAAQviB,IAAWxd,EAC5C,CACL9F,EAAG8lC,EAAS9lC,EAAI+lC,EAAW/lC,EAAI8lC,EAAS9lC,EAAI+lC,EAAW/lC,EACvDc,EAAGglC,EAAShlC,EAAIilC,EAAWjlC,EAAIglC,EAAShlC,EAAIilC,EAAWjlC,EACvDmB,EAAG6jC,EAAS7jC,EAAI8jC,EAAW9jC,EAAI6jC,EAAS7jC,EAAI8jC,EAAW9jC,EACvDD,EAAG8jC,EAAS9jC,EAAI+jC,EAAW/jC,EAAI8jC,EAAS9jC,EAAI+jC,EAAW/jC,IAG3DjJ,EAAK6iC,YAAc,SAAU+J,OACvBG,EAAW/sC,EAAKwjC,gBAAgBoJ,GAChCG,EAAS9jC,EAAI,IACf8jC,EAAS9jC,EAAI,GAEX8jC,EAAS7jC,EAAI,IACf6jC,EAAS7jC,EAAI,GAEf0jC,EAAItqC,MAAM4H,KACR,QACA6iC,EAAShlC,EACT,MACAglC,EAAS9jC,EACT,MACA8jC,EAAS7jC,EACT,MACA6jC,EAAS9lC,EAPT,OAsBJjH,EAAKunC,aAAe,SAAU5kC,WACxBsE,EAAI,EACNc,EAAI,EACJmlC,EAAmB/mC,SAAS+mC,kBAAoB,CAC9C5+B,WAAY,EACZa,UAAW,GAGbxM,EAAEiD,YACa,oBAAfjD,EAAEgD,UACFhD,IAAM3C,EAAKsB,MAGM,yBAAfqB,EAAEua,UACa,yBAAfva,EAAEua,WAEFjW,GAAKtE,EAAE2L,WACPvG,GAAKpF,EAAEwM,WAETxM,EAAIA,EAAEiD,iBAED,CACL4kB,KAAMvjB,EAAIimC,EAAiB5+B,WAC3Bic,IAAKxiB,EAAImlC,EAAiB/9B,YAG9BnP,EAAKmrB,gBAAkB,cACjBnrB,EAAKgsB,OAAShsB,EAAKgsB,MAAMmhB,SAAU,KACjCriC,EAAM9K,EAAK4B,OAAOu2B,wBACpBvgB,EAAI5X,EAAKunC,aAAavnC,EAAKsB,MAC3BqoB,EAAuC,aAAlC3pB,EAAKsC,MAAMkK,mBAAoC,EAAI,EACxD4gC,EAAcptC,EAAKsC,MAAMkM,gBAAkBmb,EAC3CviB,EAAOpH,EAAKoiC,sBACVpiC,EAAKgsB,MAAMmhB,SAASxlC,YACpB3H,EAAKgsB,MAAMmhB,SAASzlC,WACjB,CAAET,GAAI,IAAKc,GAAI,IAAKG,OAAQ,EAAGC,MAAO,MACzCnI,EAAKmT,cACPnT,EAAKgsB,MAAM1pB,MAAMkoB,KAAO,IACxBxqB,EAAKgsB,MAAM1pB,MAAMioB,IACfvqB,EAAKkI,OACLlI,EAAKsC,MAAM+qC,sBACXD,EACA,EACA,KACFptC,EAAKgsB,MAAM1pB,MAAM4F,OAASlI,EAAKsC,MAAM+qC,sBAAwB,UAC7DrtC,EAAKgsB,MAAM1pB,MAAM6F,MAAQnI,EAAKmI,MAAQilC,EAAc,EAAI,MAG1DptC,EAAKgsB,MAAM1pB,MAAMkoB,KACf1f,EAAI0f,KAAOpjB,EAAKH,EAAIjH,EAAK8H,iBAAmB8P,EAAE4S,KAAO,KACvDxqB,EAAKgsB,MAAM1pB,MAAMioB,IACfzf,EAAIyf,IACJnjB,EAAKW,EACL/H,EAAKsC,MAAMkM,gBACXxO,EAAKgI,gBACL4P,EAAE2S,IACF,KACFvqB,EAAKgsB,MAAM1pB,MAAM4F,OAASd,EAAKc,OAASklC,EAAc,KACtDptC,EAAKgsB,MAAM1pB,MAAM6F,MAAQf,EAAKe,MAAQnI,EAAKsC,MAAMgrC,gBAAkB,KACnEttC,EAAK6iC,YAAY7iC,EAAKgsB,SAG1BhsB,EAAKwoC,SAAW,SAAU7lC,EAAG4qC,WAIzBrkC,EACAD,EAJEhC,EAAI,EACNc,EAAI,EACJ6P,EAAIjV,EAGCA,EAAEsb,cAA+B,oBAAftb,EAAEgD,UACzBsB,GAAKtE,EAAEoL,WACPhG,GAAKpF,EAAEmL,UACP5E,EAAIvG,EAAEqb,aACN/U,EAAItG,EAAEob,YACNpb,EAAIA,EAAEsb,oBAEJsvB,EACK,CAAE/iB,KAAMvjB,EAAGsjB,IAAKxiB,EAAGG,OAAQgB,EAAGf,MAAOc,IAE9CtG,EAAIiV,EAEG,CAAE4S,KAAMvjB,GADf2Q,EAAI5X,EAAKunC,aAAa5kC,IACD6nB,KAAMD,IAAKxiB,EAAI6P,EAAE2S,IAAKriB,OAAQgB,EAAGf,MAAOc,KAE/DjJ,EAAKisB,YAAc,SAAUtpB,OACvBu1B,EAAOl4B,EAAK4B,OAAOu2B,wBACrBrtB,EAAM,CACJ7D,EAAGtE,EAAEy1B,QAAUF,EAAK1N,KACpBziB,EAAGpF,EAAE01B,QAAUH,EAAK3N,YAEpBvqB,EAAKkL,cACPJ,EAAI7D,GAAKjH,EAAK8H,iBACdgD,EAAI/C,GAAK/H,EAAKgI,iBAET,CACLf,EAAG6D,EAAI7D,EACPc,EAAG+C,EAAI/C,EACPmwB,KAAMA,IAUVl4B,EAAK+uB,QAAU,SAAUye,OACnBpmC,EAAOpH,EAAKgsB,MAAMmhB,SACpBplC,EAAIX,EAAKM,YAKT1H,EAAKmC,cAAc,gBAAiB,CAClCiF,KAAMA,EACNqmC,SAAUztC,EAAKgsB,MAAMhP,MACrB0wB,SAAUtmC,EAAK4V,MACfwwB,iBAPFA,GAAQ,GAQNxhB,MAAOhsB,EAAKgsB,eAGP,KAELhsB,EAAKgsB,MAAMhP,QAAU5V,EAAK4V,QAAUwwB,EAAO,IAC7CxtC,EAAKk9B,QAAQn1B,GAAK/H,EAAKk9B,QAAQn1B,IAAM,GACrC/H,EAAKk9B,QAAQn1B,GAAGX,EAAKwJ,OAAO1L,MAAQlF,EAAKgsB,MAAMhP,MAC1C5V,EAAK7E,OACRvC,EAAK0R,aAAatK,EAAKgX,eAAiB,GACxChX,EAAK7E,KAAOvC,EAAK0R,aAAatK,EAAKgX,gBAErChX,EAAK7E,KAAK6E,EAAKwJ,OAAO1L,MAAQlF,EAAKgsB,MAAMhP,MACrCjV,IAAM/H,EAAKsM,SAASxG,OAAQ,IAE5B9F,EAAKmC,cAAc,SAAU,CAC3B6a,MAAOhd,EAAKgsB,MAAMhP,MAClB+gB,aAAc32B,EAAK4V,MACnB2wB,QAASH,EACTpmC,KAAMA,EACN4kB,MAAOhsB,EAAKgsB,eAGP,EAEThsB,EAAKojC,OAAOh8B,EAAK7E,MACjBvC,EAAKg+B,mBAEPh+B,EAAK6I,MAAK,UAER7I,EAAKgsB,MAAMpmB,YACb5F,EAAKgsB,MAAMpmB,WAAWg6B,YAAY5/B,EAAKgsB,OAEzChsB,EAAKsB,KAAKqxB,QACV3yB,EAAKmC,cAAc,UAAW,CAC5BiF,KAAMA,EACN4V,MAAOhd,EAAKgsB,MAAMhP,MAClB2wB,QAASH,EACTxhB,MAAOhsB,EAAKgsB,QAEdhsB,EAAKgsB,WAAQ9kB,GACN,GAcTlH,EAAKozB,YAAc,SAAUnsB,EAAGc,EAAG4kB,OAAaihB,6DACzC5tC,EAAKE,WAAWm2B,UAGjBr2B,EAAKgsB,OACPhsB,EAAK+uB,cAILiE,EACA6a,EACAC,EACAC,EACAC,EANE5mC,EAAOpH,EAAKoiC,sBAAsBn7B,EAAGc,GACnC/H,EAAK4N,eAMLxG,GAAQA,EAAKwJ,WAInBk9B,EAAM1mC,EAAKwJ,OAAL,KAEJ5Q,EAAKmC,cAAc,kBAAmB,CACpCiF,KAAMA,EACNulB,YAAaA,WAGR,KAET3sB,EAAKm0B,eAAeltB,EAAGc,GACvB/H,EAAKgvB,cAAc/nB,EAAGc,GACtBirB,EAAgBhzB,EAAK4yB,mBAEnB5yB,EAAKgsB,MADH8hB,EACW3nC,SAAS0gC,cAAc,UAEvB1gC,SAAS0gC,cACpB7mC,EAAKE,WAAW+tC,UAAY,WAAa,SAG7C7mC,EAAOpH,EAAKoiC,sBAAsBn7B,EAAGc,IAKjC+lC,IAEiB,mBAARA,EACTD,EAAYC,EAAIpzB,MAAM1a,EAAKsB,KAAM,CAAC,CAAE8F,KAAMA,KACjCzG,MAAM2kC,QAAQwI,KACvBD,EAAYC,GAEdD,EAAUhtC,SAAQ,SAAU8B,OAExBX,EACAkP,EAFExN,EAAIyC,SAAS0gC,cAAc,UAG3BlmC,MAAM2kC,QAAQ3iC,IAChBX,EAAMW,EAAE,GACRuO,EAAQvO,EAAE,KAEVX,EAAMW,EACNuO,EAAQvO,GAENX,IAAQoF,EAAK4V,QACfgxB,GAAc,GAEhBtqC,EAAEsZ,MAAQhb,EACV0B,EAAES,UAAY+M,EACdlR,EAAKgsB,MAAM5nB,YAAYV,MAEpBsqC,KACHD,EAAS5nC,SAAS0gC,cAAc,WACzB7pB,MAAQ5V,EAAK4V,MACpB+wB,EAAO5pC,UAAYiD,EAAK4V,MACxBhd,EAAKgsB,MAAM5nB,YAAY2pC,IAEzB/tC,EAAKgsB,MAAMhnB,iBAAiB,UAAU,WACpChF,EAAK+uB,UACL/uB,EAAK6I,MAAK,OAKX7I,EAAKmC,cAAc,kBAAmB,CAAEiF,KAAMA,EAAM4kB,MAAOhsB,EAAKgsB,SAEjE7lB,SAAS8pB,KAAK7rB,YAAYpE,EAAKgsB,OAEjChsB,EAAKwmC,kBACHxmC,EAAKgsB,MACLhsB,EAAKmT,OACD,oCACA,8BAENnT,EAAKgsB,MAAM1pB,MAAMkmC,SAAW,WAC5BxoC,EAAKgsB,MAAMmhB,SAAW/lC,EACtBpH,EAAKmrB,kBACLnrB,EAAKgsB,MAAM1pB,MAAMomC,OAAS1oC,EAAKsC,MAAM4rC,eACrCluC,EAAKgsB,MAAM1pB,MAAM6rC,SACfjrC,SAASlD,EAAKsC,MAAM8rC,iBAAkB,IAAMpuC,EAAKgY,MAAQ,SAEvDq2B,GAA8D,IAA3C,CAAC,UAAMnnC,GAAWyU,QAAQvU,EAAK4V,OAClDsxB,EAAuBD,GAAoBT,EAE/C5tC,EAAKgsB,MAAMhP,MAAQsxB,EAAuB,GAAKlnC,EAAK4V,MACpDhd,EAAKgsB,MAAM2G,QACX3yB,EAAKgsB,MAAMhnB,iBAAiB,QAAShF,EAAKooB,iBAC1CpoB,EAAKgsB,MAAMhnB,iBAAiB,WAAYhF,EAAKooB,iBAC7CpoB,EAAKgsB,MAAMhnB,iBAAiB,UAAWhF,EAAKooB,iBAC5CpoB,EAAKgsB,MAAMhnB,iBAAiB,YAAahF,EAAKooB,iBAC9CpoB,EAAKgsB,MAAMhnB,iBAAiB,WAAW,SAAUrC,OAC3C4rC,EAAKnnC,EAAKO,YACZ6mC,EAAKpnC,EAAKM,YAEE,WAAV/E,EAAEmX,IACJ9Z,EAAK+uB,SAAQ,GACb/uB,EAAK6I,MAAK,QACL,GAAc,UAAVlG,EAAEmX,KAAmB9Z,EAAKE,WAAW+tC,WAAatrC,EAAE8rC,OAC7DzuC,EAAKgsB,MAAMhP,MAAQhd,EAAKgsB,MAAMhP,MAAQ,KACtChd,EAAKgsB,MAAM7c,UAAYnP,EAAKgsB,MAAM5V,kBAC7B,GAAc,UAAVzT,EAAEmX,IAAiB,CAC5B9Z,EAAK+uB,cAGD2f,EAAe/rC,EAAE+qB,SACjB9lB,KAAKiT,IAAI,EAAG2zB,EAAK,GACjB5mC,KAAKuG,IAAIqgC,EAAK,EAAGxuC,EAAKsM,SAASxG,OAAS,GAExC4oC,IAAiBF,IACnBxuC,EAAKm0B,eAAeoa,EAAIG,GACxB1uC,EAAKgvB,cAAcuf,EAAIG,IAGzB1uC,EAAK6I,MAAK,QACL,GACL,CAAC,UAAW,YAAa,YAAa,cAAcif,SAASnlB,EAAEmX,MAC/D8zB,EACA,QACQjrC,EAAEmX,SACH,UACH00B,EAAK5mC,KAAKiT,IAAI,EAAG2zB,EAAK,aAEnB,YACHA,EAAK5mC,KAAKuG,IAAIqgC,EAAK,EAAGxuC,EAAKsM,SAASxG,OAAS,aAE1C,YACHyoC,EAAK3mC,KAAKiT,IAAI0zB,EAAK,EAAG,aAEnB,aACHA,EAAKvb,EAAcpF,MAIvB5tB,EAAK+uB,UAEL/uB,EAAKm0B,eAAeoa,EAAIC,GACxBxuC,EAAKgvB,cAAcuf,EAAIC,GAEvBxuC,EAAK6I,MAAK,QACL,GAAc,QAAVlG,EAAEmX,IAAe,IAC1BnX,EAAE+lB,kBACG1oB,EAAK+uB,iBAIRwf,EADE5rC,EAAE+qB,SACCsF,EAAcxI,KAEdwI,EAAcpF,MAEjBoF,EAAcxI,OAASvjB,GAAKtE,EAAE+qB,WAChC6gB,EAAKvb,EAAcF,KACnB0b,GAAM,GAEJxb,EAAcpF,QAAU3mB,GAAMtE,EAAE+qB,WAClC6gB,EAAKvb,EAAcH,MACnB2b,GAAM,GAEJA,EAAK,IACPA,EAAKxuC,EAAKsM,SAASxG,OAAS,GAE1B0oC,EAAKxuC,EAAKsM,SAASxG,OAAS,IAC9B0oC,EAAK,GAEPxuC,EAAKm0B,eAAeoa,EAAIC,GACxBxuC,EAAKozB,YAAYmb,EAAIC,EAAI7rC,OAI7B3C,EAAKmC,cAAc,YAAa,CAAEiF,KAAMA,EAAM4kB,MAAOhsB,EAAKgsB,YAE5DhsB,EAAKwmC,kBAAoB,SAAUngC,EAAIsoC,OACjCC,EAAM,6CACqC,CAC3C1mC,OAAQ,OACR2mC,cAAe,SACfC,WAAY,MACZC,QAAS,IACTjF,WAAY9pC,EAAKsC,MAAMynC,6BACvBjvB,MAAO9a,EAAKsC,MAAM0nC,wBAClBgF,OAAQhvC,EAAKsC,MAAM2sC,yBACnBC,aAAclvC,EAAKsC,MAAM6sC,+BACzBxxB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAMgtC,6BACvBnB,SAAUnuC,EAAKsC,MAAMitC,yEAEuB,CAC5CrnC,OAAQ,OACR2mC,cAAe,SACfC,WAAY,MACZC,QAAS,IACTjF,WAAY9pC,EAAKsC,MAAMktC,sBACvB10B,MAAO9a,EAAKsC,MAAMmtC,iBAClBT,OAAQhvC,EAAKsC,MAAMotC,0BACnBR,aAAclvC,EAAKsC,MAAMqtC,gCACzBhyB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAMstC,kCACvBzB,SAAUnuC,EAAKsC,MAAMutC,uEAEgB,CACrCC,SAAU,QACVh1B,MAAO9a,EAAKsC,MAAMytC,2BAClB5B,SAAUnuC,EAAKsC,MAAM0tC,8BACrBX,WAAYrvC,EAAKsC,MAAM2tC,sBACvBpB,cAAe,yCAEe,CAC9BQ,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,oBACrBpG,WAAY9pC,EAAKsC,MAAMktC,sBACvB10B,MAAO9a,EAAKsC,MAAMmtC,iBAClBT,OAAQhvC,EAAKsC,MAAM6tC,kBACnBpB,QAAS/uC,EAAKsC,MAAM8tC,mBACpBlB,aAAclvC,EAAKsC,MAAM+tC,wBACzBC,QAAStwC,EAAKsC,MAAMiuC,mBACpB/H,SAAU,WACVE,OAAQ,KACR8H,SAAU,8CAEyB,CACnC1G,WAAY9pC,EAAKsC,MAAMktC,sBACvB10B,MAAO9a,EAAKsC,MAAMmtC,4DAEuB,CACzC3F,WAAY9pC,EAAKsC,MAAMmuC,2BACvB31B,MAAO9a,EAAKsC,MAAMouC,gDAEM,CACxBlI,SAAU,WACVE,OAAQ,wBAES,CACjBiI,QAAS,yCAEsB,CAC/BnI,SAAU,QACVje,IAAK,OACLC,KAAM,OACNwkB,OAAQ,OACRsB,QAAS,IACThjB,OAAQ,UACRnlB,MAAO,MACPD,OAAQ,MACRyV,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,yDAEc,CACnCU,UAAW,cACXC,QAAS,OACTC,OAAQ,IACR/B,QAAS,UACTpxB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAMyuC,qBACvB5C,SAAUnuC,EAAKsC,MAAM0uC,mBACrBhC,OAAQhvC,EAAKsC,MAAM2uC,eACnBn2B,MAAO9a,EAAKsC,MAAM4uC,cAClBpH,WAAY9pC,EAAKsC,MAAM6uC,wBACvBC,WAAY,OACZC,iBAAkB,OAClBC,cAAe,OACfpC,aAAc,kCAEc,CAC5B0B,UAAW,cACXC,QAAS,OACTC,OAAQ,IACR/B,QAAS,SAAW/uC,EAAKsC,MAAMivC,oBAAsB,KACrD5zB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAMkvC,mBACvBrD,SAAUnuC,EAAKsC,MAAM8rC,iBACrBqD,UAAWzxC,EAAKsC,MAAMovC,kBACtB1C,OAAQhvC,EAAKsC,MAAM2uC,eACnBn2B,MAAO9a,EAAKsC,MAAM4uC,cAClBpH,WAAY9pC,EAAKsC,MAAM6uC,wBACvBC,WAAY,OACZC,iBAAkB,OAClBC,cAAe,OACfpC,aAAc,gDAE4B,CAC1CvxB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,oBACrBp1B,MAAO,UACPgvB,WAAY,UACZgH,OAAQ9wC,EAAKsC,MAAMqvC,sBACnBzC,aAAclvC,EAAKsC,MAAMsvC,4BACzB/C,cAAe,8CAEoB,CACnClxB,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,oBACrBp1B,MAAO,UACPgvB,WAAY,UACZgH,OAAQ9wC,EAAKsC,MAAMqvC,sBACnBzC,aAAclvC,EAAKsC,MAAMsvC,4BACzB/C,cAAe,oDAE0B,CACzC/E,WAAY9pC,EAAKsC,MAAMmuC,2BACvB31B,MAAO9a,EAAKsC,MAAMouC,4DAEkB,CACpCI,OAAQ9wC,EAAKsC,MAAMuvC,uBACnBlB,QAAS3wC,EAAKsC,MAAMwvC,wBACpB/I,SAAU/oC,EAAKsC,MAAMyvC,yBACrBC,SAAUhyC,EAAKsC,MAAM2vC,gEAEgB,CACrCt0B,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,oBACrBpG,WAAY9pC,EAAKsC,MAAMktC,sBACvB10B,MAAO9a,EAAKsC,MAAMmtC,iBAClBT,OAAQhvC,EAAKsC,MAAM6tC,kBACnBpB,QAAS/uC,EAAKsC,MAAM8tC,mBACpBlB,aAAclvC,EAAKsC,MAAM+tC,wBACzBC,QAAStwC,EAAKsC,MAAMiuC,mBACpBC,SAAU,SACV9yB,WAAY,yCAEkB,CAC9BC,WAAY,SACZyxB,WAAY,SACZC,WAAYrvC,EAAKsC,MAAM2tC,sBACvB9B,SAAUnuC,EAAKsC,MAAM4tC,oBACrBpG,WAAY9pC,EAAKsC,MAAMktC,sBACvB10B,MAAO9a,EAAKsC,MAAMmtC,iBAClBT,OAAQhvC,EAAKsC,MAAM6tC,kBACnBpB,QAAS/uC,EAAKsC,MAAM8tC,mBACpBlB,aAAclvC,EAAKsC,MAAM+tC,wBACzBC,QAAStwC,EAAKsC,MAAMiuC,mBACpBC,SAAU,SACV9yB,WAAY,SACZ4P,OAAQttB,EAAKsC,MAAM4vC,2DAEoB,CACvCpI,WAAY9pC,EAAKsC,MAAM6vC,oCAGvBvD,EAAID,IACNjmC,OAAOC,KAAKimC,EAAID,IAAYpsB,KAAI,SAAUhiB,GACxC8F,EAAG/D,MAAM/B,GAAQquC,EAAID,GAAWpuC,OAKtCP,EAAKmiC,SAAW,SAAUx/B,GACxB3C,EAAK4F,WAAajD,EAClB3C,EAAKwhC,UAEPxhC,EAAKwhC,OAAS,WACRxhC,EAAKkL,aACPlL,EAAKmL,WAAanL,EAAK4F,WAAWuF,WAClCnL,EAAKqI,IAAMrI,EAAKmL,WAAWsL,QAC3BzW,EAAK4B,OAAS5B,EAAKmL,WAAWvJ,OAC9B5B,EAAK0yB,aAAe1yB,EAAKmL,WAAWunB,aACpC1yB,EAAK6/B,YAAc7/B,EAAK4B,SAExB5B,EAAK0yB,aAAe1yB,EAAK0yB,cAAgBvsB,SAAS0gC,cAAc,SAChE7mC,EAAK0yB,aAAa0f,OAASpyC,EAAKsB,KAAK0jC,KACrChlC,EAAKwmC,kBACHxmC,EAAK0yB,aACL,iCAEF1yB,EAAKkL,aAAc,EACnBlL,EAAKkE,cAAgBlE,EAAK4F,WAC1B5F,EAAKqyC,eAAiB,YAAY/uC,KAAKtD,EAAKkE,cAAcvC,SACtD3B,EAAKqyC,eACPryC,EAAK4B,OAAS5B,EAAKkE,eAEnBlE,EAAK4B,OAASuE,SAAS0gC,cAAc,UACrC7mC,EAAKkE,cAAcE,YAAYpE,EAAK4B,SAEtCuE,SAAS8pB,KAAK7rB,YAAYpE,EAAK0yB,cAC/B1yB,EAAKwmC,kBAAkBxmC,EAAK4B,OAAQ,mBACpC5B,EAAKqI,IAAMrI,EAAK4B,OAAO0wC,WAAW,MAClCtyC,EAAKqI,IAAIkqC,aAAe,aACxBvyC,EAAK6/B,YAAc7/B,EAAK4B,QAE1B5B,EAAKyrB,gBAAkBzrB,EAAK4B,OAAOU,MACnCtC,EAAK0yB,aAAamV,aAAa,YAAY,GAC3C7nC,EAAK0yB,aAAa1tB,iBAAiB,QAAQ,SAAUrC,GAC/CA,EAAE+C,SAAW1F,EAAK4B,SACpB5B,EAAK0Z,UAAW,MAGpB1Z,EAAK6/B,YAAY76B,iBAAiB,SAAUhF,EAAKqC,QAAQ,GACzDrC,EAAK6/B,YAAY76B,iBAAiB,aAAchF,EAAK85B,YAAY,GACjE95B,EAAK6/B,YAAY76B,iBAAiB,UAAWhF,EAAKyyB,SAAS,GAC3DzyB,EAAK6/B,YAAY76B,iBAAiB,YAAahF,EAAKkyB,WAAW,GAC/DlyB,EAAK6/B,YAAY76B,iBAAiB,WAAYhF,EAAKu0B,UAAU,GAC7Dv0B,EAAK6/B,YAAY76B,iBAAiB,QAAShF,EAAK6uB,OAAO,GACvD1oB,SAAS8pB,KAAKjrB,iBAAiB,YAAahF,EAAK6rB,WACjD7rB,EAAKA,EAAKkL,YAAc,aAAe,eAAelG,iBACpD,QACAhF,EAAK00B,aACL,GAEF10B,EAAK4B,OAAOoD,iBAAiB,cAAehF,EAAKy6B,kBAAkB,GACnEz6B,EAAK0yB,aAAa1tB,iBAAiB,OAAQhF,EAAKm3B,MAChDn3B,EAAK0yB,aAAa1tB,iBAAiB,MAAOhF,EAAKk3B,KAC/Cl3B,EAAK0yB,aAAa1tB,iBAAiB,QAAShF,EAAKo2B,OACjDp2B,EAAK0yB,aAAa1tB,iBAAiB,WAAYhF,EAAKs0B,UAAU,GAC9Dt0B,EAAK0yB,aAAa1tB,iBAAiB,QAAShF,EAAKq0B,OAAO,GACxDr0B,EAAK0yB,aAAa1tB,iBAAiB,UAAWhF,EAAK+yB,SAAS,GAC5DtxB,OAAOuD,iBAAiB,SAAUhF,EAAKqC,SCpqB5B,uBAAUrC,GAQvBA,EAAK+jC,eAAiB,SAAU9gC,WAC1BuvC,EAAO,IAAIC,WAAW,GAExB1b,EADO,IAAI0b,WAAW,GACTD,EAAO,EACpB56B,EAAI,GACC3U,GAAK,GACV2U,EAAIwP,OAAOsrB,aAAczvC,EAAI8zB,EAAOyb,GAAQ56B,EAC5C3U,EAAI2E,KAAK+jB,MAAM1oB,EAAI8zB,GAAO,SAErBnf,GAWT5X,EAAKqjC,aAAe,SAAUx4B,EAAGuG,OAC3BwG,EAAI5X,EAAK4N,eACTgK,EAAE9R,OAASsL,QACP,IAAIxO,MAAM,6CAElB5C,EAAKo/B,eAAev0B,EAAG+M,GACvBA,EAAE4K,OAAOpR,EAAO,EAAGvG,GAEnB7K,EAAK0R,aAAa7Q,SAAQ,SAAUoc,EAAKvV,GACvC1H,EAAK89B,kBAAkB7gB,EAAKpS,EAAGnD,MAEjC1H,EAAKsB,KAAKuB,OAAS+U,EAEnB5X,EAAK++B,WAUP/+B,EAAKsjC,aAAe,SAAUlyB,OACxBvO,EAAS7C,EAAK4N,YAGlB5N,EAAK0R,aAAa7Q,SAAQ,SAAUoc,UAC3BA,EAAIpa,EAAOuO,GAAOlM,SAG3BrC,EAAO2f,OAAOpR,EAAO,GACrBpR,EAAKsB,KAAKuB,OAASA,EAEnB7C,EAAK++B,WAUP/+B,EAAKujC,UAAY,SAAU14B,OACrB+M,EAAI5X,EAAK4N,YACb5N,EAAKo/B,eAAev0B,EAAG+M,GACvBA,EAAE/T,KAAKgH,GACP7K,EAAK0R,aAAa7Q,SAAQ,SAAUoc,EAAKvV,GACvC1H,EAAK89B,kBAAkB7gB,EAAKpS,EAAGnD,MAEjC1H,EAAKsB,KAAKuB,OAAS+U,EAEnB5X,EAAK++B,WASP/+B,EAAKmjC,UAAY,SAAU/xB,GACzBpR,EAAK0R,aAAa8Q,OAAOpR,EAAO,GAChCpR,EAAK+iC,YACL/iC,EAAKqC,QAAO,IAUdrC,EAAKkjC,UAAY,SAAU72B,EAAG+E,MACxBpR,EAAK0R,aAAa5L,OAASsL,QACvB,IAAIxO,MAAM,8CAElB5C,EAAK0R,aAAa8Q,OAAOpR,EAAO,EAAG/E,GACnCrM,EAAK4N,YAAY/M,SAAQ,SAAUgK,QACf3D,IAAdmF,EAAExB,EAAE3F,OACNlF,EAAK89B,kBAAkB99B,EAAK0R,aAAaN,GAAQvG,EAAGuG,MAKxDpR,EAAK+iC,YAEL/iC,EAAKqC,QAAO,IASdrC,EAAKojC,OAAS,SAAU/2B,GACtBrM,EAAK0R,aAAa7N,KAAKwI,GACvBrM,EAAK4N,YAAY/M,SAAQ,SAAUgK,QACf3D,IAAdmF,EAAExB,EAAE3F,OACNlF,EAAK89B,kBACH99B,EAAK0R,aAAa1R,EAAK0R,aAAa5L,OAAS,GAC7C+E,EACA7K,EAAK0R,aAAa5L,OAAS,MAMjC9F,EAAK+iC,YAEL/iC,EAAKqC,QAAO,IAUdrC,EAAKyjC,aAAe,SAAU/7B,EAAUQ,GACtClI,EAAK+R,MAAMvE,KAAK9F,GAAYQ,EAC5BlI,EAAK6I,MAAK,IAUZ7I,EAAK0jC,eAAiB,SAAU9N,EAAUztB,GACxCnI,EAAK+R,MAAMpC,QAAQimB,GAAYztB,EAC/BnI,EAAK6I,MAAK,IASZ7I,EAAK2jC,kBAAoB,WACvB3jC,EAAK+R,MAAMpC,QAAU,GACrB3P,EAAK6I,MAAK,IASZ7I,EAAK4jC,gBAAkB,WACrB5jC,EAAK+R,MAAMvE,KAAO,GAClBxN,EAAK6I,MAAK,IAUZ7I,EAAK+iC,UAAY,SAAU5Y,EAAQnN,QAClB9V,IAAXijB,QAAkCjjB,IAAV8V,EAC1Bhd,EAAKihB,cAAgB,IACZkJ,GAAqB,KAAVnN,QAA0B9V,IAAV8V,EAGpChd,EAAKihB,cAAckJ,GAAUnN,SAFtBhd,EAAKihB,cAAckJ,GAI5BnqB,EAAK++B,WASP/+B,EAAKyiC,iBAAmB,SAAU/6B,WACKR,IAAjClH,EAAKiqB,YAAYliB,EAAEL,SACf,IAAI29B,+BACK39B,4BAA0B1H,EAAKiqB,YAAYliB,EAAEjC,oBAGvD9F,EAAKiqB,YAAYliB,EAAEL,IAS5B1H,EAAKwiC,qBAAuB,SAAU76B,OAChCjE,EAAIkE,KAAKiT,IAAIlT,EAAc,EAAG,WACJT,IAA1BlH,EAAKiqB,YAAYhjB,EAAEvD,SACf,IAAId,MAAM,qCAGhB5C,EAAKiqB,YAAYhjB,EAAEvD,GACnB1D,EAAK6X,eAAe7X,EAAKuN,OAAOoC,QAAQhI,KAa5C3H,EAAKsiC,SAAW,SAAUr7B,EAAGc,EAAG4qC,EAASC,OAGrCxrC,EAFEyrC,OAAgB3rC,IAAND,OAAkBC,EAAYlH,EAAKwiC,qBAAqBv7B,GACpE6rC,OAAgB5rC,IAANa,OAAkBb,EAAYlH,EAAKyiC,iBAAiB16B,GAE9D0hB,EACEzpB,EAAKqO,UAAUlG,OACdnI,EAAKqO,UAAUuI,mBAAqB5W,EAAKsC,MAAM8P,eAAiB,GACnE2gC,EACE/yC,EAAKqO,UAAUnG,QACdlI,EAAKqO,UAAUgI,qBAAuBrW,EAAKsC,MAAM8P,eAAiB,GAGvEygC,GAAWppB,GAFXkpB,OAAsBzrC,IAAZyrC,EAAwB,EAAIA,GAGtCG,GAAWC,GAFXH,OAAsB1rC,IAAZ0rC,EAAwB,EAAIA,QAG5B1rC,IAAND,QAAyBC,IAANa,GACrB/H,EAAKqO,UAAU0mB,SAAS8d,EAASC,GACjC1wC,uBAAsB,YACpBgF,EAAOpH,EAAKoiC,sBAAsBn7B,EAAGc,MAMrC8qC,GAAWzrC,EAAKe,MAAQwqC,EACxBG,GAAW1rC,EAAKc,OAAS0qC,EACzB5yC,EAAKqO,UAAU0mB,SAAS8d,EAASC,aAEpB5rC,IAAND,EACTjH,EAAKqO,UAAUC,WAAaukC,OACb3rC,IAANa,IACT/H,EAAKqO,UAAUc,UAAY2jC,IAU/B9yC,EAAKuiC,QAAU,SAAUx6B,GACvB/H,EAAKsiC,SAAS,EAAGv6B,IAYnB/H,EAAKm0B,eAAiB,SAAUltB,EAAGc,EAAG4qC,EAASC,GAW7B,IATd5yC,EAAK6N,aAAa9I,QAAO,SAAUqC,UAE9BA,EAAKM,WAAaK,QAAWb,IAANa,KACvBX,EAAKO,cAAgBV,QAAWC,IAAND,IAC3BG,EAAKH,EAAI,GACTG,EAAKW,EAAI,GACTX,EAAKH,EAAIG,EAAKe,MAAQnI,EAAKmI,OAC3Bf,EAAKW,EAAIX,EAAKc,OAASlI,EAAKkI,UAE7BpC,QAEH9F,EAAKsiC,SAASr7B,EAAGc,EAAG4qC,EAASC,IAWjC5yC,EAAKgvB,cAAgB,SAAU/nB,EAAGc,GAC5Bd,EAAI,IACNA,EAAI,GAEFc,EAAI,IACNA,EAAI,GAEN/H,EAAKiQ,WAAa,CAChBvI,SAAUK,EACVJ,YAAaV,IAUjBjH,EAAKqzB,WAAa,SAAU3H,GAC1B1rB,EAAK0b,WAAa,GAClB1b,EAAKmC,cAAc,mBAAoB,CACrC8rB,aAAcjuB,EAAKkuB,kBACnBxS,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAKquB,gBACtBF,cAAenuB,EAAKouB,qBAElB1C,GAGJ1rB,EAAK6I,QASP7I,EAAKivB,UAAY,SAAUvD,GACzB1rB,EAAKuuB,WAAW,CACdhE,IAAK,EACLC,MAAO,EACPoD,MAAO5tB,EAAK4N,YAAY9H,OAAS,EACjC6nB,OAAQ3tB,EAAKsM,SAASxG,OAAS,IAE7B4lB,GAGJ1rB,EAAK6I,QASP7I,EAAKgzC,iBAAmB,SAAUrrC,OAC5BsrC,GAAgB,SACpBjzC,EAAKsM,SAASzL,SAAQ,SAAUoc,EAAKvV,GAEhC1H,EAAK0b,WAAWhU,KAEd,IADH1H,EAAK0b,WAAWhU,GAAUiU,QAAQ3b,EAAKuN,OAAOoC,QAAQhI,MAGtDsrC,GAAgB,MAGbA,GAUTjzC,EAAKq1B,oBAAsB,SAAUhN,EAAIgV,OACnChxB,EAAI,GACNuL,EAAIylB,EAAcr9B,EAAK4N,YAAc5N,EAAKk2B,mBAC1ClrB,EAAIhL,EAAKsM,SAASxG,OACpB9F,EAAK0b,WAAW7a,SAAQ,SAAUoc,EAAK7L,GACjCA,IAAUpG,IAGK,IAAfiS,EAAInX,QAIRuG,EAAE+E,GAAS,GACX6L,EAAIpc,SAAQ,SAAUknB,IACP,IAATA,GAAenQ,EAAEmQ,IAGrBM,EAAGroB,EAAKsM,SAAU8E,EAAOwG,EAAEmQ,GAAK7iB,UARhCmH,EAAE+E,GAAS,UAsBjBpR,EAAKovB,aAAe,SAAUznB,EAAa0kB,EAAM6H,EAAOgf,OAClDt7B,EAAGjV,EAAGsE,EASSvD,WARVyvC,EAAOzvC,GACd1D,EAAKsM,SAASzL,SAAQ,SAAUoc,EAAKvV,GACnC1H,EAAK0b,WAAWhU,GAAY1H,EAAK0b,WAAWhU,IAAa,IACX,IAA1C1H,EAAK0b,WAAWhU,GAAUiU,QAAQjY,IACpC1D,EAAK0b,WAAWhU,GAAU7D,KAAKH,SAejCwwB,EAAO,KACJl0B,EAAKiQ,sBAGV2H,EAAIhQ,KAAKuG,IAAInO,EAAKiQ,WAAWtI,YAAaA,GAC1ChF,EAAIiF,KAAKiT,IAAI7a,EAAKiQ,WAAWtI,YAAaA,GACrCV,EAAI2Q,EAAGjV,EAAIsE,EAAGA,GAAK,EACtBksC,EAAOlsC,GAGNolB,GAAS6H,IACZl0B,EAAK0b,WAAa,GAClB1b,EAAKiQ,WAAWtI,YAAcA,EAC9B3H,EAAKiQ,WAAWvI,SAAW1H,EAAKqP,gBAE9Bgd,GAAQrsB,EAAKgzC,iBAAiBrrC,IA1BfjE,EA2BPiE,EA1BV3H,EAAKsM,SAASzL,SAAQ,SAAUoc,EAAKvV,GACnC1H,EAAK0b,WAAWhU,GAAY1H,EAAK0b,WAAWhU,IAAa,IACX,IAA1C1H,EAAK0b,WAAWhU,GAAUiU,QAAQjY,IACpC1D,EAAK0b,WAAWhU,GAAU8a,OACxBxiB,EAAK0b,WAAWhU,GAAUiU,QAAQjY,GAClC,OAuBNyvC,EAAOxrC,GAELurC,GAGJlzC,EAAKmC,cAAc,mBAAoB,CACrC8rB,aAAcjuB,EAAKkuB,kBACnBxS,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAK6tB,qBACtBM,cAAenuB,EAAKouB,sBAaxBpuB,EAAKsuB,UAAY,SAAU5mB,EAAU2kB,EAAM6H,EAAOgf,OAC5CjsC,EACFmsC,EACAjnC,EACAyL,EAAI5X,EAAKk2B,4BACFmd,IACHH,GAGJlzC,EAAKmC,cAAc,mBAAoB,CACrC8rB,aAAcjuB,EAAKkuB,kBACnBxS,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAKquB,gBACtBF,cAAenuB,EAAKouB,8BAGfgV,EAAOkQ,GACdtzC,EAAK0b,WAAW43B,GAAM,GACtBtzC,EAAK0b,WAAW43B,GAAIzvC,MAAM,GAC1B+T,EAAE/W,SAAQ,SAAUknB,EAAK3W,GACvBpR,EAAK0b,WAAW43B,GAAIzvC,KAAK7D,EAAKuN,OAAOoC,QAAQgM,QAAQoM,EAAI3W,gBAG7B,IAA5BpR,EAAK+tB,yBAAoD7mB,IAApBlH,EAAKuzC,aAE1CvzC,EAAK0b,WAAWhU,IAChB1H,EAAK0b,WAAWhU,GAAU5B,OAAS,IAAM8R,EAAE9R,QAEvCumB,SACFrsB,EAAK0b,WAAWhU,GAAY,QAC5B2rC,QAK0B,IAA5BrzC,EAAK+tB,yBAAmD7mB,IAApBlH,EAAKuzC,cACvCrf,QAA6BhtB,IAApBlH,EAAKuzC,WAA0B,KACrCvzC,EAAKiQ,sBAGVmjC,EAAKxrC,KAAKuG,IAAInO,EAAKiQ,WAAWvI,SAAUA,GACxCyE,EAAKvE,KAAKiT,IAAI7a,EAAKiQ,WAAWvI,SAAUA,GACnCT,EAAImsC,EAAIjnC,GAAMlF,EAAGA,GAAK,EACzBm8B,EAAOn8B,QAGTm8B,EAAO17B,GAGX2rC,KASFrzC,EAAKijC,aAAe,SAAUv7B,GAC5B1H,EAAKmC,cAAc,eAAgB,CACjCqxC,UAAWxzC,EAAK+f,WAAWrY,GAC3BnF,KAAMvC,EAAKsM,SAAS5E,GACpBA,SAAUA,IAEZ1H,EAAKgS,aAAatK,GAAUs9B,OAC5BhlC,EAAKgS,aAAatK,GAAUi4B,iBACrB3/B,EAAKgS,aAAatK,UAClB1H,EAAK+R,MAAMwS,MAAM7c,UACjB1H,EAAK+f,WAAWrY,GACvB1H,EAAKmC,cAAc,YAAa,CAC9BgL,WAAYnN,EAAKsC,MAAM6K,aAEzBnN,EAAKqC,QAAO,GACZrC,EAAK6I,MAAK,IASZ7I,EAAKgjC,WAAa,SAAUt7B,OAMxB8D,EALEioC,EAASzzC,EAAKsqB,KAAKiS,oBAAsB,GAC3CxvB,EAAyB/M,EAAKgN,4BAC9BC,EACEjN,EAAK+R,MAAMpC,QAAQhE,YAAc3L,EAAKsC,MAAM2K,mBAC9C/D,EAAIlJ,EAAK+R,MAAMwS,MAAM7c,IAAa1H,EAAKsC,MAAMoxC,eAE1C1zC,EAAK+f,WAAWrY,KACnB+rC,EAAOv8B,MAAQlX,EAAKE,WAAWgX,MAC/Bu8B,EAAOvuC,KAAOlF,EAAKE,WAAW8f,eAC1BhgB,EAAKE,WAAWgF,KAAO,OAASwC,OAChCR,EACJusC,EAAOnxC,MAAQmxC,EAAOnxC,OAAStC,EAAKsC,MACpCmxC,EAAO7tC,WAAa,CAClBuF,WAAYnL,EAAKsB,KACjB4b,SAAU,uBACVc,aAAc9U,EACd6U,YAAa/d,EAAKmI,MAAQ8E,EAC1B2D,OAAQ,CAAEzI,MAAOnI,EAAKmI,MAAQ8E,GAC9Bc,WAAYd,EACZa,UAAWf,EACXkR,aAAcje,EAAKsB,KAAKsE,WACxBA,WAAY5F,EAAKsB,KAAKsE,WACtBtD,MAAO,OACPC,KAAMvC,EAAKsM,SAAS5E,IAEtB8D,EAAWxL,EAAKigB,WAAWwzB,GAC3BzzC,EAAK+f,WAAWrY,GAAY8D,IAE9BA,EAAWxL,EAAK+f,WAAWrY,IAClB0D,SAAU,EACnBpL,EAAKmC,cAAc,aAAc,CAC/BqJ,SAAUA,EACVjJ,KAAMvC,EAAKsM,SAAS5E,GACpBA,SAAUA,IAEZ1H,EAAKgS,aAAatK,GAAY8D,EAC9BxL,EAAK+R,MAAMwS,MAAM7c,GAAYwB,EAC7BlJ,EAAKmC,cAAc,YAAa,CAAE+F,OAAQlI,EAAKsC,MAAM6K,aACrDnN,EAAKqC,QAAO,IASdrC,EAAKsvB,WAAa,SAAU5nB,MAClB1H,EAAKgS,aAAatK,UAEjB1H,EAAKijC,aAAav7B,GAE3B1H,EAAKgjC,WAAWt7B,IAWlB1H,EAAKu+B,gBAAkB,SAAUr5B,OAC3B+B,EACFvD,EAAI1D,EAAK4N,gBACN3G,EAAI,EAAGA,EAAIvD,EAAEoC,OAAQmB,GAAK,KACzBvD,EAAEuD,GAAG/B,OAASA,SACTxB,EAAEuD,IAYfjH,EAAKw0B,kBAAoB,SAAUtvB,EAAM+F,GAClCjL,EAAK4B,SAGV5B,EAAK+R,MAAMpC,QACA,eAATzK,GAAyB,EAAIlF,EAAKu+B,gBAAgBr5B,GAAMkM,OACtDxJ,KAAKiT,IAAI7a,EAAK0/B,wBAAwBx6B,GAAOlF,EAAKsC,MAAMqtB,gBACvD1kB,IACHjL,EAAKqC,SACLrC,EAAK6I,MAAK,MAad7I,EAAK0iC,cAAgB,SAAUt7B,EAAMM,WAElBR,IAAbQ,SAEA1H,EAAK6N,aAAa9I,QAAO,SAAU8F,UAC1BA,EAAElD,cAAgBP,GAAQyD,EAAEnD,WAAaA,KAC/C5B,OAAS,MAGZmB,EACF+D,EAAIhL,EAAK6N,aAAa/H,WACnBmB,EAAI,EAAGA,EAAI+D,EAAG/D,GAAK,KAEpBG,EAAKH,IAAMjH,EAAK6N,aAAa5G,GAAGA,GAChCG,EAAKW,IAAM/H,EAAK6N,aAAa5G,GAAGc,SAEzB,SAGJ,GAYT/H,EAAKqR,MAAQ,SACXwkB,EACAlT,EACAia,EACA+W,OAEIh3B,EACF9R,EAAI7K,EAAK4N,YAAY7I,QAAO,SAAUgjB,UAC7BA,EAAI7iB,OAAS2wB,SAGtB71B,EAAKmC,cAAc,mBAAoB,CACrC+C,KAAM2wB,EACNlT,UAAWA,MAKf3iB,EAAKogB,QAAUyV,EACf71B,EAAK4gB,eAAiB+B,EACjB3iB,EAAKsM,UAAqC,IAAzBtM,EAAKsM,SAASxG,YAGnB,IAAb+E,EAAE/E,aACE,IAAIlD,MAAM,sCAElB+Z,EAAIigB,GAAgB/xB,EAAE,GAAG+oC,QAAU5zC,EAAK+8B,QAAQlyB,EAAE,GAAG9E,aAC7BmB,IAAd2D,EAAE,GAAG9E,MACbgb,QAAQC,KACN,qDACAnW,EAAE,GAAG9E,MAGT/F,EAAK8jB,UAAU6Y,IACb9G,EACAlT,EACa,mBAANhG,EAAmBA,EAAI3c,EAAK+8B,QAAQx5B,QAE7CvD,EAAK++B,UACL/+B,EAAKmC,cAAc,aAAc,CAC/B+C,KAAM2wB,EACNlT,UAAWA,IAGTgxB,GAGJ3zC,EAAKkwB,mBAEPlwB,EAAK+sB,SAAW,SAAUpqB,WACpBA,EAAEsE,EAAI,GAAKtE,EAAEsE,EAAIjH,EAAKmI,OAASxF,EAAEoF,EAAI,GAAKpF,EAAEoF,EAAI/H,EAAKkI,SAa3DlI,EAAK8xB,cAAgB,SAAU6gB,EAASC,OAClCiB,EAAM,GACV7zC,EAAK0b,WAAW7a,SAAQ,SAAUoc,EAAKvV,GACrCmsC,EAAInsC,EAAWkrC,GAAW,GAC1B31B,EAAIpc,SAAQ,SAAU+0B,GACpBie,EAAInsC,EAAWkrC,GAAS/uC,KAAK+xB,EAAW+c,SAG5C3yC,EAAK0b,WAAam4B,GAWpB7zC,EAAKuJ,OAAS,SAAUsqC,EAAK5sC,EAAGc,OAI5B+rC,EAHE7lB,EAAejuB,EAAKkuB,kBACtB6lB,EAAgB/zC,EAAKk2B,mBACrB8d,EAAkBH,EAAI/tC,OAEtBmuC,GAAgBhH,EAAAA,EAChBiH,EAAQjH,EAAAA,EACRkH,EAAKpsC,EAAI,EAEX8rC,EAAIhzC,SAAQ,SAAUoc,EAAKvV,GACrBA,IAAassC,GAGE,IAAf/2B,EAAInX,SAGRouC,EAAQtsC,KAAKuG,IAAInO,EAAKm2B,wBAAwBlvB,GAAIitC,GAClDD,EAAersC,KAAKiT,IAAIo5B,EAAch3B,EAAInX,QAC1CmX,EAAIpc,SAAQ,SAAU+0B,GAEpBA,EAAW51B,EAAKm2B,wBAAwBP,GACnCme,EAAcne,KAId51B,EAAKuC,KAAKmF,KACb1H,EAAKuC,KAAKmF,GAAY,IAGxB1H,EAAKuC,KAAKmF,GAAUqsC,EAAcne,GAAU1wB,MAAQ,aAIxD2uC,EAAIhzC,SAAQ,SAAUoc,EAAK7L,OACrBgjC,EACJD,GAAM,EACNL,EAAK9zC,EAAKm2B,wBAAwBlvB,GAClCgW,EAAIpc,SAAQ,SAAU+0B,EAAUye,GAC9Bze,EAAW51B,EAAKm2B,wBAAwBP,GACpCye,EAAO,IAGTP,GAAMle,EAAWwe,GAEnBA,EAAkBxe,GAEF,IAAdA,IACCme,EAAcD,KACdC,EAAcne,IAEf51B,EAAKuC,KAAKuD,OAAS,EAAIquC,GACvBA,EAAK,IAKFn0C,EAAKuC,KAAK4xC,KACbn0C,EAAKuC,KAAK4xC,GAAM,IAGlBn0C,EAAKuC,KAAK4xC,GAAIJ,EAAcD,GAAI5uC,MAC9B+oB,EAAa7c,GAAO2iC,EAAcne,GAAU1wB,cAYpDlF,EAAK4iC,gBAAkB,SAAUj7B,UAE7B3H,EAAK6N,aAAa9I,QAAO,SAAU8F,UAC1BA,EAAElD,cAAgBA,KACxB7B,OAAS,GAWhB9F,EAAK2iC,aAAe,SAAUj7B,UAE1B1H,EAAK6N,aAAa9I,QAAO,SAAU8F,UAC1BA,EAAEnD,WAAaA,KACrB5B,OAAS,GAYhB9F,EAAKoiC,sBAAwB,SAAUn7B,EAAGc,UACjC/H,EAAK6N,aAAa9I,QAAO,SAAU8F,UACjCA,EAAElD,cAAgBV,GAAK4D,EAAEnD,WAAaK,KAC5C,IAWL/H,EAAK0sB,UAAY,SAAUzlB,EAAGc,EAAGusC,YACtBC,EAAUC,UAEfA,EAAQvtC,EAAIutC,EAAQrsC,MAA2C,GAAnCnI,EAAKE,WAAWu0C,iBAC1CxtC,GACFutC,EAAQvtC,EAAIutC,EAAQrsC,MAA2C,GAAnCnI,EAAKE,WAAWu0C,iBAAyBxtC,EAE9D,IAGPutC,EAAQvtC,EAAuC,GAAnCjH,EAAKE,WAAWu0C,iBAAyBxtC,GACrDutC,EAAQvtC,EAAuC,GAAnCjH,EAAKE,WAAWu0C,iBAAyBxtC,EAE9C,IAGPutC,EAAQzsC,EAAIysC,EAAQtsC,OAA4C,GAAnClI,EAAKE,WAAWu0C,iBAC3C1sC,GACFysC,EAAQzsC,EAAIysC,EAAQtsC,OAA4C,GAAnClI,EAAKE,WAAWu0C,iBAAyB1sC,EAE/D,IAGPysC,EAAQzsC,EAAuC,GAAnC/H,EAAKE,WAAWu0C,iBAAyB1sC,GACrDysC,EAAQzsC,EAAuC,GAAnC/H,EAAKE,WAAWu0C,iBAAyB1sC,EAE9C,cAGN/H,EAAK6N,kBAGNmhC,EAGFtrC,EAEAgxC,EAGAttC,EACAotC,EARAG,EAAML,EAAsBt0C,EAAKE,WAAW00C,gBAAkB,EAC9DC,EAAkD,SAAvC70C,EAAKE,WAAW40C,mBAE3B9pC,EAAIhL,EAAK6N,aAAa/H,OAEtBivC,EAAkBF,EAAW70C,EAAKgiC,WAAa,YAC/CgT,EAAkBH,EAAW70C,EAAKgiC,WAAa,eAG5ChiC,EAAK6N,cAAiB7N,EAAK6N,aAAa/H,WAG7C9F,EAAK0Z,UAAW,IACV3R,EAAI/H,EAAKkI,QAAUH,EAAI,GAAKd,EAAIjH,EAAKmI,OAASlB,EAAI,UACtDjH,EAAK0Z,UAAW,EACT,CACLC,YAAa,UACblD,QAAS,eAGR/S,EAAI,EAAGA,EAAIsH,EAAGtH,GAAK,KAGtB8wC,EAAU,CACRvtC,GAHFG,EAAOpH,EAAK6N,aAAanK,IAGfuD,EACRc,EAAGX,EAAKW,EACRG,OAAQd,EAAKc,OACbC,MAAOf,EAAKe,OAGZmsC,GACA,gCAAgChxC,KAAK8D,EAAK9E,SAE1CkyC,EAAQvtC,GAAK0tC,EACbH,EAAQzsC,GAAK4sC,EACbH,EAAQtsC,QAAUysC,EAClBH,EAAQrsC,OAASwsC,GAGjBH,EAAQvtC,EAAIjH,EAAKsC,MAAMkM,gBAAkBvH,GACzCutC,EAAQvtC,EAAIutC,EAAQrsC,MAAQnI,EAAKsC,MAAMkM,gBAAkBvH,GACzDutC,EAAQzsC,EAAI/H,EAAKsC,MAAMkM,gBAAkBzG,GACzCysC,EAAQzsC,EAAIysC,EAAQtsC,OAASlI,EAAKsC,MAAMkM,gBAAkBzG,EAC1D,IACI,oBAAoBzE,KAAK8D,EAAK9E,cAChC8E,EAAKuS,YAAcvS,EAAK9E,MACxB8E,EAAKqP,QAAU,aACRrP,KAEL,uBAAuB9D,KAAK8D,EAAK9E,cACnC8E,EAAKuS,YAAcvS,EAAK9E,MACxB8E,EAAKqP,QAAU,aACRrP,KAEL,oBAAoB9D,KAAK8D,EAAK9E,cAChC8E,EAAKuS,YAAcvS,EAAK9E,MACxB8E,EAAKqP,QAAU,YACRrP,KAEL,4BAA4B9D,KAAK8D,EAAK9E,cACxC8E,EAAKuS,YAAc,sBACnBvS,EAAKqP,QAAU,sBACfrP,EAAK8jC,aAAc,EACnB9jC,EAAK6tC,qBAAsB,EACvBltC,EAAI/H,EAAKqO,UAAU2c,IAAI1jB,EAAES,EAAI/H,EAAKqO,UAAU8H,iBAC9C/O,EAAKuS,YAAc,yBACnBvS,EAAKqP,QAAU,0BACN1O,EAAI/H,EAAKqO,UAAU2c,IAAI1jB,EAAES,IAClCX,EAAKuS,YAAc,sBACnBvS,EAAKqP,QAAU,uBAEjBzW,EAAKstB,OAAS,UACPlmB,KAEL,8BAA8B9D,KAAK8D,EAAK9E,cAC1C8E,EAAKuS,YAAc,wBACnBvS,EAAKqP,QAAU,wBACfrP,EAAK8jC,aAAc,EACnB9jC,EAAK8tC,uBAAwB,EACzBjuC,EAAIjH,EAAKqO,UAAU2c,IAAI9hB,EAAEjC,EAAIjH,EAAKqO,UAAU0H,gBAC9C3O,EAAKuS,YAAc,0BACnBvS,EAAKqP,QAAU,2BACNxP,EAAIjH,EAAKqO,UAAU2c,IAAI9hB,EAAEjC,IAClCG,EAAKuS,YAAc,yBACnBvS,EAAKqP,QAAU,0BAEjBzW,EAAKstB,OAAS,UACPlmB,KAET4nC,EAASuF,EAAUC,GAEnBE,EACEG,GACAztC,EAAKoU,kBACqC,IAA1CpU,EAAKoU,gBAAgBG,QAAQqzB,IAEG,IAAhC,CAAC,IAAK,KAAKrzB,QAAQqzB,KAClBhvC,EAAKE,WAAWi1C,mBAAqBT,KACpC10C,EAAKE,WAAWk1C,2BAA6BhuC,EAAKmX,WACjDnX,EAAKmX,UACNm2B,KACA10C,EAAKE,WAAWm1C,uBACfjuC,EAAKqU,aAAerU,EAAK2U,YACxB3U,EAAKqU,cAAerU,EAAK2U,UAC7B,KAEG3U,EAAK4U,gBACJ5U,EAAK2U,UACJ/b,EAAKE,WAAWk1C,2BAA6BhuC,EAAKmX,WAC1C,MAAXywB,SAEA5nC,EAAKqP,QAAU,YACfrP,EAAKuS,YAAc,YACZvS,MAEHA,EAAK4U,iBAAkB5U,EAAK2U,UAAa24B,SAC7CttC,EAAKqP,QAAUs+B,EACf3tC,EAAKuS,YAAcq1B,EAAS,QACrB5nC,MAIuB,IAAhC,CAAC,IAAK,KAAKuU,QAAQqzB,IACnB5nC,EAAKM,UAAY,IAChB1H,EAAKE,WAAWo1C,gBAAkBZ,KACjC10C,EAAKE,WAAWq1C,wBAA0BnuC,EAAKmX,WAC9CnX,EAAKmX,UACNm2B,KACDttC,EAAK4U,eACN,KAEG5U,EAAKqU,aACJrU,EAAK2U,UACJ/b,EAAKE,WAAWq1C,wBAA0BnuC,EAAKmX,WACvC,MAAXywB,SAEA5nC,EAAKqP,QAAU,YACfrP,EAAKuS,YAAc,YACZvS,MAEHA,EAAKqU,cAAerU,EAAK2U,UAAa24B,SAC1CttC,EAAKqP,QAAUu+B,EACf5tC,EAAKuS,YAAcq1B,EAAS,QACrB5nC,QAGQ,qBAAfA,EAAK9E,OACP8E,EAAKqP,QAAU,OACfrP,EAAKuS,YAAc,iBACZvS,GAEU,kBAAfA,EAAK9E,OAELtC,EAAKE,WAAWs1C,iBACbpuC,EAAKW,EAAI/H,EAAKsC,MAAMkM,iBACrBzG,IACD/H,EAAKE,WAAWkxB,oBAEjBhqB,EAAKuS,YAAc,OACnBvS,EAAKqP,QAAU,SAEfrP,EAAKqP,QAAUzW,EAAKgiC,WACpB56B,EAAKuS,YAAc,eAEdvS,GAELA,EAAKqV,QACPzc,EAAK0Z,UAAW,EAChBtS,EAAKuS,YAAc,YACnBvS,EAAKqP,QAAU,YACRrP,GAEU,cAAfA,EAAK9E,OACPtC,EAAK0Z,UAAW,EAChBtS,EAAKuS,YAAc,OACnBvS,EAAKqP,QAAU,OACRrP,IAETA,EAAKuS,YAAc,OACnBvS,EAAKqP,QAAU,OACRrP,UAGXpH,EAAK0Z,UAAW,EAChB1Z,EAAKstB,OAAS,UACP,CACL3T,YAAa,aACblD,QAAS,aACTnU,MAAO,aACP2oC,cAAc,MAUlBjrC,EAAK6tB,mBAAqB,eACpB/mB,EAAM,CAAEG,EAAGgmC,EAAAA,EAAUllC,EAAGklC,EAAAA,GAC1BlmC,EAAO,CAAEE,GAAIgmC,EAAAA,EAAUllC,GAAIklC,EAAAA,UAC7BjtC,EAAK0b,WAAW7a,SAAQ,SAAUoc,EAAKvV,OACjC+tC,EAAQC,EACZ5uC,EAAIiB,EAAIL,EAAWZ,EAAIiB,EAAIL,EAAWZ,EAAIiB,EAC1ChB,EAAKgB,EAAIL,EAAWX,EAAKgB,EAAIL,EAAWX,EAAKgB,EAC7C0tC,EAAS7tC,KAAKiT,IAAIH,MAAM,KAAMuC,GAC9By4B,EAAS9tC,KAAKuG,IAAIuM,MAAM,KAAMuC,GAC9BnW,EAAIG,EAAIyuC,EAAS5uC,EAAIG,EAAIyuC,EAAS5uC,EAAIG,EACtCF,EAAKE,EAAIwuC,EAAS1uC,EAAKE,EAAIwuC,EAAS1uC,EAAKE,KAEpC,CACLsjB,IAAKzjB,EAAIiB,EACTyiB,KAAM1jB,EAAIG,EACV0mB,OAAQ5mB,EAAKgB,EACb6lB,MAAO7mB,EAAKE,IAWhBjH,EAAK8iC,kBAAoB,SAAUz2B,UACjCA,EAAIA,GAAKrM,EAAK0R,aACPhJ,OAAOC,KAAK0D,EAAE,IAAM,KAAO,KAAMkW,KAAI,SAC1CzI,EACA1I,OAEIrL,EAAO/F,EAAKg/B,qBAAqBllB,EAAKzN,GACxC3I,EAAI,CACFwB,KAAM4U,EACN5I,MAAO/N,MAAMD,SAAS4W,EAAK,KACvBA,EACA9Z,EAAK+jC,eAAejqB,GAAK9Y,cAC7BoQ,MAAOA,EACPzJ,YAAayJ,EACbrL,KAAMA,EACNhB,OAAQ/E,EAAK+E,OAAOgB,WAGtB/F,EAAKkgC,gBACLlgC,EAAKkgC,eAAezC,iBACuBv2B,IAA3ClH,EAAKkgC,eAAezC,WAAW/5B,EAAEwB,QAEjCxB,EAAEuN,QAAUjR,EAAKkgC,eAAezC,WAAW/5B,EAAEwB,OAExCxB,MAWX1D,EAAKqiC,eAAiB,WACpBriC,EAAKk9B,QAAU,IASjBl9B,EAAKuuB,WAAa,SAAU6M,EAAQ/O,GAClCrsB,EAAKquB,gBAAkB+M,GAAUp7B,EAAKquB,oBAClCtR,EACF9V,EACAc,EACA6P,EAAI5X,EAAK4N,eACNye,IACHrsB,EAAK0b,WAAa,IAGlB1b,EAAKquB,gBAAgB9D,KAAO,GAC5BvqB,EAAKquB,gBAAgBV,OAAS3tB,EAAKsM,SAASxG,QAC5C9F,EAAKquB,gBAAgB7D,MAAQ,GAC7BxqB,EAAKquB,gBAAgBT,MAAQhW,EAAE9R,aAEzB,IAAIlD,MAAM,iCAGhBqE,EAAIjH,EAAKquB,gBAAgB9D,IACzBtjB,GAAKjH,EAAKquB,gBAAgBV,OAC1B1mB,GAAK,MAELjH,EAAK0b,WAAWzU,GAAK,GAEnBc,EAAI/H,EAAKquB,gBAAgB7D,KACzBziB,GAAK/H,EAAKquB,gBAAgBT,MAC1B7lB,GAAK,GAEkC,IAAnC/H,EAAK0b,WAAWzU,GAAG0U,QAAQ5T,IAC7B/H,EAAK0b,WAAWzU,GAAGpD,KAAKkE,GAI9BgV,EAAK,CACHrB,WAAY1b,EAAK0b,WACjB2S,gBAAiBruB,EAAKquB,gBACtBF,cAAenuB,EAAKouB,oBAEtB1lB,OAAOkc,eAAe7H,EAAI,eAAgB,CACxC+H,IAAK,kBACI9kB,EAAKkuB,qBAGhBluB,EAAKmC,cAAc,mBAAoB4a,IAUzC/c,EAAK0/B,wBAA0B,SAAUx6B,OACnCkH,GAAK6gC,EAAAA,KACI,eAAT/nC,SACFlF,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAMqzC,kBAEzB31C,EAAKqI,IAAI8Z,aAELniB,EAAKsM,SAASxG,QAAU9F,EAAKE,WAAWsP,WAAa,EAAI,IACzD/H,YACFU,MACFnI,EAAKsC,MAAMszC,gBACX51C,EAAKsC,MAAMuzC,0BACX71C,EAAKsC,MAAMwzC,0BACX91C,EAAKsC,MAAMyzC,0BACV/1C,EAAKE,WAAW8e,KACbhf,EAAKsC,MAAMkd,eACXxf,EAAKsC,MAAMgd,oBACXtf,EAAKsC,MAAM8c,qBACX,OAGJ42B,EAAY,YAChBh2C,EAAK4N,YAAY/M,SAAQ,SAAUknB,MAC7BA,EAAI7iB,OAASA,GAGjBlF,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAM2zC,yBACvBlrC,EACF/K,EAAKqI,IAAI8Z,YAAY4F,EAAI7W,OAAS6W,EAAI7iB,MAAMiD,MAC5CnI,EAAKsC,MAAM4zC,uBACXl2C,EAAKsC,MAAM6zC,sBACb/pC,EAAIrB,EAAIqB,EAAIrB,EAAIqB,EAChB4pC,EAAYh2C,EAAK4c,WAAWmL,EAAIhiB,UAElC/F,EAAKsM,SAASzL,SAAQ,SAAUoc,OAC1BpT,EAAOoT,EAAI/X,GACX8wC,IACFnsC,EAAOmsC,EAAU,CAAE5uC,KAAM,CAAE4V,MAAOnT,MAEpC7J,EAAKqI,IAAI+O,KAAOpX,EAAKsC,MAAM8zC,aACvBrrC,EACF/K,EAAKqI,IAAI8Z,YAAYtY,GAAM1B,MAC3BnI,EAAKsC,MAAM+zC,iBACXr2C,EAAKsC,MAAMgrC,gBACXttC,EAAKsC,MAAMg0C,sBACblqC,EAAIrB,EAAIqB,EAAIrB,EAAIqB,KAEXA,GAQTpM,EAAKwQ,eAAiB,kBACbxQ,EAAKk2B,mBAAmB3e,QAAO,SAAUg/B,EAAO3lC,UAC9C2lC,EAAQrzC,SAAS0N,EAAOzI,OAASnI,EAAKsC,MAAM6O,UAAW,MAC7D,IASLnR,EAAKw2C,aAAe,SAAU9uC,UACpB1H,EAAK+R,MAAMvE,KAAK9F,IAAa1H,EAAKsC,MAAM6K,YAAcnN,EAAKgY,OASrEhY,EAAK6X,eAAiB,SAAUlQ,UAE3B3H,EAAK+R,MAAMpC,QAAQhI,IAClB3H,EAAK4N,YAAYjG,GAAaQ,OAC9BnI,EAAKsC,MAAM6O,WAAanR,EAAKgY,OAGnChY,EAAK4c,WAAWrZ,OAAS,SAA6BZ,eAC5BuE,IAAjBvE,EAAEyE,KAAK4V,MAAsBra,EAAEyE,KAAK4V,MAAQ,IAErDhd,EAAK4c,WAAW/K,cAAgB7R,EAAK4c,WAAWrZ,OAChDvD,EAAK4c,WAAW65B,WAAaz2C,EAAK4c,WAAWrZ,OAC7CvD,EAAK4c,WAAW7Z,OAAS/C,EAAK4c,WAAWrZ,OACzCvD,EAAK4c,WAAW85B,IAAM12C,EAAK4c,WAAWrZ,OACtCvD,EAAK4c,WAAWhU,KAAO5I,EAAK4c,WAAWrZ,OACvCvD,EAAK+8B,QAAQx5B,OAAS,SAAUsyB,EAAYlT,OACtCg0B,EAAoB,QAAdh0B,SACH,SAAUnL,EAAGnO,OACZutC,EAASp/B,EAAEqe,IAAe,GAC1BghB,EAASxtC,EAAEwsB,IAAe,UAC5B8gB,EACGC,EAAOE,cAGLF,EAAOE,cAAcD,GAFnB,EAINA,EAAOC,cAGLD,EAAOC,cAAcF,GAFnB,IAKb52C,EAAK+8B,QAAQh6B,OAAS,SAAU8yB,EAAYlT,OACtCg0B,EAAoB,QAAdh0B,SACH,SAAUnL,EAAGnO,UACdstC,EACKn/B,EAAEqe,GAAcxsB,EAAEwsB,GAEpBxsB,EAAEwsB,GAAcre,EAAEqe,KAG7B71B,EAAK+8B,QAAQga,KAAO,SAAUlhB,EAAYlT,OACpCg0B,EAAoB,QAAdh0B,SACH,SAAUnL,EAAGnO,UACdstC,EAEA,IAAIK,KAAKx/B,EAAEqe,IAAaohB,UAAY,IAAID,KAAK3tC,EAAEwsB,IAAaohB,UAI9D,IAAID,KAAK3tC,EAAEwsB,IAAaohB,UAAY,IAAID,KAAKx/B,EAAEqe,IAAaohB,YC32CpE,IAAIC,aAAe72C,YAEf82C,QAAU,CACZl3C,SACA4I,KACAyf,OACA9O,MACAlY,KACAyqB,YACAqrB,IACAC,eAGF,SAASC,KAAKhtB,MACZA,KAAOA,MAAQ,OACXtqB,KAAO,UACXA,KAAKuB,iBAAiC2F,IAAnBojB,KAAKjqB,UACxBL,KAAKkL,YACHof,KAAK1kB,YACL,8BAA8BtC,KAAKgnB,KAAK1kB,WAAWsX,UACjDld,KAAKkL,YACPlL,KAAKsB,KAAO,GAEZtB,KAAKsB,KAAOtB,KAAKuB,YACbg2C,KAAK,kDACLpxC,SAAS0gC,cAAc,UAE7B7mC,KAAKsqB,KAAOA,KACZtqB,KAAKsB,KAAKgpB,KAAOA,KACjBtqB,KAAKoB,oBAAsB81C,aAAa91C,oBACxCpB,KAAKiB,kBAAoBi2C,aAAaj2C,kBACtCjB,KAAKM,oBAAsB42C,aAAa52C,oBACxCN,KAAKigB,WAAa,SAAcqK,UAC9BA,EAAKjqB,WAAY,EACV,IAAIi3C,KAAKhtB,IAGlB6sB,QAAQt2C,SAAQ,SAAU6jB,GACxBA,EAAO1kB,SAGLA,KAAKkL,aACPlL,KAAKqgC,WAAa/V,KAAK1kB,WAAWy6B,WAClCrgC,KAAK4F,WAAa0kB,KAAK1kB,aAEvB5F,KAAKqgC,WAAargC,KAAKsB,KAAKk2C,aAAa,CAAEztC,KAAM,SACjD/J,KAAK4F,WAAa5F,KAAKqgC,YAEzBrgC,KAAKohC,OACEphC,KAAKsB,KA8BC,SAASm2C,eAAentB,GACrCA,EAAOA,GAAQ,OACX5mB,EACFg0C,EAAQ,CACN,QACA,aACA,UACA,UACA,qBACA,qBACA,OACA,iBAEAj2C,OAAOk2C,gBACTj0C,EAAIyC,SAAS0gC,cAAc,mBAC3Bn+B,OAAOC,KAAK2hB,GAAMzpB,SAAQ,SAAU+2C,GAEnB,SAAXA,GAGW,eAAXA,KAI2B,IAA3BF,EAAM/7B,QAAQi8B,GAkBlBl0C,EAAExD,WAAW03C,GAAUttB,EAAKstB,GAjB1BF,EAAM72C,SAAQ,SAAUg3C,QACH3wC,IAAfojB,EAAKutB,IAAuBA,IAASD,KAGqB,IAA1D,CAAC,aAAc,UAAW,WAAWj8B,QAAQi8B,GACrB,WAAtBzX,QAAO7V,EAAKutB,KAAqC,OAAfvtB,EAAKutB,IACzCnvC,OAAOC,KAAK2hB,EAAKutB,IAAOh3C,SAAQ,SAAUi3C,GACxCp0C,EAAEm0C,GAAMC,GAAQxtB,EAAKutB,GAAMC,MAI/Bp0C,EAAEm0C,GAAQvtB,EAAKutB,WAQnBvtB,EAAK/nB,OACPmB,EAAEnB,KAAO+nB,EAAK/nB,MAGZ+nB,EAAK1kB,YACP0kB,EAAK1kB,WAAWxB,YAAYV,GAEvBA,IAET4mB,EAAKjqB,WAAY,EACjBqD,EAAI,IAAI4zC,KAAKhtB,GACTA,EAAK1kB,YAAc0kB,EAAK1kB,WAAWxB,aACrCkmB,EAAK1kB,WAAWxB,YAAYV,GAEvBA,GAtFLjC,OAAOs2C,cACTT,KAAK12C,UAAY8H,OAAOwc,OAAOzjB,OAAOs2C,YAAYn3C,YAGhDa,OAAOk2C,iBACTL,KAAKU,mBAAqBd,aAAazzC,0BACvC6zC,KAAK12C,UAAUkD,qBAAuBozC,aAAapzC,qBACnDwzC,KAAK12C,UAAU2D,yBACb2yC,aAAa3yC,yBACf+yC,KAAK12C,UAAUoD,kBAAoBkzC,aAAalzC,kBAChDszC,KAAK12C,UAAU0D,gBAAkB4yC,aAAa5yC,gBAC9C7C,OAAOk2C,eAAeM,OAAO,kBAAmBX,OAKhD71C,SACCA,OAAOg2C,gBACPh2C,OAAOy2C"}
1
+ {"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/dom.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', '&nbsp;&nbsp;&nbsp;'],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '&#x25BA;'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '&#x25BC;'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['frozenMarkerHoverColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos = cell.paddingLeft + cell.treeArrowWidth + cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos = cell.paddingLeft + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n cellHeight = self.style.cellHeight;\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n drawText(cell);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n const hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue = self.hasActiveFilters()\n ? filteredRowNumber\n : rowIndex + 1;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 0;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n };\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n var selectedColumns = self.selections[0];\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n }\n function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nexport {\n isSupportedHtml,\n sanitizeElementData,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n};\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n ch = self.style.cellHeight,\n s = self.getSchema();\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n (self.style.height !== 'auto' &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width = self.width - rowHeaderCellWidth;\n self.scrollBox.height = self.height - columnHeaderCellHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height: columnHeaderCellHeight + dataHeight + cellBorder + 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder,\n };\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n self.scrollCache.x = [];\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n column = s[self.orders.columns[columnIndex]];\n if (column.hidden) {\n self.scrollCache.x[columnIndex] = accumulator;\n return accumulator;\n }\n var va =\n accumulator + self.getColumnWidth(self.orders.columns[columnIndex]);\n self.scrollCache.x[columnIndex] = va;\n return va;\n }, 0) || 0;\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top = columnHeaderCellHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d;\n n.width =\n self.width - self.style.scrollBarWidth - rowHeaderCellWidth - d - m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height - columnHeaderCellHeight - self.style.scrollBarWidth - d - m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n };\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n }\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n self.selectRow(cell.rowIndex, ctrl, null, true);\n } else if (self.attributes.selectionMode !== 'row') {\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !== -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) === -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n const event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n self.selections = [];\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else if (dragBounds.top !== -1) {\n self.selectArea(sBounds, true);\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)\n self.isMultiRowsSelected = true;\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n pos.x > 0 &&\n pos.x - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n pos.y - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n pos.y > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n self.scrollBox.scrollLeft += x;\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function () {\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n document.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.draggingItem.header.index)\n ) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var seletedColumnIndices = [];\n if (self.selections[0]) {\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n for (var i = 0; i < sortColumnIndices.length; i++) {\n seletedColumnIndices.push(tIndex + i);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = seletedColumnIndices;\n });\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n self.scrollBox.box.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode);\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\n if (!(self.dragMode == 'row-reorder' && self.isMultiRowsSelected))\n self.selections = [];\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n document.addEventListener('mousemove', self.scrollGrid, false);\n document.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.currentCell.header.index)\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n var isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey) {\n const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) {\n self.selections = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n self.fitColumnToValues(self.currentCell.header.name);\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (['cell', 'activeCell'].indexOf(self.currentCell.style) !== -1) {\n self.beginEditAt(self.currentCell.columnIndex, self.currentCell.rowIndex);\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(pasteValue, pasteType, startCell[0], startCell[1]);\n\n self.draw();\n });\n };\n self.cut = function (e) {\n self.copy(e);\n const schema = self.getSchema();\n\n var affectedCells = [];\n for (const [rowIndex, row] of self.selections.entries()) {\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (const columnIndex of row) {\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const colName = schema[boundColumnIndex].name;\n\n self.viewData[rowIndex][colName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n if (self.dispatchEvent('cut', { NativeEvent: e, cells: affectedCells })) {\n return;\n }\n };\n self.copy = function (e) {\n if (self.dispatchEvent('copy', { NativeEvent: e })) {\n return;\n }\n if (!self.hasFocus || !e.clipboardData) {\n return;\n }\n var t = '',\n d = '',\n textRows = [],\n sData = self.getSelectedData(),\n s = self.getSchema(),\n sSorted = [],\n firstRowKeys,\n isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n function htmlSafe(v) {\n if (typeof v === 'number') return v;\n return v.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n s.forEach(function (column, columnIndex) {\n sSorted.push(s[self.orders.columns[columnIndex]]);\n });\n if (sData.length > 0) {\n sData.forEach((row) => {\n if (!row) return;\n var rowKeys = Object.keys(row);\n var textRow = [];\n if (!firstRowKeys) firstRowKeys = Object.keys(row);\n if (isNeat && rowKeys.length !== firstRowKeys.length) isNeat = false;\n sSorted.forEach(function (column, columnIndex) {\n if (rowKeys.indexOf(String(column.name)) < 0) {\n if (firstRowKeys.indexOf(String(column.name)) < 0) {\n return;\n } else if (isNeat) {\n isNeat = false;\n }\n }\n textRow.push(row[column.name] || '');\n });\n textRows.push(textRow);\n });\n if (isNeat) {\n t = textRows.map((row) => row.join('\\t')).join('\\n');\n /**\n * The html content copied by Excel has not header\n */\n d += '<table>';\n d += textRows\n .map(\n (row) =>\n '<tr>' +\n row.map((value) => '<td>' + htmlSafe(value) + '</td>').join('') +\n '</tr>',\n )\n .join('');\n d += '</table>';\n } else {\n t = textRows.map((row) => row.join('')).join('');\n d = t;\n }\n if (t) {\n e.clipboardData.setData('text/html', d);\n e.clipboardData.setData('text/plain', t);\n e.clipboardData.setData('text/csv', t);\n e.clipboardData.setData('application/json', JSON.stringify(sData));\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n if (/vertical-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test(self.startingCell.style) &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.selections = [];\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle, 10);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n function addDefaultContextMenuItem(e) {\n var isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[e.cell.columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function () {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDiposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDiposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n document.addEventListener('mouseup', createDiposeEvent);\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n self.input.style.left =\n pos.left + cell.x + self.canvasOffsetLeft - s.left + 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n self.changes[y] = self.changes[y] || {};\n self.changes[y][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (y === self.viewData.length) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n document.body.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n if (\n self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n }).length === 0\n ) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n };\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = function (dontDraw) {\n self.selections = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if indices of columns next to the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isMultiColumnsSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isMultiColumnsSelected = function (columnIndex) {\n var multiColIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n var columnIndices = self.selections[rowIndex];\n if (\n !columnIndices ||\n columnIndices.length <= 1 ||\n columnIndices.indexOf(columnIndex) === -1\n ) {\n multiColIsSelected = false;\n } else if (columnIndices.length > 1) {\n if (columnIndices[0] != columnIndex) multiColIsSelected = false;\n else {\n for (var i = 0; i < columnIndices.length - 1; i++) {\n if (columnIndices[i] + 1 != columnIndices[i + 1]) {\n multiColIsSelected = false;\n break;\n }\n }\n }\n }\n });\n return multiColIsSelected;\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n self.sizes.columns[\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index\n ] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n var sel = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n });\n });\n self.selections = sel;\n };\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'row-resize';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'col-resize';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n cell.context = 'cell';\n cell.dragContext = 'column-reorder';\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} bounds A rect object representing the selected values.\n */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.headerCellPaddingRight +\n self.style.headerCellPaddingLeft;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","radiusRect","w","h","radius","r","b","beginPath","moveTo","lineTo","quadraticCurveTo","fillRect","strokeRect","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","stroke","strokeCircle","addBorderLine","c","pos","t","l","internal","isChildGrid","parentGrid","visible","checkScrollHeight","cx","cy","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","my","mx","xHover","yHover","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","cellHeight","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","getSchema","visibleCells","offsetTop","offsetLeft","fillStyle","gridBackgroundColor","ln","min","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","showNewRow","showRowHeaders","scrollIndexLeft","columns","drawCell","newRow","restore","drawRows","cl","activeCell","frozenColumn","selectionMode","lineWidth","activeCellOverlayBorderWidth","strokeStyle","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","hidden","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","selectedColumns","getColumnWidth","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","frozenColumnsWidth","s","getFrozenColumnsWidth","htmlImages","scale","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","row","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingLeft","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","cellHeightWithChildGrid","cellWidthWithChildGrid","tree","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","isSorting","orderings","showRowNumberGaps","previousRowNumber","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","includes","col","parseText","parseData","mimeType","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","ch","accumulator","column","va","setCanvasSize","args","top","left","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","draggingItem","dragItem","cursor","selecting","dragStart","dragStartObject","shiftKey","bottom","right","getSelectionBounds","ignoreNextClick","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","isMultiColumnsSelected","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","seletedColumnIndices","deleteCount","selectedRows","dragMove","stopDragMove","moveSelection","freezeMove","stopFreezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","mouseup","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","Number","isArrowKey","firstSelectedRowIndex","findIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","join","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","assign","colIndex","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","from","clipboardData","items","supportedMimeTypes","pasteableItems","itemToPaste","startCell","len","pasteType","getAsString","cut","copy","entries","firstRowKeys","textRows","sData","sSorted","isNeat","rowKeys","textRow","setData","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","rect","getBoundingClientRect","clientX","clientY","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","contextmenuEvent","touchContextMenuTimeMs","setInterval","touchEndEvents","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","refresh","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrab","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","findColumnScrollLeft","findRowScrollTop","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","find","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","contextMenuWindowMargin","innerWidth","clickIndex","Event","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","columnWidth","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","createDiposeEvent","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","cellPaddingLeft","ignoreScrollOffset","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","verticalAlign","marginLeft","padding","border","contextFilterInputBorder","borderRadius","contextFilterInputBorderRadius","fontWeight","fontFamily","contextFilterInputFontFamily","contextFilterInputFontSize","contextMenuBackground","contextMenuColor","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","contextMenuFontFamily","contextMenuFontSize","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","opacity","contextMenuOpacity","overflow","contextMenuHoverBackground","contextMenuHoverColor","display","boxSizing","outline","margin","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuItemMargin","contextMenuItemBorderRadius","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","maxWidth","contextMenuLabelMaxWidth","contextMenuCursor","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","offsetX","offsetY","targetX","targetY","sbh","multiColIsSelected","columnIndices","isColumnSelected","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","dontSetStorageData","sorter","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","headerCellPaddingRight","headerCellPaddingLeft","cellFont","cellPaddingRight","cellAutoResizePadding","total","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}